Skip to content

Commit 28052aa

Browse files
authored
chore: align all versions of typescript, jsii & jsii-rosetta to 5.4 (#29974)
### Reason for this change There were a number of inconsistencies with the versions used for typescript, jsii & jsii-rosetta in this repository. Also the automated updater was incorrectly updating jsii minor versions. I did some digging and turns out because `jsii` was at `5.4.x` already, we are already using TypeScript 5.4 for most critical paths. So I went ahead and aligned all TS version on that. ### Description of changes Manually align all versions of typescript, jsii & jsii-rosetta. Fixed the update workflow to only update patch version for these three packages. Includes changes from #29978 until that is merged, and this PR is rebased. ### Description of how you validated changes Run through the test pipeline. ### Checklist - [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent bebb7e4 commit 28052aa

File tree

12 files changed

+38
-71
lines changed

12 files changed

+38
-71
lines changed

.github/workflows/yarn-upgrade.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ jobs:
1313
contents: read
1414
runs-on: ubuntu-latest
1515
steps:
16-
1716
- name: Check Out
1817
uses: actions/checkout@v4
1918

@@ -53,16 +52,17 @@ jobs:
5352
# Upgrade special cases:
5453
# - Various `@types/*` packages need to be pinned to specific versions due to breaking changes in minor upgrades https://github.com/DefinitelyTyped/DefinitelyTyped/issues/64266
5554
# - `typescript` is not semantically versioned, so we only upgrade the patch version
55+
# - `jsii`, `jsii-rosetta` is not semantically versioned and needs to be upgrades alongside typescript
5656
# - `constructs` because we need to stay in control of the minimum compatible version
5757
# - `aws-sdk-mock` because of breaking changes in type exports https://github.com/dwyl/aws-sdk-mock/pull/260. We are not respecting `@ts-ignore`.
5858
# - `@aws-cdk/aws-service-spec` and `@aws-cdk/service-spec-types` have their own update workflow
5959
run: |-
6060
# Upgrade dependencies at repository root
61-
ncu --upgrade --filter=typescript --target=patch
62-
ncu --upgrade --reject=@types/node,@types/prettier,constructs,typescript --target=minor
61+
ncu --upgrade --filter=jsii,jsii-rosetta,typescript --target=patch
62+
ncu --upgrade --reject=@types/node,@types/prettier,constructs,jsii,jsii-rosetta,typescript --target=minor
6363
# Upgrade all the packages
64-
lerna exec --parallel ncu -- --upgrade --filter=typescript --target=patch
65-
lerna exec --parallel ncu -- --upgrade --reject='@types/conventional-commits-parser,@types/node,@types/prettier,constructs,typescript,aws-sdk-mock,@aws-sdk/*,@aws-cdk/aws-service-spec,@aws-cdk/service-spec-types,${{ steps.list-packages.outputs.list }}' --target=minor
64+
lerna exec --parallel ncu -- --upgrade --filter=jsii,jsii-rosetta,typescript --target=patch
65+
lerna exec --parallel ncu -- --upgrade --reject='@types/conventional-commits-parser,@types/node,@types/prettier,constructs,jsii,jsii-rosetta,typescript,aws-sdk-mock,@aws-sdk/*,@aws-cdk/aws-service-spec,@aws-cdk/service-spec-types,${{ steps.list-packages.outputs.list }}' --target=minor
6666
# Upgrade package.json files in init templates
6767
for pj in $(find packages/aws-cdk/lib/init-templates -name package.json); do
6868
(cd $(dirname $pj) && ncu --upgrade --reject='constructs,${{ steps.list-packages.outputs.list }}')

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,22 @@
2020
"@types/prettier": "2.6.0",
2121
"@yarnpkg/lockfile": "^1.1.0",
2222
"aws-sdk-js-codemod": "^0.28.2",
23-
"cdk-generate-synthetic-examples": "^0.1.309",
23+
"cdk-generate-synthetic-examples": "^0.2.0",
2424
"conventional-changelog-cli": "^2.2.2",
2525
"fs-extra": "^9.1.0",
2626
"graceful-fs": "^4.2.11",
2727
"jest-junit": "^13.2.0",
2828
"jsii-diff": "1.97.0",
2929
"jsii-pacmak": "1.97.0",
3030
"jsii-reflect": "1.97.0",
31-
"jsii-rosetta": "~5.4.2",
3231
"lerna": "^8.1.2",
3332
"nx": "^18.3.1",
3433
"patch-package": "^6.5.1",
3534
"semver": "^7.6.0",
3635
"standard-version": "^9.5.0",
3736
"ts-jest": "^29.1.2",
3837
"ts-node": "^10.9.2",
39-
"typescript": "~5.1.6"
38+
"typescript": "~5.4.5"
4039
},
4140
"resolutions": {
4241
"colors": "1.4.0",

packages/aws-cdk-lib/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@
183183
"sinon": "^9.2.4",
184184
"ts-mock-imports": "^1.3.8",
185185
"ts-node": "^10.9.2",
186-
"typescript": "~5.1.6",
186+
"typescript": "~5.4.5",
187187
"typescript-json-schema": "^0.63.0"
188188
},
189189
"peerDependencies": {

packages/awslint/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"eslint-plugin-import": "^2.29.1",
4040
"eslint-plugin-jest": "^24.7.0",
4141
"jest": "^29.7.0",
42-
"typescript": "~5.1.6"
42+
"typescript": "~5.4.5"
4343
},
4444
"repository": {
4545
"type": "git",

tools/@aws-cdk/cdk-build-tools/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,15 @@
6060
"glob": "^7.2.3",
6161
"jest": "^29.7.0",
6262
"jest-junit": "^13.2.0",
63-
"jsii": "~5.4.3",
63+
"jsii": "~5.4.6",
64+
"jsii-rosetta": "~5.4.6",
6465
"jsii-pacmak": "1.97.0",
6566
"jsii-reflect": "1.97.0",
6667
"markdownlint-cli": "^0.39.0",
6768
"nyc": "^15.1.0",
6869
"semver": "^7.6.0",
6970
"ts-jest": "^29.1.2",
70-
"typescript": "~5.1.6",
71+
"typescript": "~5.4.5",
7172
"yargs": "^16.2.0"
7273
},
7374
"keywords": [

tools/@aws-cdk/eslint-plugin/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"@types/jest": "^29.5.12",
2020
"@types/estree": "*",
2121
"jest": "^29.7.0",
22-
"typescript": "~5.1.6"
22+
"typescript": "~5.4.5"
2323
},
2424
"dependencies": {
2525
"@typescript-eslint/parser": "^6.21.0",

tools/@aws-cdk/lazify/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"@aws-cdk/cdk-build-tools": "0.0.0",
2121
"jest": "^29",
2222
"ts-jest": "^29",
23-
"typescript": "^4.5.5",
23+
"typescript": "~5.4.5",
2424
"cjs-module-lexer": "^1.2.3"
2525
},
2626
"dependencies": {
@@ -30,4 +30,4 @@
3030
},
3131
"main": "lib/index.js",
3232
"license": "Apache-2.0"
33-
}
33+
}

tools/@aws-cdk/node-bundle/package.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/@aws-cdk/pkglint/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
"eslint-plugin-import": "^2.29.1",
5252
"eslint-plugin-jest": "^24.7.0",
5353
"jest": "^29.7.0",
54-
"typescript": "~5.1.6"
54+
"typescript": "~5.4.5"
5555
},
5656
"nozem": {
5757
"ostools": [

tools/@aws-cdk/prlint/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"@types/jest": "^29.5.12",
2626
"jest": "^29.7.0",
2727
"make-runnable": "^1.4.1",
28-
"typescript": "~5.1.6",
28+
"typescript": "~5.4.5",
2929
"eslint": "^7.32.0",
3030
"eslint-import-resolver-node": "^0.3.9",
3131
"eslint-import-resolver-typescript": "^2.7.1",

tools/@aws-cdk/yarn-cling/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
"@types/semver": "^7.5.8",
4444
"@types/yarnpkg__lockfile": "^1.1.9",
4545
"jest": "^29.7.0",
46-
"typescript": "~5.1.6"
46+
"typescript": "~5.4.5"
4747
},
4848
"dependencies": {
4949
"@yarnpkg/lockfile": "^1.1.0",

yarn.lock

Lines changed: 18 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -6882,16 +6882,13 @@ cdk-from-cfn@^0.156.0:
68826882
resolved "https://registry.npmjs.org/cdk-from-cfn/-/cdk-from-cfn-0.156.0.tgz#921134095983db664bd68556463dcde115d73cdb"
68836883
integrity sha512-nYK6SCC4yOPPxkPbrg23d6wTiu6Mtms5dWPI9kymwblpcXfIr+YaoiVlvlT9CFyyddGugG7AaTA6UN7U9LUOAg==
68846884

6885-
cdk-generate-synthetic-examples@^0.1.309:
6886-
version "0.1.309"
6887-
resolved "https://registry.npmjs.org/cdk-generate-synthetic-examples/-/cdk-generate-synthetic-examples-0.1.309.tgz#16b3520f43b7853ccb96eddad5efda7e87a405dd"
6888-
integrity sha512-QoBhKAvIBCbH9+Z8zRLleR4+m/8+mwTYju1nZ5jZ8AOaNxO1XHNXDtU7GnNGce8oGwqo+hyoFVpEKSDdd5AqJg==
6885+
cdk-generate-synthetic-examples@^0.2.0:
6886+
version "0.2.0"
6887+
resolved "https://registry.npmjs.org/cdk-generate-synthetic-examples/-/cdk-generate-synthetic-examples-0.2.0.tgz#019d4a2a9fa0fdab0b8d48b0426c0fa0ea8b5183"
6888+
integrity sha512-FaVV/TkTwIz9PUkG1+aT1DB13877jreoGbaud1W9bYY4F6u52DT7LqjLkvgETP8OKYTKqqUP+OikxmLt/OQ3aw==
68896889
dependencies:
68906890
"@jsii/spec" "^1.97.0"
6891-
fs-extra "^10.1.0"
6892-
jsii "^1.97.0"
68936891
jsii-reflect "^1.97.0"
6894-
jsii-rosetta "^1.97.0"
68956892
yargs "^17.7.2"
68966893

68976894
@@ -10895,10 +10892,10 @@ jsii-rosetta@^1.97.0:
1089510892
workerpool "^6.5.1"
1089610893
yargs "^16.2.0"
1089710894

10898-
jsii-rosetta@~5.4.2:
10899-
version "5.4.2"
10900-
resolved "https://registry.npmjs.org/jsii-rosetta/-/jsii-rosetta-5.4.2.tgz#ba51a331f4a5c42892d3b6d5766f7e4b83afd282"
10901-
integrity sha512-Bo+8lLuRQ0YiXiNImJ6XLrmAY/GzildnYd1B5MLlc+IpjbgFbynhFIyGjYAVf4+/VLFJRoOCJtZ40sM+ua8Ecw==
10895+
jsii-rosetta@~5.4.6:
10896+
version "5.4.6"
10897+
resolved "https://registry.npmjs.org/jsii-rosetta/-/jsii-rosetta-5.4.6.tgz#ada3dd6218acb0e5960dbfc15e8b1f67e045ede8"
10898+
integrity sha512-RyTtc3hJmmrpbiWCLVvgHfy0Is4PWIYDy+Al6/d1xwZDq64DHJU6yU+H99SgL7LRLLwDyCod2QqRmZ1VIywwcQ==
1090210899
dependencies:
1090310900
"@jsii/check-node" "1.97.0"
1090410901
"@jsii/spec" "^1.97.0"
@@ -10914,7 +10911,7 @@ jsii-rosetta@~5.4.2:
1091410911
workerpool "^6.5.1"
1091510912
yargs "^17.7.2"
1091610913

10917-
[email protected], jsii@^1.97.0:
10914+
1091810915
version "1.97.0"
1091910916
resolved "https://registry.npmjs.org/jsii/-/jsii-1.97.0.tgz#5ceee9f1b4715b82e37ec5a24b509336d8ebef83"
1092010917
integrity sha512-C3GA2Q50DkHnFozg7HKel7ZaBMCUKb/dzgH2ykfrbuJ/C/KebkPkqY/XRf95zGB42mzagPfawSLDFQiGGueQ9w==
@@ -10933,10 +10930,10 @@ [email protected], jsii@^1.97.0:
1093310930
typescript "~3.9.10"
1093410931
yargs "^16.2.0"
1093510932

10936-
jsii@~5.4.0, jsii@~5.4.3:
10937-
version "5.4.3"
10938-
resolved "https://registry.npmjs.org/jsii/-/jsii-5.4.3.tgz#dedac3cc9f1d209193f1388dcf9e55c142ff4a8d"
10939-
integrity sha512-+alxW2wfBQBCjesy2kvMl6yML8m7hD/buIkVVQNSGt0R0ObhsLvlanS2lRWpNkdfVtDnNk/ke5UFmMSfJ/vy0Q==
10933+
jsii@~5.4.0, jsii@~5.4.6:
10934+
version "5.4.6"
10935+
resolved "https://registry.npmjs.org/jsii/-/jsii-5.4.6.tgz#5389695696d7d8fc8e34942c6efef97ef0236fe0"
10936+
integrity sha512-Ohqz39ecBfmL/Pd5nnkERnikyOoZmNdqoSqedl+yXATM+js7XLlUGgQ+BdBXaO0rzQU2AEQ40C0COtF0jFXw4A==
1094010937
dependencies:
1094110938
"@jsii/check-node" "1.97.0"
1094210939
"@jsii/spec" "^1.97.0"
@@ -14805,16 +14802,7 @@ string-length@^4.0.1:
1480514802
char-regex "^1.0.2"
1480614803
strip-ansi "^6.0.0"
1480714804

14808-
"string-width-cjs@npm:string-width@^4.2.0":
14809-
version "4.2.3"
14810-
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
14811-
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
14812-
dependencies:
14813-
emoji-regex "^8.0.0"
14814-
is-fullwidth-code-point "^3.0.0"
14815-
strip-ansi "^6.0.1"
14816-
14817-
string-width@*, string-width@^1.0.1, "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3, string-width@^5.0.1, string-width@^5.1.2:
14805+
"string-width-cjs@npm:string-width@^4.2.0", string-width@*, string-width@^1.0.1, "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3, string-width@^5.0.1, string-width@^5.1.2:
1481814806
version "4.2.3"
1481914807
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
1482014808
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -14892,7 +14880,7 @@ stringify-package@^1.0.1:
1489214880
resolved "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85"
1489314881
integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
1489414882

14895-
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
14883+
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
1489614884
version "6.0.1"
1489714885
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
1489814886
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -14906,13 +14894,6 @@ strip-ansi@^3.0.1:
1490614894
dependencies:
1490714895
ansi-regex "^2.0.0"
1490814896

14909-
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
14910-
version "6.0.1"
14911-
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
14912-
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
14913-
dependencies:
14914-
ansi-regex "^5.0.1"
14915-
1491614897
strip-ansi@^7.0.1, strip-ansi@^7.1.0:
1491714898
version "7.1.0"
1491814899
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
@@ -15468,7 +15449,7 @@ typescript-json-schema@^0.63.0:
1546815449
typescript "~5.1.0"
1546915450
yargs "^17.1.1"
1547015451

15471-
"typescript@>=3 < 6", typescript@~5.4:
15452+
"typescript@>=3 < 6", typescript@~5.4, typescript@~5.4.5:
1547215453
version "5.4.5"
1547315454
resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611"
1547415455
integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==
@@ -15478,17 +15459,12 @@ typescript@^3.9.10, typescript@^3.9.5, typescript@^3.9.7, typescript@~3.9.10:
1547815459
resolved "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8"
1547915460
integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==
1548015461

15481-
typescript@^4.5.5:
15482-
version "4.9.5"
15483-
resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
15484-
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
15485-
1548615462
typescript@next:
1548715463
version "5.5.0-dev.20240417"
1548815464
resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.0-dev.20240417.tgz#2558a2442be5b8541ce8168c53fb5ef4ee3c4995"
1548915465
integrity sha512-BjMYWxzDLRaNlnnMC/NHf0uUIZEnw5VLe7q0h7hEi5Q4H1XoIDdjBjk6stBS2nj6R/HrsdEqhWdPz6+DLx+sRw==
1549015466

15491-
typescript@~5.1.0, typescript@~5.1.6:
15467+
typescript@~5.1.0:
1549215468
version "5.1.6"
1549315469
resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274"
1549415470
integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==
@@ -15898,7 +15874,7 @@ workerpool@^6.5.1:
1589815874
resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544"
1589915875
integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==
1590015876

15901-
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
15877+
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
1590215878
version "7.0.0"
1590315879
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
1590415880
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -15916,15 +15892,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0:
1591615892
string-width "^4.1.0"
1591715893
strip-ansi "^6.0.0"
1591815894

15919-
wrap-ansi@^7.0.0:
15920-
version "7.0.0"
15921-
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
15922-
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
15923-
dependencies:
15924-
ansi-styles "^4.0.0"
15925-
string-width "^4.1.0"
15926-
strip-ansi "^6.0.0"
15927-
1592815895
wrap-ansi@^8.1.0:
1592915896
version "8.1.0"
1593015897
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"

0 commit comments

Comments
 (0)