projen-cdktf-hybrid-construct 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,12 +12,16 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
12
12
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
13
13
  PERFORMANCE OF THIS SOFTWARE.
14
14
  ***************************************************************************** */
15
- /* global global, define, System, Reflect, Promise */
15
+ /* global global, define, Symbol, Reflect, Promise, SuppressedError */
16
16
  var __extends;
17
17
  var __assign;
18
18
  var __rest;
19
19
  var __decorate;
20
20
  var __param;
21
+ var __esDecorate;
22
+ var __runInitializers;
23
+ var __propKey;
24
+ var __setFunctionName;
21
25
  var __metadata;
22
26
  var __awaiter;
23
27
  var __generator;
@@ -38,6 +42,8 @@ var __classPrivateFieldGet;
38
42
  var __classPrivateFieldSet;
39
43
  var __classPrivateFieldIn;
40
44
  var __createBinding;
45
+ var __addDisposableResource;
46
+ var __disposeResources;
41
47
  (function (factory) {
42
48
  var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {};
43
49
  if (typeof define === "function" && define.amd) {
@@ -105,6 +111,51 @@ var __createBinding;
105
111
  return function (target, key) { decorator(target, key, paramIndex); }
106
112
  };
107
113
 
114
+ __esDecorate = function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
115
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
116
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
117
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
118
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
119
+ var _, done = false;
120
+ for (var i = decorators.length - 1; i >= 0; i--) {
121
+ var context = {};
122
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
123
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
124
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
125
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
126
+ if (kind === "accessor") {
127
+ if (result === void 0) continue;
128
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
129
+ if (_ = accept(result.get)) descriptor.get = _;
130
+ if (_ = accept(result.set)) descriptor.set = _;
131
+ if (_ = accept(result.init)) initializers.unshift(_);
132
+ }
133
+ else if (_ = accept(result)) {
134
+ if (kind === "field") initializers.unshift(_);
135
+ else descriptor[key] = _;
136
+ }
137
+ }
138
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
139
+ done = true;
140
+ };
141
+
142
+ __runInitializers = function (thisArg, initializers, value) {
143
+ var useValue = arguments.length > 2;
144
+ for (var i = 0; i < initializers.length; i++) {
145
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
146
+ }
147
+ return useValue ? value : void 0;
148
+ };
149
+
150
+ __propKey = function (x) {
151
+ return typeof x === "symbol" ? x : "".concat(x);
152
+ };
153
+
154
+ __setFunctionName = function (f, name, prefix) {
155
+ if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
156
+ return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
157
+ };
158
+
108
159
  __metadata = function (metadataKey, metadataValue) {
109
160
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
110
161
  };
@@ -125,7 +176,7 @@ var __createBinding;
125
176
  function verb(n) { return function (v) { return step([n, v]); }; }
126
177
  function step(op) {
127
178
  if (f) throw new TypeError("Generator is already executing.");
128
- while (_) try {
179
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
129
180
  if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
130
181
  if (y = 0, t) op = [op[0] & 2, t.value];
131
182
  switch (op[0]) {
@@ -237,7 +288,7 @@ var __createBinding;
237
288
  __asyncDelegator = function (o) {
238
289
  var i, p;
239
290
  return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
240
- function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
291
+ function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
241
292
  };
242
293
 
243
294
  __asyncValues = function (o) {
@@ -289,11 +340,62 @@ var __createBinding;
289
340
  return typeof state === "function" ? receiver === state : state.has(receiver);
290
341
  };
291
342
 
343
+ __addDisposableResource = function (env, value, async) {
344
+ if (value !== null && value !== void 0) {
345
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
346
+ var dispose;
347
+ if (async) {
348
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
349
+ dispose = value[Symbol.asyncDispose];
350
+ }
351
+ if (dispose === void 0) {
352
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
353
+ dispose = value[Symbol.dispose];
354
+ }
355
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
356
+ env.stack.push({ value: value, dispose: dispose, async: async });
357
+ }
358
+ else if (async) {
359
+ env.stack.push({ async: true });
360
+ }
361
+ return value;
362
+ };
363
+
364
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
365
+ var e = new Error(message);
366
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
367
+ };
368
+
369
+ __disposeResources = function (env) {
370
+ function fail(e) {
371
+ env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
372
+ env.hasError = true;
373
+ }
374
+ function next() {
375
+ while (env.stack.length) {
376
+ var rec = env.stack.pop();
377
+ try {
378
+ var result = rec.dispose && rec.dispose.call(rec.value);
379
+ if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
380
+ }
381
+ catch (e) {
382
+ fail(e);
383
+ }
384
+ }
385
+ if (env.hasError) throw env.error;
386
+ }
387
+ return next();
388
+ };
389
+
292
390
  exporter("__extends", __extends);
293
391
  exporter("__assign", __assign);
294
392
  exporter("__rest", __rest);
295
393
  exporter("__decorate", __decorate);
296
394
  exporter("__param", __param);
395
+ exporter("__esDecorate", __esDecorate);
396
+ exporter("__runInitializers", __runInitializers);
397
+ exporter("__propKey", __propKey);
398
+ exporter("__setFunctionName", __setFunctionName);
297
399
  exporter("__metadata", __metadata);
298
400
  exporter("__awaiter", __awaiter);
299
401
  exporter("__generator", __generator);
@@ -314,4 +416,6 @@ var __createBinding;
314
416
  exporter("__classPrivateFieldGet", __classPrivateFieldGet);
315
417
  exporter("__classPrivateFieldSet", __classPrivateFieldSet);
316
418
  exporter("__classPrivateFieldIn", __classPrivateFieldIn);
419
+ exporter("__addDisposableResource", __addDisposableResource);
420
+ exporter("__disposeResources", __disposeResources);
317
421
  });
package/package.json CHANGED
@@ -29,6 +29,8 @@
29
29
  "test:watch": "npx projen test:watch",
30
30
  "unbump": "npx projen unbump",
31
31
  "upgrade": "npx projen upgrade",
32
+ "upgrade:hybrid": "npx projen upgrade:hybrid",
33
+ "upgrade:terraform": "npx projen upgrade:terraform",
32
34
  "watch": "npx projen watch",
33
35
  "projen": "npx projen"
34
36
  },
@@ -42,34 +44,35 @@
42
44
  "@types/fs-extra": "^9.0.13",
43
45
  "@types/glob": "^7.2.0",
44
46
  "@types/jest": "^27",
45
- "@types/node": "^14",
47
+ "@types/node": "^16",
46
48
  "@typescript-eslint/eslint-plugin": "^5",
47
49
  "@typescript-eslint/parser": "^5",
50
+ "comment-json": "^4.2.3",
48
51
  "eslint": "^8",
49
- "eslint-config-prettier": "^8.5.0",
50
- "eslint-import-resolver-node": "^0.3.6",
52
+ "eslint-config-prettier": "^8.10.0",
53
+ "eslint-import-resolver-node": "^0.3.9",
51
54
  "eslint-import-resolver-typescript": "^2.7.1",
52
- "eslint-plugin-import": "^2.26.0",
55
+ "eslint-plugin-import": "^2.28.1",
53
56
  "eslint-plugin-prettier": "^4.2.1",
54
57
  "fs-extra": "^10.1.0",
55
58
  "glob": "^7.2.3",
56
59
  "jest": "^27",
57
- "jest-junit": "^13",
58
- "jsii": "^1.63.2",
59
- "jsii-diff": "^1.63.2",
60
- "jsii-docgen": "^7.0.63",
61
- "jsii-pacmak": "^1.63.2",
62
- "json-schema": "^0.4.0",
60
+ "jest-junit": "^15",
61
+ "jsii": "^5.1.0",
62
+ "jsii-diff": "^1.87.0",
63
+ "jsii-docgen": "^9.0.0",
64
+ "jsii-pacmak": "^1.87.0",
65
+ "jsii-rosetta": "^5.1.0",
63
66
  "npm-check-updates": "^16",
64
- "prettier": "^2.7.1",
65
- "projen": "0.63.25",
67
+ "prettier": "^2.8.8",
68
+ "projen": "0.72.18",
66
69
  "standard-version": "^9",
67
70
  "ts-jest": "^27",
68
71
  "ts-node": "10.9.1",
69
- "typescript": "^4.7.4"
72
+ "typescript": "^4.9.5"
70
73
  },
71
74
  "peerDependencies": {
72
- "projen": ">= 0.63.25"
75
+ "projen": ">= 0.72.18"
73
76
  },
74
77
  "dependencies": {
75
78
  "change-case": "^4.1.2"
@@ -79,7 +82,7 @@
79
82
  ],
80
83
  "main": "lib/index.js",
81
84
  "license": "MPL-2.0",
82
- "version": "0.3.2",
85
+ "version": "0.3.4",
83
86
  "jest": {
84
87
  "testMatch": [
85
88
  "<rootDir>/src/**/__tests__/**/*.ts?(x)",
@@ -130,10 +133,5 @@
130
133
  "rootDir": "src"
131
134
  }
132
135
  },
133
- "resolutions": {
134
- "@types/responselike": "1.0.0",
135
- "got": "12.3.1",
136
- "@types/prettier": "2.6.0"
137
- },
138
- "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
136
+ "//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."
139
137
  }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Copyright (c) HashiCorp, Inc.
3
+ * SPDX-License-Identifier: MPL-2.0
4
+ */
5
+
6
+ import { javascript } from "projen";
7
+ import { JobPermission } from "projen/lib/github/workflows-model";
8
+
9
+ /**
10
+ * Approves PRs with the "auto-approve" label
11
+ */
12
+ export class AutoApprove {
13
+ constructor(project: javascript.NodeProject) {
14
+ const workflow = project.github?.addWorkflow("auto-approve");
15
+
16
+ if (!workflow) throw new Error("no workflow defined");
17
+
18
+ workflow.on({
19
+ pullRequest: {
20
+ types: ["opened", "labeled", "ready_for_review", "reopened"],
21
+ },
22
+ });
23
+
24
+ workflow.addJobs({
25
+ approve: {
26
+ runsOn: ["ubuntu-latest"],
27
+ if: "contains(github.event.pull_request.labels.*.name, 'auto-approve') && github.event.pull_request.draft == false",
28
+ steps: [
29
+ {
30
+ name: "Checkout PR",
31
+ uses: "actions/checkout@v3",
32
+ with: {
33
+ ref: "${{ github.event.pull_request.head.ref }}",
34
+ repository:
35
+ "${{ github.event.pull_request.head.repo.full_name }}",
36
+ },
37
+ },
38
+ {
39
+ name: "Auto-approve PRs by other users as team-tf-cdk",
40
+ if: "github.event.pull_request.user.login != 'team-tf-cdk'",
41
+ run: "gh pr review ${{ github.event.pull_request.number }} --approve",
42
+ env: {
43
+ GH_TOKEN: "${{ secrets.PROJEN_GITHUB_TOKEN }}",
44
+ },
45
+ },
46
+ {
47
+ name: "Auto-approve PRs by team-tf-cdk as github-actions[bot]",
48
+ if: "github.event.pull_request.user.login == 'team-tf-cdk'",
49
+ run: "gh pr review ${{ github.event.pull_request.number }} --approve",
50
+ env: {
51
+ GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}",
52
+ },
53
+ },
54
+ ],
55
+ permissions: {
56
+ contents: JobPermission.READ,
57
+ pullRequests: JobPermission.WRITE,
58
+ },
59
+ },
60
+ });
61
+ }
62
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Copyright (c) HashiCorp, Inc.
3
+ * SPDX-License-Identifier: MPL-2.0
4
+ */
5
+
6
+ import { javascript } from "projen";
7
+ import { JobPermission } from "projen/lib/github/workflows-model";
8
+
9
+ /**
10
+ * Merges PRs with the "automerge" label
11
+ */
12
+ export class Automerge {
13
+ constructor(project: javascript.NodeProject) {
14
+ const workflow = project.github?.addWorkflow("automerge");
15
+
16
+ if (!workflow) throw new Error("no workflow defined");
17
+
18
+ workflow.on({
19
+ pullRequest: {
20
+ types: [
21
+ "opened",
22
+ "labeled",
23
+ "ready_for_review",
24
+ "reopened",
25
+ "synchronize",
26
+ ],
27
+ },
28
+ });
29
+
30
+ (workflow.concurrency as any) = "${{ github.workflow }}-${{ github.ref }}";
31
+
32
+ workflow.addJobs({
33
+ automerge: {
34
+ runsOn: ["ubuntu-latest"],
35
+ if: "contains(github.event.pull_request.labels.*.name, 'automerge') && github.event.pull_request.draft == false",
36
+ steps: [
37
+ {
38
+ name: "Checkout",
39
+ uses: "actions/checkout@v3",
40
+ },
41
+ {
42
+ name: "Turn on automerge for this PR",
43
+ run: "gh pr merge --auto --squash ${{ github.event.pull_request.number }}",
44
+ env: {
45
+ GH_TOKEN: "${{ secrets.PROJEN_GITHUB_TOKEN }}",
46
+ },
47
+ },
48
+ ],
49
+ permissions: {
50
+ contents: JobPermission.READ,
51
+ },
52
+ },
53
+ });
54
+ }
55
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Copyright (c) HashiCorp, Inc.
3
+ * SPDX-License-Identifier: MPL-2.0
4
+ */
5
+
6
+ import { IResolver, License } from "projen";
7
+ import { TypeScriptProject } from "projen/lib/typescript";
8
+
9
+ const SPDX = "MPL-2.0";
10
+
11
+ export class CustomizedLicense extends License {
12
+ constructor(project: TypeScriptProject) {
13
+ super(project, { spdx: SPDX });
14
+
15
+ project.addFields({ license: SPDX });
16
+ }
17
+
18
+ synthesizeContent(resolver: IResolver) {
19
+ return (
20
+ "Copyright (c) 2022 HashiCorp, Inc.\n\n" +
21
+ super.synthesizeContent(resolver)
22
+ );
23
+ }
24
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Copyright (c) HashiCorp, Inc.
3
+ * SPDX-License-Identifier: MPL-2.0
4
+ */
5
+
6
+ import { javascript } from "projen";
7
+ import { JobPermission } from "projen/lib/github/workflows-model";
8
+
9
+ /**
10
+ * Checks for new versions of CDKTF and creates a PR with an upgrade change if there are changes.
11
+ */
12
+ export class UpgradeCDKTF {
13
+ constructor(project: javascript.NodeProject) {
14
+ const workflow = project.github?.addWorkflow("upgrade-cdktf");
15
+
16
+ if (!workflow) throw new Error("no workflow defined");
17
+
18
+ workflow.on({
19
+ schedule: [{ cron: "49 */6 * * *" }], // Runs four times a day
20
+ workflowDispatch: {}, // allow manual triggering
21
+ });
22
+
23
+ (workflow.concurrency as any) = "${{ github.workflow }}-${{ github.ref }}";
24
+
25
+ workflow.addJobs({
26
+ upgrade: {
27
+ name: "Upgrade CDKTF",
28
+ runsOn: ["ubuntu-latest"],
29
+ steps: [
30
+ {
31
+ name: "Checkout",
32
+ uses: "actions/checkout@v3",
33
+ },
34
+ {
35
+ name: "Install",
36
+ run: "yarn install",
37
+ },
38
+ {
39
+ name: "Get current CDKTF version",
40
+ id: "current_version",
41
+ run: [
42
+ `OLD_VERSION=$(npm list cdktf --depth=0 --json | jq -r '.dependencies.cdktf.version')`,
43
+ `OLD_VERSION_SHORT=$(cut -d "." -f 2 <<< "$OLD_VERSION")`,
44
+ `echo "value=$OLD_VERSION" >> $GITHUB_OUTPUT`,
45
+ `echo "short=$OLD_VERSION_SHORT" >> $GITHUB_OUTPUT`,
46
+ ].join("\n"),
47
+ // NOTE: No, there is no good way to do this in Yarn, until (if) we upgrade to Yarn 2+ (see below)
48
+ },
49
+ {
50
+ name: "Get latest CDKTF version",
51
+ id: "latest_version",
52
+ run: [
53
+ `CDKTF_VERSION=$(yarn info cdktf --json | jq -r '.data.version')`,
54
+ `CDKTF_VERSION_SHORT=$(cut -d "." -f 2 <<< "$CDKTF_VERSION")`,
55
+ `echo "value=$CDKTF_VERSION" >> $GITHUB_OUTPUT`,
56
+ `echo "short=$CDKTF_VERSION_SHORT" >> $GITHUB_OUTPUT`,
57
+ ].join("\n"),
58
+ // IMPORTANT: the above behavior changed in Yarn 2+; `yarn info` instead gives the version of the installed package
59
+ // If/when we upgrade we'll likely want to switch to `yarn npm info`: https://yarnpkg.com/cli/npm/info
60
+ },
61
+ {
62
+ name: "Run upgrade script",
63
+ if: "steps.current_version.outputs.short != steps.latest_version.outputs.short",
64
+ run: "scripts/update-cdktf.sh ${{ steps.latest_version.outputs.value }}",
65
+ },
66
+ {
67
+ name: "Create draft pull request",
68
+ if: "steps.current_version.outputs.short != steps.latest_version.outputs.short",
69
+ uses: "peter-evans/create-pull-request@v3",
70
+ with: {
71
+ "commit-message":
72
+ "chore!: upgrade to cdktf ${{ steps.latest_version.outputs.value }}",
73
+ branch:
74
+ "auto/upgrade-cdktf-${{ steps.latest_version.outputs.short }}",
75
+ base: "main",
76
+ title:
77
+ "chore!: upgrade to cdktf ${{ steps.latest_version.outputs.value }}",
78
+ body: [
79
+ "This PR initiates the upgrade of CDKTF from version `${{ steps.current_version.outputs.value }}` to version `${{ steps.latest_version.outputs.value }}`.",
80
+ "Unfortunately, not everything can be automated, and the following steps need to be completed manually:",
81
+ " ",
82
+ "- [ ] Update `@cdktf/tf-module-stack` to a version compatible with `cdktf@${{ steps.latest_version.outputs.value }}` [here](https://github.com/cdktf/projen-cdktf-hybrid-construct/blob/ad6fff04398e309fa5f09e12b1c658f1a51937d5/src/hybrid-module.ts#L194). Look up the version [here](https://www.npmjs.com/package/@cdktf/tf-module-stack?activeTab=versions).",
83
+ "- [ ] Run `npx projen build`",
84
+ " ",
85
+ "Please checkout this PR, complete the above steps, push the changes to this branch, and then mark this PR as ready for review to complete the upgrade. Thanks!",
86
+ ].join("\n"),
87
+ labels: "automerge,auto-approve,dependencies",
88
+ token: "${{ secrets.PROJEN_GITHUB_TOKEN }}",
89
+ author: "team-tf-cdk <github-team-tf-cdk@hashicorp.com>",
90
+ committer: "team-tf-cdk <github-team-tf-cdk@hashicorp.com>",
91
+ signoff: true,
92
+ "delete-branch": true,
93
+ draft: true,
94
+ },
95
+ },
96
+ ],
97
+ env: {
98
+ CI: "true",
99
+ CHECKPOINT_DISABLE: "1",
100
+ },
101
+ permissions: {
102
+ contents: JobPermission.READ,
103
+ },
104
+ },
105
+ });
106
+ }
107
+ }
@@ -0,0 +1,36 @@
1
+ #!/bin/bash
2
+ # Copyright (c) HashiCorp, Inc.
3
+ # SPDX-License-Identifier: MPL-2.0
4
+
5
+ set -ex
6
+
7
+ PROJECT_ROOT=$(cd "$(dirname "${BASH_SOURCE:-$0}")/.." && pwd)
8
+ CDKTF_VERSION=$1
9
+
10
+ if [ -z "$CDKTF_VERSION" ]; then
11
+ echo "Usage: $0 <cdktf-version>"
12
+ exit 1
13
+ fi
14
+
15
+ echo "Updating /src cdktf version to $CDKTF_VERSION"
16
+ yarn
17
+ find ./src -type f -name "*.ts" -print0 | xargs -0 sed -i "s/const cdktfVersion = options.cdktfVersion || \".*\"/const cdktfVersion = options.cdktfVersion || \"$CDKTF_VERSION\"/"
18
+ # @TODO This is a hack and will stop working when CDKTF goes 1.0
19
+ find ./src -type f -name "*.ts" -print0 | xargs -0 sed -i "s/@default \"0\..*\"/@default \"$CDKTF_VERSION\"/"
20
+
21
+ echo "Updating README"
22
+ sed -i 's/`cdktf` >= .*/`cdktf` >= '"$CDKTF_VERSION"'/' "$PROJECT_ROOT/README.md"
23
+
24
+ npx projen build
25
+
26
+ echo "Updating examples"
27
+ # Loop through all examples and update the cdktf version
28
+ for example in $(find "$PROJECT_ROOT/examples" -mindepth 1 -maxdepth 1 -type d); do
29
+ echo "Updating example $example"
30
+ cd "$example"
31
+ yarn
32
+ sed -i "s/cdktfVersion: \".*\",/cdktfVersion: \"$CDKTF_VERSION\",/" ./.projenrc.ts
33
+ CI=0 npx projen
34
+ done
35
+
36
+ echo "Done"