diff --git a/.github/workflows/auto-approve.yml b/.github/workflows/auto-approve.yml index d3f02ab60c..c6751dee68 100644 --- a/.github/workflows/auto-approve.yml +++ b/.github/workflows/auto-approve.yml @@ -1,15 +1,55 @@ # Approve PRs with "pr/auto-approve". mergify takes care of the actual merge. name: auto-approve -on: pull_request +on: + pull_request: + types: + - labeled # Run when labels are updated + - opened # Run when a PR is initially submitted + - ready_for_review # Run when a Draft PR is upgraded PR + - reopened # Run when a PR is re-opened + - synchronize # Run when a PR head branch is updated jobs: auto-approve: - if: contains(github.event.pull_request.labels.*.name, 'pr/auto-approve') + if: contains(github.event.pull_request.labels.*.name, 'pr/auto-approve') || github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]' + permissions: pull-requests: write runs-on: ubuntu-latest + steps: - - uses: hmarr/auto-approve-action@v2.1.0 - with: - github-token: "${{ secrets.GITHUB_TOKEN }}" \ No newline at end of file + # Check whether the PR needs an automated approval or not. We will only add an automated + # approval if the PR currently has no reviews on it. Dismissed reviews are ignored in the + # context of this check. This way, the automated workflow will not do anything if a manual + # review has already been done for the PR (implicit opt-out). + - uses: actions/github-script@v5.0.0 + id: needs-approving + with: + script: |- + const { issue: { number: pull_number }, repo: { owner, repo } } = context; + const reviews = (await github.rest.pulls.listReviews({ owner, repo, pull_number })).data + .filter((review) => review.state !== 'DISMISSED'); + return reviews.length === 0; + + # If this is NOT a dependabot PR, just approve it. + - uses: actions/github-script@v5.0.0 + if: steps.needs-approving.outputs.result == 'true' && github.actor != 'dependabot[bot]' && github.actor != 'dependabot-preview[bot]' + with: + script: |- + const { issue: { number: pull_number }, repo: { owner, repo } } = context; + github.rest.pulls.createReview({ + owner, repo, pull_number, + event: 'APPROVE', + }); + # If this IS a dependabot PR, approve it and ask dependabot to squash-and-merge it when CI passes. + - uses: actions/github-script@v5.0.0 + if: steps.needs-approving.outputs.result == 'true' && (github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]') + with: + script: |- + const { issue: { number: pull_number }, repo: { owner, repo } } = context; + github.rest.pulls.createReview({ + owner, repo, pull_number, + body: '@dependabot squash and merge', + event: 'APPROVE', + }); \ No newline at end of file diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml deleted file mode 100644 index 9b597bde76..0000000000 --- a/.github/workflows/pr-labeler.yml +++ /dev/null @@ -1,18 +0,0 @@ -# Apply various labels on PRs - -name: pr-labeler -on: - pull_request: - types: [ opened ] - -jobs: - auto-approve: - if: github.event.pull_request.user.login == 'dependabot[bot]' || github.event.pull_request.user.login == 'dependabot-preview[bot]' - runs-on: ubuntu-latest - permissions: - pull-requests: write - issues: write - steps: - - run: gh pr edit ${{ github.event.pull_request.number }} --add-label "pr/auto-approve" -R ${{ github.repository }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 36cff8973c..a89374e2c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [1.50.0](https://github.com/aws/jsii/compare/v1.49.0...v1.50.0) (2021-12-24) + + +### Bug Fixes + +* **jsii:** color codes are logged to logfiles ([#3284](https://github.com/aws/jsii/issues/3284)) ([2c8c647](https://github.com/aws/jsii/commit/2c8c647356345981cc2f9416449d48b660b5da44)) +* **jsii:** slow with deep dependency tree ([#3294](https://github.com/aws/jsii/issues/3294)) ([04d64c9](https://github.com/aws/jsii/commit/04d64c91da5e8a0eccd06cd03a4b7a20bce55845)) +* **pacmak:** fails on bundled dependency without entry point ([#3277](https://github.com/aws/jsii/issues/3277)) ([6e5a0b5](https://github.com/aws/jsii/commit/6e5a0b50e19af6cb0c1817fe3c447a24a9632a7b)), closes [#3275](https://github.com/aws/jsii/issues/3275) +* **rosetta:** diagnostics from infused snippets were not ignored ([#3282](https://github.com/aws/jsii/issues/3282)) ([ad7f6a4](https://github.com/aws/jsii/commit/ad7f6a4a20564e733bf29a70956bbbe54d66562e)) +* **rosetta:** infused snippets not returned from cache ([#3291](https://github.com/aws/jsii/issues/3291)) ([dd44431](https://github.com/aws/jsii/commit/dd444313b4177babce8d972da01071f308600416)) +* **rosetta:** non-compiling snippets not reported on subsequent extracts ([#3260](https://github.com/aws/jsii/issues/3260)) ([771190b](https://github.com/aws/jsii/commit/771190b5435a82fe6033a05247bfa828276f0130)) +* **rosetta:** transliterate command does not translate in parallel ([#3262](https://github.com/aws/jsii/issues/3262)) ([beeadaa](https://github.com/aws/jsii/commit/beeadaa21d5bd5a34e97691c2410366f475d3da3)) + ## [1.49.0](https://github.com/aws/jsii/compare/v1.48.0...v1.49.0) (2021-12-14) diff --git a/gh-pages/requirements-dev.txt b/gh-pages/requirements-dev.txt index fa6c5b31c1..48f1257071 100644 --- a/gh-pages/requirements-dev.txt +++ b/gh-pages/requirements-dev.txt @@ -1,4 +1,4 @@ mkdocs~=1.2.3 mkdocs-awesome-pages-plugin~=2.6.0 -mkdocs-material~=7.3.6 +mkdocs-material~=8.1.3 mkdocs-git-revision-date-plugin~=0.3.1 diff --git a/lerna.json b/lerna.json index 0e8a5a1e4c..50956726e7 100644 --- a/lerna.json +++ b/lerna.json @@ -10,5 +10,5 @@ "rejectCycles": true } }, - "version": "1.49.0" + "version": "1.50.0" } diff --git a/package.json b/package.json index 1034e0e10f..92ca3b0758 100644 --- a/package.json +++ b/package.json @@ -16,21 +16,21 @@ }, "devDependencies": { "@jest/types": "^27.4.2", - "@typescript-eslint/eslint-plugin": "^5.6.0", - "@typescript-eslint/parser": "^5.6.0", + "@typescript-eslint/eslint-plugin": "^5.8.0", + "@typescript-eslint/parser": "^5.8.0", "all-contributors-cli": "^6.20.0", - "eslint": "^8.4.1", + "eslint": "^8.5.0", "eslint-config-prettier": "^8.3.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^2.5.0", "eslint-plugin-import": "^2.25.3", "eslint-plugin-prettier": "^4.0.0", - "jest-circus": "^27.4.4", - "jest-config": "^27.4.4", + "jest-circus": "^27.4.5", + "jest-config": "^27.4.5", "lerna": "^4.0.0", "prettier": "^2.5.1", "standard-version": "^9.3.2", - "ts-jest": "^27.1.1", + "ts-jest": "^27.1.2", "ts-node": "^10.4.0", "typescript": "~3.9.10" }, diff --git a/packages/@jsii/check-node/package.json b/packages/@jsii/check-node/package.json index dfe42f1f80..41bd393271 100644 --- a/packages/@jsii/check-node/package.json +++ b/packages/@jsii/check-node/package.json @@ -42,7 +42,7 @@ "devDependencies": { "@types/chalk": "^2.2.0", "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", - "jest": "^27.4.4" + "@types/node": "^12.20.38", + "jest": "^27.4.5" } } diff --git a/packages/@jsii/dotnet-runtime-test/package.json b/packages/@jsii/dotnet-runtime-test/package.json index ccf4e8654f..830e5f32df 100644 --- a/packages/@jsii/dotnet-runtime-test/package.json +++ b/packages/@jsii/dotnet-runtime-test/package.json @@ -31,7 +31,7 @@ }, "devDependencies": { "@jsii/dotnet-runtime": "^0.0.0", - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "jsii-calc": "^3.20.120", "jsii-pacmak": "^0.0.0", "typescript": "~3.9.10" diff --git a/packages/@jsii/dotnet-runtime/package.json b/packages/@jsii/dotnet-runtime/package.json index 33aca99fb0..33f0664101 100644 --- a/packages/@jsii/dotnet-runtime/package.json +++ b/packages/@jsii/dotnet-runtime/package.json @@ -39,7 +39,7 @@ }, "devDependencies": { "@jsii/runtime": "^0.0.0", - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "@types/semver": "^7.3.9", "jsii-build-tools": "^0.0.0", "semver": "^7.3.5", diff --git a/packages/@jsii/go-runtime/go.mod b/packages/@jsii/go-runtime/go.mod index c5af18493e..7230730946 100644 --- a/packages/@jsii/go-runtime/go.mod +++ b/packages/@jsii/go-runtime/go.mod @@ -4,5 +4,5 @@ go 1.15 require ( golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 - golang.org/x/tools v0.1.7 + golang.org/x/tools v0.1.8 ) diff --git a/packages/@jsii/go-runtime/go.sum b/packages/@jsii/go-runtime/go.sum index c66db5a445..aa8273a5d7 100644 --- a/packages/@jsii/go-runtime/go.sum +++ b/packages/@jsii/go-runtime/go.sum @@ -1,32 +1,33 @@ -github.com/yuin/goldmark v1.4.0 h1:OtISOGfH6sOWa1/qXqqAiOIAO6Z5J3AEAE18WAq6BiQ= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1 h1:/vn0k+RBvwlxEmP5E7SZMqNxPhfMVFEJiykr15/0XKM= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= diff --git a/packages/@jsii/go-runtime/package.json b/packages/@jsii/go-runtime/package.json index 023cd8c66c..07825e30fe 100644 --- a/packages/@jsii/go-runtime/package.json +++ b/packages/@jsii/go-runtime/package.json @@ -24,9 +24,9 @@ }, "devDependencies": { "@types/fs-extra": "^9.0.13", - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "codemaker": "^0.0.0", - "eslint": "^8.4.1", + "eslint": "^8.5.0", "fs-extra": "^9.1.0", "jsii-build-tools": "^0.0.0", "jsii-calc": "^3.20.120", diff --git a/packages/@jsii/integ-test/package.json b/packages/@jsii/integ-test/package.json index 2af63f492e..b1744ed7ca 100644 --- a/packages/@jsii/integ-test/package.json +++ b/packages/@jsii/integ-test/package.json @@ -20,7 +20,7 @@ "@octokit/rest": "^18.12.0", "dotenv": "^8.6.0", "fs-extra": "^9.1.0", - "jest": "^27.4.4", + "jest": "^27.4.5", "jsii": "^0.0.0", "jsii-pacmak": "^0.0.0", "jsii-rosetta": "^0.0.0", @@ -30,9 +30,9 @@ "@types/dotenv": "^8.2.0", "@types/fs-extra": "^9.0.13", "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "@types/tar": "^6.1.1", - "eslint": "^8.4.1", + "eslint": "^8.5.0", "prettier": "^2.5.1", "typescript": "~3.9.10" } diff --git a/packages/@jsii/java-runtime/package.json b/packages/@jsii/java-runtime/package.json index cf74f3fbfa..074ed63b08 100644 --- a/packages/@jsii/java-runtime/package.json +++ b/packages/@jsii/java-runtime/package.json @@ -33,7 +33,7 @@ }, "devDependencies": { "@jsii/runtime": "^0.0.0", - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "jsii-build-tools": "^0.0.0", "typescript": "~3.9.10" } diff --git a/packages/@jsii/kernel/package.json b/packages/@jsii/kernel/package.json index 6299d3de7c..fa8e45292e 100644 --- a/packages/@jsii/kernel/package.json +++ b/packages/@jsii/kernel/package.json @@ -40,15 +40,15 @@ "@scope/jsii-calc-lib": "^0.0.0", "@types/fs-extra": "^9.0.13", "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "@types/tar": "^6.1.1", - "eslint": "^8.4.1", - "jest": "^27.4.4", + "eslint": "^8.5.0", + "jest": "^27.4.5", "jest-expect-message": "^1.0.2", "jsii-build-tools": "^0.0.0", "jsii-calc": "^3.20.120", "prettier": "^2.5.1", - "ts-jest": "^27.1.1", + "ts-jest": "^27.1.2", "typescript": "~3.9.10" } } diff --git a/packages/@jsii/python-runtime/requirements.txt b/packages/@jsii/python-runtime/requirements.txt index 8325b38ea2..1f0bcade04 100644 --- a/packages/@jsii/python-runtime/requirements.txt +++ b/packages/@jsii/python-runtime/requirements.txt @@ -1,9 +1,9 @@ -black~=21.11b1 +black~=21.12b0 mypy==0.812 pip~=21.3 pytest~=6.2 pytest-mypy~=0.8 -setuptools~=59.2 +setuptools~=59.6 wheel~=0.37 -e . diff --git a/packages/@jsii/python-runtime/setup.py b/packages/@jsii/python-runtime/setup.py index 8a569b8e82..ac5a36e3e8 100644 --- a/packages/@jsii/python-runtime/setup.py +++ b/packages/@jsii/python-runtime/setup.py @@ -32,7 +32,7 @@ install_requires=[ "attrs~=21.2", "cattrs~=1.0.0 ; python_version < '3.7'", - "cattrs~=1.8.0 ; python_version >= '3.7'", + "cattrs>=1.8,<1.10 ; python_version >= '3.7'", "importlib_resources ; python_version < '3.7'", "python-dateutil", "typing_extensions>=3.7,<5.0", diff --git a/packages/@jsii/runtime/package.json b/packages/@jsii/runtime/package.json index 0900b30f70..9b112360a1 100644 --- a/packages/@jsii/runtime/package.json +++ b/packages/@jsii/runtime/package.json @@ -42,14 +42,14 @@ "@scope/jsii-calc-base": "^0.0.0", "@scope/jsii-calc-lib": "^0.0.0", "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", - "eslint": "^8.4.1", - "jest": "^27.4.4", + "@types/node": "^12.20.38", + "eslint": "^8.5.0", + "jest": "^27.4.5", "jsii-build-tools": "^0.0.0", "jsii-calc": "^3.20.120", "prettier": "^2.5.1", "source-map-loader": "^3.0.0", - "ts-jest": "^27.1.1", + "ts-jest": "^27.1.2", "typescript": "~3.9.10", "webpack": "^5.65.0", "webpack-cli": "^4.9.1" diff --git a/packages/@jsii/spec/package.json b/packages/@jsii/spec/package.json index 24d999323d..021b5f53e2 100644 --- a/packages/@jsii/spec/package.json +++ b/packages/@jsii/spec/package.json @@ -35,9 +35,9 @@ }, "devDependencies": { "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", - "eslint": "^8.4.1", - "jest": "^27.4.4", + "@types/node": "^12.20.38", + "eslint": "^8.5.0", + "jest": "^27.4.5", "jsii-build-tools": "^0.0.0", "prettier": "^2.5.1", "typescript": "~3.9.10", diff --git a/packages/@scope/jsii-calc-base-of-base/package.json b/packages/@scope/jsii-calc-base-of-base/package.json index 169e3ad14e..a3db725d45 100644 --- a/packages/@scope/jsii-calc-base-of-base/package.json +++ b/packages/@scope/jsii-calc-base-of-base/package.json @@ -30,7 +30,7 @@ "test:update": "npm run build && UPDATE_DIFF=1 npm run test" }, "devDependencies": { - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "jsii": "^0.0.0", "jsii-build-tools": "^0.0.0", "jsii-rosetta": "^0.0.0", diff --git a/packages/@scope/jsii-calc-base/package.json b/packages/@scope/jsii-calc-base/package.json index f54d629988..49ec85c588 100644 --- a/packages/@scope/jsii-calc-base/package.json +++ b/packages/@scope/jsii-calc-base/package.json @@ -35,7 +35,7 @@ "@scope/jsii-calc-base-of-base": "^2.1.1" }, "devDependencies": { - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "jsii": "^0.0.0", "jsii-build-tools": "^0.0.0", "jsii-rosetta": "^0.0.0", diff --git a/packages/@scope/jsii-calc-lib/package.json b/packages/@scope/jsii-calc-lib/package.json index f1437c4c79..77984b9744 100644 --- a/packages/@scope/jsii-calc-lib/package.json +++ b/packages/@scope/jsii-calc-lib/package.json @@ -39,7 +39,7 @@ "@scope/jsii-calc-base-of-base": "^2.1.1" }, "devDependencies": { - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "jsii": "^0.0.0", "jsii-build-tools": "^0.0.0", "jsii-rosetta": "^0.0.0", diff --git a/packages/codemaker/package.json b/packages/codemaker/package.json index 4ec77d1b86..8175bc49de 100644 --- a/packages/codemaker/package.json +++ b/packages/codemaker/package.json @@ -38,9 +38,9 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", - "eslint": "^8.4.1", - "jest": "^27.4.4", + "@types/node": "^12.20.38", + "eslint": "^8.5.0", + "jest": "^27.4.5", "prettier": "^2.5.1", "typescript": "~3.9.10" } diff --git a/packages/jsii-calc/package.json b/packages/jsii-calc/package.json index dc3489e567..84e2cf07cd 100644 --- a/packages/jsii-calc/package.json +++ b/packages/jsii-calc/package.json @@ -51,8 +51,8 @@ "@scope/jsii-calc-lib": "^0.0.0" }, "devDependencies": { - "@types/node": "^12.20.37", - "eslint": "^8.4.1", + "@types/node": "^12.20.38", + "eslint": "^8.5.0", "jsii": "^0.0.0", "jsii-build-tools": "^0.0.0", "jsii-rosetta": "^0.0.0", diff --git a/packages/jsii-config/package.json b/packages/jsii-config/package.json index c1ec0acbb4..47f24e2a2f 100644 --- a/packages/jsii-config/package.json +++ b/packages/jsii-config/package.json @@ -21,10 +21,10 @@ "devDependencies": { "@types/inquirer": "^8.1.3", "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "@types/yargs": "^17.0.7", - "eslint": "^8.4.1", - "jest": "^27.4.4", + "eslint": "^8.5.0", + "jest": "^27.4.5", "jest-expect-message": "^1.0.2", "prettier": "^2.5.1", "typescript": "~3.9.10" diff --git a/packages/jsii-diff/package.json b/packages/jsii-diff/package.json index 53fdf318d7..502d8e0019 100644 --- a/packages/jsii-diff/package.json +++ b/packages/jsii-diff/package.json @@ -44,10 +44,10 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "@types/tar-fs": "^2.0.1", - "eslint": "^8.4.1", - "jest": "^27.4.4", + "eslint": "^8.5.0", + "jest": "^27.4.5", "jest-expect-message": "^1.0.2", "jsii": "^0.0.0", "jsii-build-tools": "^0.0.0", diff --git a/packages/jsii-pacmak/lib/dependency-graph.ts b/packages/jsii-pacmak/lib/dependency-graph.ts index d00bdae639..2661bdb8d9 100644 --- a/packages/jsii-pacmak/lib/dependency-graph.ts +++ b/packages/jsii-pacmak/lib/dependency-graph.ts @@ -58,6 +58,8 @@ export interface TraverseDependencyGraphHost { export interface PackageJson { readonly dependencies?: { readonly [name: string]: string }; readonly peerDependencies?: { readonly [name: string]: string }; + readonly bundleDependencies?: string[]; + readonly bundledDependencies?: string[]; readonly [key: string]: unknown; } @@ -88,7 +90,13 @@ async function real$traverseDependencyGraph( ]); return Promise.all( Array.from(deps) - .filter((m) => !util.isBuiltinModule(m)) + // No need to pacmak the dependency if it's built-in, or if it's bundled + .filter( + (m) => + !util.isBuiltinModule(m) && + !meta.bundledDependencies?.includes(m) && + !meta.bundleDependencies?.includes(m), + ) .map(async (dep) => { const dependencyDir = await host.findDependencyDirectory( dep, diff --git a/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt b/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt index 43f5f355a6..90ffd2fc28 100644 --- a/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt +++ b/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt @@ -3,7 +3,7 @@ # be installed in the virtual environment used for building the distribution # package (wheel, sdist), but not declared as build-system dependencies. -setuptools~=59.1.1 # build-system +setuptools~=59.6.0 # build-system wheel~=0.37.0 # build-system -twine~=3.7.0 +twine~=3.7.1 diff --git a/packages/jsii-pacmak/package.json b/packages/jsii-pacmak/package.json index 80e6ca8d58..91ef03460e 100644 --- a/packages/jsii-pacmak/package.json +++ b/packages/jsii-pacmak/package.json @@ -33,7 +33,7 @@ "test": "npm run test:unit && npm run test:build", "test:unit": "jest", "test:build": "bash test/build-test.sh", - "test:update": "true", + "test:update": "jest -u && npm run test:build", "package": "package-js" }, "dependencies": { @@ -60,15 +60,15 @@ "@types/commonmark": "^0.27.5", "@types/fs-extra": "^9.0.13", "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "@types/semver": "^7.3.9", - "eslint": "^8.4.1", - "jest": "^27.4.4", + "eslint": "^8.5.0", + "jest": "^27.4.5", "jsii": "^0.0.0", "jsii-build-tools": "^0.0.0", "jsii-calc": "^3.20.120", "prettier": "^2.5.1", - "ts-jest": "^27.1.1", + "ts-jest": "^27.1.2", "typescript": "~3.9.10" }, "keywords": [ diff --git a/packages/jsii-pacmak/test/dependency-graph.test.ts b/packages/jsii-pacmak/test/dependency-graph.test.ts index e46446c167..cf0eac3a97 100644 --- a/packages/jsii-pacmak/test/dependency-graph.test.ts +++ b/packages/jsii-pacmak/test/dependency-graph.test.ts @@ -113,3 +113,91 @@ test('stops traversing when callback returns false', async () => { expect(mockHost.readJson).toHaveBeenCalledTimes(2); expect(mockHost.findDependencyDirectory).toHaveBeenCalledTimes(1); }); + +test('dont call findDependencyDirectory for bundledDependencies', async () => { + const packages: Record = { + A: { + root: join(tmpdir(), 'A'), + meta: { dependencies: { B: '*' }, bundledDependencies: ['B'] }, + }, + }; + + const cb: Callback = jest.fn().mockName('callback').mockReturnValue(true); + + fakeReadJson(packages); + + // WHEN + await expect( + traverseDependencyGraph(packages.A.root, cb, mockHost), + ).resolves.not.toThrow(); + + // THEN + expect(mockHost.findDependencyDirectory).not.toHaveBeenCalled(); +}); + +test('dont call findDependencyDirectory for bundleDependencies', async () => { + const packages: Record = { + A: { + root: join(tmpdir(), 'A'), + meta: { dependencies: { B: '*' }, bundleDependencies: ['B'] }, + }, + }; + + const cb: Callback = jest.fn().mockName('callback').mockReturnValue(true); + + fakeReadJson(packages); + + // WHEN + await expect( + traverseDependencyGraph(packages.A.root, cb, mockHost), + ).resolves.not.toThrow(); + + // THEN + expect(mockHost.findDependencyDirectory).not.toHaveBeenCalled(); +}); + +test('dont call findDependencyDirectory for bundleDependencies AND bundledDependencies', async () => { + const packages: Record = { + A: { + root: join(tmpdir(), 'A'), + meta: { + dependencies: { B: '*', C: '*' }, + bundleDependencies: ['B'], + bundledDependencies: ['C'], + }, + }, + }; + + const cb: Callback = jest.fn().mockName('callback').mockReturnValue(true); + + fakeReadJson(packages); + + // WHEN + await expect( + traverseDependencyGraph(packages.A.root, cb, mockHost), + ).resolves.not.toThrow(); + + // THEN + expect(mockHost.findDependencyDirectory).not.toHaveBeenCalled(); +}); + +function fakeReadJson( + fakePackages: Record, +) { + mockHost.readJson.mockImplementation((file) => { + const result = Object.values(fakePackages).find( + ({ root }) => file === join(root, 'package.json'), + )?.meta; + return result != null + ? Promise.resolve(result) + : Promise.reject(new Error(`Unexpected file access: ${file}`)); + }); + + mockHost.findDependencyDirectory.mockImplementation(async (dep, _dir) => { + const result = fakePackages[dep]?.root; + if (result == null) { + throw new Error(`Unknown dependency: ${dep}`); + } + return result; + }); +} diff --git a/packages/jsii-pacmak/test/generated-code/__snapshots__/examples.test.ts.snap b/packages/jsii-pacmak/test/generated-code/__snapshots__/examples.test.ts.snap index bca0c45aaf..624e3892b6 100644 --- a/packages/jsii-pacmak/test/generated-code/__snapshots__/examples.test.ts.snap +++ b/packages/jsii-pacmak/test/generated-code/__snapshots__/examples.test.ts.snap @@ -1147,7 +1147,7 @@ testpkg.FooBar=example.test.demo.FooBar exports[`diamond-struct-parameter.ts: /python/pyproject.toml 1`] = ` [build-system] -requires = ["setuptools~=59.1.1", "wheel~=0.37.0"] +requires = ["setuptools~=59.6.0", "wheel~=0.37.0"] build-backend = "setuptools.build_meta" `; @@ -2447,7 +2447,7 @@ testpkg.Namespace2.Foo.Final=example.test.demo.Namespace2$Foo.Final exports[`nested-types.ts: /python/pyproject.toml 1`] = ` [build-system] -requires = ["setuptools~=59.1.1", "wheel~=0.37.0"] +requires = ["setuptools~=59.6.0", "wheel~=0.37.0"] build-backend = "setuptools.build_meta" `; diff --git a/packages/jsii-pacmak/test/generated-code/__snapshots__/prerelease-identifiers.test.ts.snap b/packages/jsii-pacmak/test/generated-code/__snapshots__/prerelease-identifiers.test.ts.snap index e4cda418d9..0d9d45331c 100644 --- a/packages/jsii-pacmak/test/generated-code/__snapshots__/prerelease-identifiers.test.ts.snap +++ b/packages/jsii-pacmak/test/generated-code/__snapshots__/prerelease-identifiers.test.ts.snap @@ -416,7 +416,7 @@ foo exports[`foo@1.2.3 depends on bar@^2.0.0-rc.42: /python/pyproject.toml 1`] = ` [build-system] -requires = ["setuptools~=59.1.1", "wheel~=0.37.0"] +requires = ["setuptools~=59.6.0", "wheel~=0.37.0"] build-backend = "setuptools.build_meta" `; @@ -925,7 +925,7 @@ foo exports[`foo@1.2.3 depends on bar@^4.5.6-pre.1337: /python/pyproject.toml 1`] = ` [build-system] -requires = ["setuptools~=59.1.1", "wheel~=0.37.0"] +requires = ["setuptools~=59.6.0", "wheel~=0.37.0"] build-backend = "setuptools.build_meta" `; @@ -1414,7 +1414,7 @@ foo exports[`foo@2.0.0-rc.42: /python/pyproject.toml 1`] = ` [build-system] -requires = ["setuptools~=59.1.1", "wheel~=0.37.0"] +requires = ["setuptools~=59.6.0", "wheel~=0.37.0"] build-backend = "setuptools.build_meta" `; @@ -1900,7 +1900,7 @@ foo exports[`foo@4.5.6-pre.1337: /python/pyproject.toml 1`] = ` [build-system] -requires = ["setuptools~=59.1.1", "wheel~=0.37.0"] +requires = ["setuptools~=59.6.0", "wheel~=0.37.0"] build-backend = "setuptools.build_meta" `; diff --git a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.ts.snap b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.ts.snap index ed2a5b917b..35b92b1edf 100644 --- a/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.ts.snap +++ b/packages/jsii-pacmak/test/generated-code/__snapshots__/target-python.test.ts.snap @@ -243,7 +243,7 @@ scope.jsii-calc-base exports[`Generated code for "@scope/jsii-calc-base": /python/pyproject.toml 1`] = ` [build-system] -requires = ["setuptools~=59.1.1", "wheel~=0.37.0"] +requires = ["setuptools~=59.6.0", "wheel~=0.37.0"] build-backend = "setuptools.build_meta" `; @@ -723,7 +723,7 @@ scope.jsii-calc-base-of-base exports[`Generated code for "@scope/jsii-calc-base-of-base": /python/pyproject.toml 1`] = ` [build-system] -requires = ["setuptools~=59.1.1", "wheel~=0.37.0"] +requires = ["setuptools~=59.6.0", "wheel~=0.37.0"] build-backend = "setuptools.build_meta" `; @@ -1176,7 +1176,7 @@ scope.jsii-calc-lib exports[`Generated code for "@scope/jsii-calc-lib": /python/pyproject.toml 1`] = ` [build-system] -requires = ["setuptools~=59.1.1", "wheel~=0.37.0"] +requires = ["setuptools~=59.6.0", "wheel~=0.37.0"] build-backend = "setuptools.build_meta" `; @@ -2408,7 +2408,7 @@ foo = "bar" exports[`Generated code for "jsii-calc": /python/pyproject.toml 1`] = ` [build-system] -requires = ["setuptools~=59.1.1", "wheel~=0.37.0"] +requires = ["setuptools~=59.6.0", "wheel~=0.37.0"] build-backend = "setuptools.build_meta" `; diff --git a/packages/jsii-pacmak/test/generated-code/requirements-dev.txt b/packages/jsii-pacmak/test/generated-code/requirements-dev.txt index 13c640f740..efc630cf1d 100644 --- a/packages/jsii-pacmak/test/generated-code/requirements-dev.txt +++ b/packages/jsii-pacmak/test/generated-code/requirements-dev.txt @@ -1 +1 @@ -mypy==0.910 +mypy==0.930 diff --git a/packages/jsii-reflect/package.json b/packages/jsii-reflect/package.json index e155ebebd5..5ac36e4bfd 100644 --- a/packages/jsii-reflect/package.json +++ b/packages/jsii-reflect/package.json @@ -45,9 +45,9 @@ "@scope/jsii-calc-lib": "^0.0.0", "@types/fs-extra": "^9.0.13", "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", - "eslint": "^8.4.1", - "jest": "^27.4.4", + "@types/node": "^12.20.38", + "eslint": "^8.5.0", + "jest": "^27.4.5", "jsii": "^0.0.0", "jsii-build-tools": "^0.0.0", "jsii-calc": "^3.20.120", diff --git a/packages/jsii-rosetta/bin/jsii-rosetta.ts b/packages/jsii-rosetta/bin/jsii-rosetta.ts index a3e059f18b..20ef8c46c5 100644 --- a/packages/jsii-rosetta/bin/jsii-rosetta.ts +++ b/packages/jsii-rosetta/bin/jsii-rosetta.ts @@ -82,19 +82,39 @@ function main() { describe: 'Output file to store logging results. Ignored if -log is not true', default: DEFAULT_INFUSION_RESULTS_NAME, }) + .option('cache-from', { + alias: 'C', + type: 'string', + // eslint-disable-next-line prettier/prettier + describe: + 'Reuse translations from the given tablet file if the snippet and type definitions did not change', + requiresArg: true, + default: undefined, + }) .option('cache-to', { alias: 'o', type: 'string', describe: 'Append all translated snippets to the given tablet file', requiresArg: true, default: undefined, - }), + }) + .option('cache', { + alias: 'k', + type: 'string', + describe: 'Alias for --cache-from and --cache-to together', + requiresArg: true, + default: undefined, + }) + .conflicts('cache', 'cache-from') + .conflicts('cache', 'cache-to'), wrapHandler(async (args) => { const absAssemblies = (args.ASSEMBLY.length > 0 ? args.ASSEMBLY : ['.']).map((x) => path.resolve(x)); - const cacheToFile = fmap(args['cache-to'], path.resolve); + const absCacheFrom = fmap(args.cache ?? args['cache-from'], path.resolve); + const absCacheTo = fmap(args.cache ?? args['cache-to'], path.resolve); const result = await infuse(absAssemblies, { logFile: args['log-file'], - cacheToFile: cacheToFile, + cacheToFile: absCacheTo, + cacheFromFile: absCacheFrom, }); let totalTypes = 0; diff --git a/packages/jsii-rosetta/lib/commands/extract.ts b/packages/jsii-rosetta/lib/commands/extract.ts index b43ac224b8..d878e83a85 100644 --- a/packages/jsii-rosetta/lib/commands/extract.ts +++ b/packages/jsii-rosetta/lib/commands/extract.ts @@ -37,18 +37,31 @@ export interface ExtractOptions { */ readonly trimCache?: boolean; + /** + * Write translations to implicit tablets (`.jsii.tabl.json`) + * + * @default true + */ + readonly writeToImplicitTablets?: boolean; + /** * Make a translator (just for testing) */ readonly translatorFactory?: (opts: RosettaTranslatorOptions) => RosettaTranslator; + + /** + * Turn on 'loose mode' or not + * + * Loose mode ignores failures during fixturizing, and undoes 'strict mode' for + * diagnostics. + * + * @default false + */ + readonly loose?: boolean; } -export async function extractAndInfuse( - assemblyLocations: string[], - options: ExtractOptions, - loose = false, -): Promise { - const result = await extractSnippets(assemblyLocations, options, loose); +export async function extractAndInfuse(assemblyLocations: string[], options: ExtractOptions): Promise { + const result = await extractSnippets(assemblyLocations, options); await infuse(assemblyLocations, { cacheFromFile: options.cacheFromFile, cacheToFile: options.cacheToFile, @@ -60,16 +73,15 @@ export async function extractAndInfuse( * Extract all samples from the given assemblies into a tablet */ export async function extractSnippets( - assemblyLocations: string[], + assemblyLocations: readonly string[], options: ExtractOptions = {}, - loose = false, ): Promise { const only = options.only ?? []; logging.info(`Loading ${assemblyLocations.length} assemblies`); const assemblies = await loadAssemblies(assemblyLocations, options.validateAssemblies ?? false); - let snippets = Array.from(allTypeScriptSnippets(assemblies, loose)); + let snippets = Array.from(allTypeScriptSnippets(assemblies, options.loose)); if (only.length > 0) { snippets = filterSnippets(snippets, only); } @@ -99,7 +111,7 @@ export async function extractSnippets( translator.addTabletsToCache(...Object.values(await loadAllDefaultTablets(assemblies))); if (translator.hasCache()) { - const { translations, remaining } = translator.readFromCache(snippets); + const { translations, remaining } = translator.readFromCache(snippets, true, options.includeCompilerDiagnostics); logging.info(`Reused ${translations.length} translations from cache`); snippets = remaining; } @@ -123,17 +135,19 @@ export async function extractSnippets( } // Save to individual tablet files, and optionally append to the output file - await Promise.all( - Object.entries(snippetsPerAssembly).map(async ([location, snips]) => { - const asmTabletFile = path.join(location, DEFAULT_TABLET_NAME); - logging.debug(`Writing ${snips.length} translations to ${asmTabletFile}`); - const translations = snips.map(({ key }) => translator.tablet.tryGetSnippet(key)).filter(isDefined); - - const asmTablet = new LanguageTablet(); - asmTablet.addSnippets(...translations); - await asmTablet.save(asmTabletFile); - }), - ); + if (options.writeToImplicitTablets ?? true) { + await Promise.all( + Object.entries(snippetsPerAssembly).map(async ([location, snips]) => { + const asmTabletFile = path.join(location, DEFAULT_TABLET_NAME); + logging.debug(`Writing ${snips.length} translations to ${asmTabletFile}`); + const translations = snips.map(({ key }) => translator.tablet.tryGetSnippet(key)).filter(isDefined); + + const asmTablet = new LanguageTablet(); + asmTablet.addSnippets(...translations); + await asmTablet.save(asmTabletFile); + }), + ); + } if (options.cacheToFile) { logging.info(`Adding translations to ${options.cacheToFile}`); diff --git a/packages/jsii-rosetta/lib/commands/transliterate.ts b/packages/jsii-rosetta/lib/commands/transliterate.ts index 2f00bdd7ca..4a91681342 100644 --- a/packages/jsii-rosetta/lib/commands/transliterate.ts +++ b/packages/jsii-rosetta/lib/commands/transliterate.ts @@ -10,6 +10,7 @@ import { RosettaTabletReader, UnknownSnippetMode } from '../rosetta-reader'; import { SnippetParameters, typeScriptSnippetFromVisibleSource, ApiLocation, parseMetadataLine } from '../snippet'; import { Translation } from '../tablets/tablets'; import { fmap } from '../util'; +import { extractSnippets } from './extract'; export interface TransliterateAssemblyOptions { /** @@ -53,15 +54,31 @@ export async function transliterateAssembly( targetLanguages: readonly TargetLanguage[], options: TransliterateAssemblyOptions = {}, ): Promise { - const rosetta = new RosettaTabletReader({ + // Start by doing an 'extract' for all these assemblies + // + // This will locate all examples that haven't been translated yet and translate + // them. Importantly: it will translate them in parallel, which is going to improve + // performance a lot. We ignore diagnostics. + const { tablet } = await extractSnippets(assemblyLocations, { includeCompilerDiagnostics: true, - unknownSnippets: UnknownSnippetMode.TRANSLATE, loose: options.loose, + cacheFromFile: options.tablet, + writeToImplicitTablets: false, + }); + + // Now do a regular "tablet reader" cycle, expecting everything to be translated already, + // and therefore it doesn't matter that we do this all in a single-threaded loop. + const rosetta = new RosettaTabletReader({ + unknownSnippets: UnknownSnippetMode.FAIL, targetLanguages, }); + // Put in the same caching tablet here if (options.tablet) { await rosetta.loadTabletFromFile(options.tablet); } + // Any fresh translations we just came up with + rosetta.addTablet(tablet); + const assemblies = await loadAssemblies(assemblyLocations, rosetta); for (const [location, loadAssembly] of assemblies.entries()) { diff --git a/packages/jsii-rosetta/lib/jsii/assemblies.ts b/packages/jsii-rosetta/lib/jsii/assemblies.ts index 0e1463d71d..68c63cd855 100644 --- a/packages/jsii-rosetta/lib/jsii/assemblies.ts +++ b/packages/jsii-rosetta/lib/jsii/assemblies.ts @@ -12,6 +12,7 @@ import { SnippetParameters, ApiLocation, parseMetadataLine, + INITIALIZER_METHOD_NAME, } from '../snippet'; import { enforcesStrictMode } from '../strict'; import { LanguageTablet, DEFAULT_TABLET_NAME } from '../tablets/tablets'; @@ -119,8 +120,11 @@ export function allSnippetSources(assembly: spec.Assembly): AssemblySnippetSourc if (spec.isEnumType(type)) { type.members.forEach((m) => emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name })); } + if (spec.isClassType(type)) { + emitDocsForCallable(type.initializer, type.fqn); + } if (spec.isClassOrInterfaceType(type)) { - (type.methods ?? []).forEach((m) => emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name })); + (type.methods ?? []).forEach((m) => emitDocsForCallable(m, type.fqn, m.name)); (type.properties ?? []).forEach((m) => emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name })); } }); @@ -128,6 +132,22 @@ export function allSnippetSources(assembly: spec.Assembly): AssemblySnippetSourc return ret; + function emitDocsForCallable(callable: spec.Callable | undefined, fqn: string, memberName?: string) { + if (!callable) { + return; + } + emitDocs(callable.docs, memberName ? { api: 'member', fqn, memberName } : { api: 'initializer', fqn }); + + for (const parameter of callable.parameters ?? []) { + emitDocs(parameter.docs, { + api: 'parameter', + fqn: fqn, + methodName: memberName ?? INITIALIZER_METHOD_NAME, + parameterName: parameter.name, + }); + } + } + function emitDocs(docs: spec.Docs | undefined, location: ApiLocation) { if (!docs) { return; diff --git a/packages/jsii-rosetta/lib/rosetta-reader.ts b/packages/jsii-rosetta/lib/rosetta-reader.ts index 4e96a5b674..49425be437 100644 --- a/packages/jsii-rosetta/lib/rosetta-reader.ts +++ b/packages/jsii-rosetta/lib/rosetta-reader.ts @@ -121,9 +121,7 @@ export class RosettaTabletReader { } /** - * Directly add a tablet - * - * Should only be needed for testing, use `loadTabletFromFile` and `addAssembly` instead. + * Directly add a tablet to the list of tablets to load translations from */ public addTablet(tablet: LanguageTablet) { this.loadedTablets.push(tablet); diff --git a/packages/jsii-rosetta/lib/rosetta-translator.ts b/packages/jsii-rosetta/lib/rosetta-translator.ts index 7da1fc8aa9..1a00e463c6 100644 --- a/packages/jsii-rosetta/lib/rosetta-translator.ts +++ b/packages/jsii-rosetta/lib/rosetta-translator.ts @@ -42,7 +42,13 @@ export interface RosettaTranslatorOptions { * be achieved by the rosetta CLI, use this class. */ export class RosettaTranslator { + /** + * Tablet with fresh translations + * + * All new translations (not read from cache) are added to this tablet. + */ public readonly tablet = new LanguageTablet(); + private readonly fingerprinter: TypeFingerprinter; private readonly cache = new LanguageTablet(); private readonly includeCompilerDiagnostics: boolean; @@ -83,14 +89,15 @@ export class RosettaTranslator { * * Will remove the cached snippets from the input array. */ - public readFromCache(snippets: TypeScriptSnippet[], addToTablet = true): ReadFromCacheResults { + public readFromCache(snippets: TypeScriptSnippet[], addToTablet = true, compiledOnly = false): ReadFromCacheResults { const remaining = [...snippets]; const translations = new Array(); let i = 0; while (i < remaining.length) { const fromCache = tryReadFromCache(remaining[i], this.cache, this.fingerprinter); - if (fromCache) { + // If compiledOnly is set, do not consider cached snippets that do not compile + if (fromCache && (!compiledOnly || fromCache.snippet.didCompile)) { if (addToTablet) { this.tablet.addSnippet(fromCache); } @@ -142,6 +149,13 @@ export class RosettaTranslator { function tryReadFromCache(sourceSnippet: TypeScriptSnippet, cache: LanguageTablet, fingerprinter: TypeFingerprinter) { const fromCache = cache.tryGetSnippet(snippetKey(sourceSnippet)); + // infused snippets won't pass the full source check or the fingerprinter + // but there is no reason to try to recompile it, so return cached snippet + // if there exists one. + if (isInfused(sourceSnippet)) { + return fromCache; + } + const cacheable = fromCache && completeSource(sourceSnippet) === fromCache.snippet.fullSource && @@ -153,6 +167,10 @@ function tryReadFromCache(sourceSnippet: TypeScriptSnippet, cache: LanguageTable return cacheable ? fromCache : undefined; } +function isInfused(snippet: TypeScriptSnippet) { + return snippet.parameters?.infused !== undefined; +} + export interface ReadFromCacheResults { readonly translations: TranslatedSnippet[]; readonly remaining: TypeScriptSnippet[]; diff --git a/packages/jsii-rosetta/lib/snippet.ts b/packages/jsii-rosetta/lib/snippet.ts index 3867b36b1e..0b4348ba9b 100644 --- a/packages/jsii-rosetta/lib/snippet.ts +++ b/packages/jsii-rosetta/lib/snippet.ts @@ -55,13 +55,26 @@ export interface SnippetLocation { readonly field?: FieldLocation; } +/** + * How to represent the initializer in a 'parameter' type. + * + * (Don't feel like making everyone's `case` statement worse by adding an + * 'initializer-parameter' variant). + */ +export const INITIALIZER_METHOD_NAME = ''; + export type ApiLocation = | { readonly api: 'file'; readonly fileName: string } | { readonly api: 'moduleReadme'; readonly moduleFqn: string } | { readonly api: 'type'; readonly fqn: string } | { readonly api: 'initializer'; readonly fqn: string } | { readonly api: 'member'; readonly fqn: string; readonly memberName: string } - | { readonly api: 'parameter'; readonly fqn: string; readonly methodName: string; readonly parameterName: string }; + | { + readonly api: 'parameter'; + readonly fqn: string; + readonly methodName: string | typeof INITIALIZER_METHOD_NAME; + readonly parameterName: string; + }; export type FieldLocation = { readonly field: 'markdown'; readonly line: number } | { readonly field: 'example' }; diff --git a/packages/jsii-rosetta/lib/translate.ts b/packages/jsii-rosetta/lib/translate.ts index d3f0217c13..d1f0456811 100644 --- a/packages/jsii-rosetta/lib/translate.ts +++ b/packages/jsii-rosetta/lib/translate.ts @@ -57,7 +57,9 @@ export class Translator { }), ); - this.#diagnostics.push(...translator.diagnostics); + if (snip.parameters?.infused === undefined) { + this.#diagnostics.push(...translator.diagnostics); + } return TranslatedSnippet.fromSchema({ translations: { diff --git a/packages/jsii-rosetta/lib/util.ts b/packages/jsii-rosetta/lib/util.ts index ed5a155a3e..4f618b8b60 100644 --- a/packages/jsii-rosetta/lib/util.ts +++ b/packages/jsii-rosetta/lib/util.ts @@ -20,7 +20,7 @@ export function printDiagnostics(diags: readonly RosettaDiagnostic[], stream: No } if (diags.length > maxDiags) { - stream.write(`(...and ${maxDiags - diags.length} more diagnostics not shown)`); + stream.write(`(...and ${diags.length - maxDiags} more diagnostics not shown)`); } } diff --git a/packages/jsii-rosetta/package.json b/packages/jsii-rosetta/package.json index 0749a0a0ed..eca6a9cd80 100644 --- a/packages/jsii-rosetta/package.json +++ b/packages/jsii-rosetta/package.json @@ -20,10 +20,10 @@ "@types/fs-extra": "^9.0.13", "@types/jest": "^27.0.3", "@types/mock-fs": "^4.13.1", - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "@types/workerpool": "^6.1.0", - "eslint": "^8.4.1", - "jest": "^27.4.4", + "eslint": "^8.5.0", + "jest": "^27.4.5", "jsii-build-tools": "0.0.0", "memory-streams": "^0.1.3", "mock-fs": "^5.1.2", diff --git a/packages/jsii-rosetta/test/commands/extract.test.ts b/packages/jsii-rosetta/test/commands/extract.test.ts index d15bd55df0..51406b4629 100644 --- a/packages/jsii-rosetta/test/commands/extract.test.ts +++ b/packages/jsii-rosetta/test/commands/extract.test.ts @@ -258,6 +258,75 @@ describe('with cache file', () => { }); }); +describe('non-compiling cached examples', () => { + let otherAssembly: TestJsiiModule; + let cacheToFile: string; + beforeEach(async () => { + // Create an assembly in a temp directory + otherAssembly = await TestJsiiModule.fromSource( + { + 'index.ts': ` + export class ClassA { + /** + * Some method + * @example x + */ + public someMethod() { + } + } + `, + }, + { + name: 'my_assembly', + jsii: DUMMY_JSII_CONFIG, + }, + ); + + // add non-compiling snippet to cache + cacheToFile = path.join(otherAssembly.moduleDirectory, 'test.tabl.json'); + await extract.extractSnippets([otherAssembly.moduleDirectory], { + cacheToFile, + includeCompilerDiagnostics: true, + validateAssemblies: false, + }); + + const tablet = await LanguageTablet.fromFile(cacheToFile); + expect(tablet.count).toEqual(1); + const tr = tablet.tryGetSnippet(tablet.snippetKeys[0]); + expect(tr?.snippet.didCompile).toBeFalsy(); + }); + + afterEach(async () => assembly.cleanup()); + + test('are ignored with strict mode', async () => { + // second run of extract snippets should still evaluate the snippet + // even though it is present in the cache + const translationFunction = jest.fn().mockResolvedValue({ diagnostics: [], translatedSnippets: [] }); + await extract.extractSnippets([otherAssembly.moduleDirectory], { + cacheToFile, + cacheFromFile: cacheToFile, + includeCompilerDiagnostics: true, + validateAssemblies: false, + translatorFactory: (o) => new MockTranslator(o, translationFunction), + }); + + expect(translationFunction).toHaveBeenCalledTimes(1); + }); + + test('are utilized with strict mode off', async () => { + const translationFunction = jest.fn().mockResolvedValue({ diagnostics: [], translatedSnippets: [] }); + await extract.extractSnippets([otherAssembly.moduleDirectory], { + cacheToFile, + cacheFromFile: cacheToFile, + includeCompilerDiagnostics: false, + validateAssemblies: false, + translatorFactory: (o) => new MockTranslator(o, translationFunction), + }); + + expect(translationFunction).toHaveBeenCalledTimes(0); + }); +}); + test('do not ignore example strings', async () => { // Create an assembly in a temp directory const otherAssembly = await TestJsiiModule.fromSource( @@ -363,14 +432,102 @@ test('extract and infuse in one command', async () => { expect(types!['my_assembly.ClassA'].docs?.example).toBeDefined(); }); -test('infused examples skip loose mode', async () => { +describe('infused examples', () => { + let infusedAssembly: TestJsiiModule; + beforeEach(async () => { + infusedAssembly = await TestJsiiModule.fromSource( + { + 'index.ts': ` + /** + * ClassA + * + * @exampleMetadata infused + * @example x + */ + export class ClassA { + public someMethod() { + } + } + `, + }, + { + name: 'my_assembly', + jsii: DUMMY_JSII_CONFIG, + }, + ); + }); + + afterEach(async () => { + await infusedAssembly.cleanup(); + }); + + test('always returned from cache', async () => { + const cacheFile = path.join(infusedAssembly.moduleDirectory, 'test.tabl.json'); + + // Cache to file + await extract.extractSnippets([infusedAssembly.moduleDirectory], { + cacheToFile: cacheFile, + ...defaultExtractOptions, + }); + + // Update the example with a fixture that would fail compilation + // Nothing like this should happen in practice + infusedAssembly.assembly.types!['my_assembly.ClassA'].docs!.custom!.exampleMetadata = + 'infused fixture=myfix.ts-fixture'; + await infusedAssembly.updateAssembly(); + + // Expect to return cached snippet regardless of change + // No compilation should happen + const translationFunction = jest.fn().mockResolvedValue({ diagnostics: [], translatedSnippets: [] }); + await extract.extractSnippets([infusedAssembly.moduleDirectory], { + cacheFromFile: cacheFile, + ...defaultExtractOptions, + translatorFactory: (o) => new MockTranslator(o, translationFunction), + }); + + expect(translationFunction).not.toHaveBeenCalled(); + }); + + test('skip loose mode', async () => { + // Remove infused for now and add lit metadata that should fail + infusedAssembly.assembly.types!['my_assembly.ClassA'].docs!.custom!.exampleMetadata = 'lit=integ.test.ts'; + await infusedAssembly.updateAssembly(); + + const cacheToFile = path.join(infusedAssembly.moduleDirectory, 'test.tabl.json'); + + // Without exampleMetadata infused, expect an error + await expect( + extract.extractSnippets([infusedAssembly.moduleDirectory], { + cacheToFile, + ...defaultExtractOptions, + }), + ).rejects.toThrowError(/Sample uses literate source/); + + // Add infused to metadata and update assembly + infusedAssembly.assembly.types!['my_assembly.ClassA'].docs!.custom!.exampleMetadata = 'lit=integ.test.ts infused'; + await infusedAssembly.updateAssembly(); + + // Expect same function call to succeed now + await extract.extractSnippets([infusedAssembly.moduleDirectory], { + cacheToFile, + ...defaultExtractOptions, + }); + + const tablet = await LanguageTablet.fromFile(cacheToFile); + expect(tablet.count).toEqual(1); + const tr = tablet.tryGetSnippet(tablet.snippetKeys[0]); + expect(tr?.originalSource.source).toEqual('x'); + }); +}); + +test('infused examples have no diagnostics', async () => { const otherAssembly = await TestJsiiModule.fromSource( { 'index.ts': ` /** * ClassA * - * @exampleMetadata lit=integ.test.ts + * @exampleMetadata infused * @example x */ export class ClassA { @@ -381,35 +538,21 @@ test('infused examples skip loose mode', async () => { }, { name: 'my_assembly', - jsii: DUMMY_JSII_CONFIG, + jsii: { + ...DUMMY_JSII_CONFIG, + }, }, ); try { const cacheToFile = path.join(otherAssembly.moduleDirectory, 'test.tabl.json'); - // Without exampleMetadata infused=true, expect an error - await expect( - extract.extractSnippets([otherAssembly.moduleDirectory], { - cacheToFile, - ...defaultExtractOptions, - }), - ).rejects.toThrowError(/Sample uses literate source/); - - // Add infused=true to metadata and update assembly - otherAssembly.assembly.types!['my_assembly.ClassA'].docs!.custom!.exampleMetadata = - 'lit=integ.test.ts infused=true'; - await otherAssembly.updateAssembly(); - - // Expect same function call to succeed now - await extract.extractSnippets([otherAssembly.moduleDirectory], { + const results = await extract.extractSnippets([otherAssembly.moduleDirectory], { cacheToFile, - ...defaultExtractOptions, + includeCompilerDiagnostics: true, + loose: false, }); - const tablet = await LanguageTablet.fromFile(cacheToFile); - expect(tablet.count).toEqual(1); - const tr = tablet.tryGetSnippet(tablet.snippetKeys[0]); - expect(tr?.originalSource.source).toEqual('x'); + expect(results.diagnostics).toEqual([]); } finally { await otherAssembly.cleanup(); } diff --git a/packages/jsii/bin/jsii.ts b/packages/jsii/bin/jsii.ts index fa7cfe0c5b..a3bc2f301e 100644 --- a/packages/jsii/bin/jsii.ts +++ b/packages/jsii/bin/jsii.ts @@ -2,6 +2,7 @@ import '@jsii/check-node/run'; import * as log4js from 'log4js'; import * as path from 'path'; +import * as util from 'util'; import * as yargs from 'yargs'; import { Compiler } from '../lib/compiler'; @@ -132,15 +133,26 @@ const warningTypes = Object.keys(enabledWarnings); }); function _configureLog4js(verbosity: number) { + const stderrColor = !!process.stderr.isTTY; + const stdoutColor = !!process.stdout.isTTY; + + log4js.addLayout('passThroughNoColor', () => { + return (loggingEvent) => stripAnsi(util.format(...loggingEvent.data)); + }); + log4js.configure({ appenders: { console: { type: 'stderr', - layout: { type: 'colored' }, + layout: { type: stderrColor ? 'colored' : 'basic' }, }, [utils.DIAGNOSTICS]: { type: 'stdout', - layout: { type: 'messagePassThrough' }, + layout: { + type: stdoutColor + ? 'messagePassThrough' + : ('passThroughNoColor' as any), + }, }, }, categories: { @@ -168,3 +180,11 @@ function _configureLog4js(verbosity: number) { } } } + +const ANSI_REGEX = + // eslint-disable-next-line no-control-regex + /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; + +function stripAnsi(x: string): string { + return x.replace(ANSI_REGEX, ''); +} diff --git a/packages/jsii/lib/project-info.ts b/packages/jsii/lib/project-info.ts index 01f4f67858..8f0e6611f7 100644 --- a/packages/jsii/lib/project-info.ts +++ b/packages/jsii/lib/project-info.ts @@ -3,7 +3,6 @@ import * as fs from 'fs-extra'; import * as log4js from 'log4js'; import * as path from 'path'; import * as semver from 'semver'; -import { intersect } from 'semver-intersect'; import * as ts from 'typescript'; import { JsiiDiagnostic } from './jsii-diagnostic'; @@ -120,23 +119,19 @@ export async function loadProjectInfo( } } - const transitiveAssemblies: { [name: string]: spec.Assembly } = {}; - const assemblyCache = new Map(); - const dependencies = await _loadDependencies( - pkg.dependencies, - projectRoot, - transitiveAssemblies, - assemblyCache, - new Set(Object.keys(bundleDependencies ?? {})), - ); - const peerDependencies = await _loadDependencies( - pkg.peerDependencies, - projectRoot, - transitiveAssemblies, - assemblyCache, + const bundled = new Set(Object.keys(bundleDependencies ?? {})); + const dependencies: Record = filterDictByKey( + pkg.dependencies ?? {}, + (depName) => !bundled.has(depName), ); + const peerDependencies: Record = pkg.peerDependencies ?? {}; - const transitiveDependencies = Object.values(transitiveAssemblies); + const resolver = new DependencyResolver(); + const resolved = await resolver.discoverDependencyTree(projectRoot, { + ...dependencies, + ...peerDependencies, + }); + const transitiveDependencies = resolver.assemblyClosure(resolved); const metadata = mergeMetadata( { @@ -235,24 +230,72 @@ function _guessRepositoryType(url: string): string { ); } -async function _loadDependencies( - dependencies: { [name: string]: string } | undefined, - searchPath: string, - transitiveAssemblies: { [name: string]: spec.Assembly }, - assemblyCache: Map, - bundled = new Set(), -): Promise<{ [name: string]: string }> { - if (!dependencies) { - return {}; +interface DependencyInfo { + readonly assembly: spec.Assembly; + readonly resolvedDependencies: Record; +} + +class DependencyResolver { + private readonly cache = new Map(); + + /** + * Discover the dependency tree starting at 'root', validating versions as we go along + * + * This primes the data structures in this class and should be called first. + * + * Return the resolved jsii dependency paths + */ + public async discoverDependencyTree( + root: string, + dependencies: Record, + ): Promise> { + const ret: Record = {}; + for (const [name, declaration] of Object.entries(dependencies)) { + // eslint-disable-next-line no-await-in-loop + const resolved = await this.resolveDependency(root, name, declaration); + + const actualVersion = resolved.dependencyInfo.assembly.version; + if (!semver.satisfies(actualVersion, declaration)) { + throw new Error( + `Declared dependency on version ${declaration} of ${name}, but version ${actualVersion} was found`, + ); + } + + ret[name] = resolved.resolvedFile; + } + return ret; } - const packageVersions: { [name: string]: string } = {}; - for (const name of Object.keys(dependencies)) { - if (bundled.has(name)) { - continue; + + /** + * From a set of resolved paths, recursively return all assemblies + */ + public assemblyClosure(resolved: Record): spec.Assembly[] { + const closure = new Map(); + const queue = Array.from(Object.values(resolved)); + while (queue.length > 0) { + const next = queue.shift()!; + const resolved = this.cache.get(next); + if (!resolved) { + throw new Error(`Path ${next} not seen before`); + } + if (closure.has(next)) { + continue; + } + + closure.set(next, resolved.assembly); + queue.push(...Object.values(resolved.resolvedDependencies)); } + return Array.from(closure.values()); + } + + private async resolveDependency( + root: string, + name: string, + declaration: string, + ) { const { version: versionString, localPackage } = _resolveVersion( - dependencies[name], - searchPath, + declaration, + root, ); const version = new semver.Range(versionString); if (!version) { @@ -260,50 +303,50 @@ async function _loadDependencies( `Invalid semver expression for ${name}: ${versionString}`, ); } - // eslint-disable-next-line no-await-in-loop - const pkg = await _tryResolveAssembly(name, localPackage, searchPath); - LOG.debug(`Resolved dependency ${name} to ${pkg}`); - // eslint-disable-next-line no-await-in-loop - const assm = await loadAndValidateAssembly(pkg, assemblyCache); - if (!semver.satisfies(assm.version, version)) { - throw new Error( - `Declared dependency on version ${versionString} of ${name}, but version ${assm.version} was found`, - ); - } - packageVersions[assm.name] = - packageVersions[assm.name] != null - ? intersect(versionString, packageVersions[assm.name]) - : versionString; - transitiveAssemblies[assm.name] = assm; - const pkgDir = path.dirname(pkg); - if (assm.dependencies) { - // eslint-disable-next-line no-await-in-loop - await _loadDependencies( - assm.dependencies, - pkgDir, - transitiveAssemblies, - assemblyCache, - ); + const jsiiFile = await _tryResolveAssembly(name, localPackage, root); + LOG.debug(`Resolved dependency ${name} to ${jsiiFile}`); + return { + resolvedVersion: versionString, + resolvedFile: jsiiFile, + dependencyInfo: await this.loadAssemblyAndRecurse(jsiiFile), + }; + } + + private async loadAssemblyAndRecurse(jsiiFile: string) { + // Only recurse if we haven't seen this assembly yet + if (this.cache.has(jsiiFile)) { + return this.cache.get(jsiiFile)!; } + + // eslint-disable-next-line no-await-in-loop + const assembly = await this.loadAssembly(jsiiFile); + // Continue loading any dependencies declared in the asm + + const resolvedDependencies = assembly.dependencies + ? await this.discoverDependencyTree( + path.dirname(jsiiFile), + assembly.dependencies, + ) + : {}; + + const depInfo: DependencyInfo = { + assembly, + resolvedDependencies, + }; + this.cache.set(jsiiFile, depInfo); + return depInfo; } - return packageVersions; -} -/** - * Load a JSII filename and validate it; cached to avoid redundant loads of the same JSII assembly - */ -async function loadAndValidateAssembly( - jsiiFileName: string, - cache: Map, -): Promise { - if (!cache.has(jsiiFileName)) { + /** + * Load a JSII filename and validate it; cached to avoid redundant loads of the same JSII assembly + */ + private async loadAssembly(jsiiFileName: string): Promise { try { - cache.set(jsiiFileName, await fs.readJson(jsiiFileName)); + return await fs.readJson(jsiiFileName); } catch (e) { throw new Error(`Error loading ${jsiiFileName}: ${e}`); } } - return cache.get(jsiiFileName)!; } function _required(value: T, message: string): T { @@ -518,3 +561,16 @@ function _loadDiagnostics(entries?: { [key: string]: string }): } return result; } + +function filterDictByKey( + xs: Record, + predicate: (key: string) => boolean, +): Record { + const ret: Record = {}; + for (const [key, value] of Object.entries(xs)) { + if (predicate(key)) { + ret[key] = value; + } + } + return ret; +} diff --git a/packages/jsii/package.json b/packages/jsii/package.json index 4ee56f67dd..ca41de5e0a 100644 --- a/packages/jsii/package.json +++ b/packages/jsii/package.json @@ -54,14 +54,14 @@ "@types/deep-equal": "^1.0.1", "@types/fs-extra": "^9.0.13", "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", + "@types/node": "^12.20.38", "@types/semver": "^7.3.9", "clone": "^2.1.2", - "eslint": "^8.4.1", - "jest": "^27.4.4", + "eslint": "^8.5.0", + "jest": "^27.4.5", "jest-expect-message": "^1.0.2", "jsii-build-tools": "^0.0.0", "prettier": "^2.5.1", - "ts-jest": "^27.1.1" + "ts-jest": "^27.1.2" } } diff --git a/packages/jsii/test/submodules.test.ts b/packages/jsii/test/submodules.test.ts index 7d117358d4..99b3a0d61b 100644 --- a/packages/jsii/test/submodules.test.ts +++ b/packages/jsii/test/submodules.test.ts @@ -58,54 +58,196 @@ test('submodules loaded from directories can have targets', async () => { ); }); -test('can reference classes in submodules via direct import', () => - TestWorkspace.withWorkspace(async (ws) => { - // There are 2 import styles: - // - // import { submodule } from 'lib'; - // import * as submodule from 'lib/submodule'; - // - // We need to support both import styles. - - // Dependency that exports a submodule - await ws.addDependency( - await compileJsiiForTest({ - 'index.ts': 'export * as submodule from "./subdir"', - 'subdir/index.ts': 'export class Foo { }', - 'subdir/README.md': 'This is the README', - }), - ); - - // Main library that imports the submodule class directly - const result = await compileJsiiForTest( - { - 'index.ts': ` - import { Foo } from 'testpkg/subdir'; +type ImportStyle = 'directly' | 'as namespace' | 'with alias'; + +test.each(['directly', 'as namespace', 'with alias'] as ImportStyle[])( + 'can reference submodule types, importing %s', + (importStyle) => + TestWorkspace.withWorkspace(async (ws) => { + // There are 2 import styles: + // + // import { submodule } from 'lib'; + // import * as submodule from 'lib/submodule'; + // + // We need to support both import styles. + + // Dependency that exports a submodule + await ws.addDependency( + await compileJsiiForTest({ + 'index.ts': 'export * as submodule from "./subdir"', + 'subdir/index.ts': [ + 'export class Foo { };', + 'export interface FooInterface { readonly value?: string }', + 'export interface IProtocol { readonly value?: string; }', + ].join('\n'), + 'subdir/README.md': 'This is the README', + }), + ); + + let importStatement; + let prefix; + switch (importStyle) { + case 'directly': + importStatement = + "import { Foo, FooInterface, IProtocol } from 'testpkg/subdir'"; + prefix = ''; + break; + case 'as namespace': + importStatement = "import { submodule } from 'testpkg'"; + prefix = 'submodule.'; + break; + case 'with alias': + importStatement = "import { submodule as sub } from 'testpkg'"; + prefix = 'sub.'; + break; + } + + // Main library that imports the submodule class directly + // Use the type in all possible positions + const result = await compileJsiiForTest( + { + 'index.ts': ` + ${importStatement}; + + export interface BarProps { + readonly foo?: ${prefix}Foo; + } export class Bar { - constructor(public readonly foo: Foo) { } + constructor(public readonly foo: ${prefix}Foo, props: BarProps = {}) { + Array.isArray(props); + } + + public returnValue(): ${prefix}Foo { + return new ${prefix}Foo(); + } } + + export class SubFoo extends ${prefix}Foo {} + export interface SubInterface extends ${prefix}FooInterface {} + export class Implementor implements ${prefix}IProtocol {} `, - }, - { - packageJson: { - // Must be a different name from the dependency - name: 'consumerpkg', - peerDependencies: { testpkg: '*' }, }, - compilationDirectory: ws.rootDirectory, - }, - ); - - expect( - (result.assembly.types?.['consumerpkg.Bar'] as spec.ClassType) - ?.initializer?.parameters, - ).toEqual([ - { - name: 'foo', - type: { - fqn: 'testpkg.submodule.Foo', + { + packageJson: { + // Must be a different name from the dependency + name: 'consumerpkg', + peerDependencies: { testpkg: '*' }, + }, + compilationDirectory: ws.rootDirectory, }, - }, - ]); - })); + ); + + expect( + (result.assembly.types?.['consumerpkg.Bar'] as spec.ClassType) + ?.initializer?.parameters, + ).toEqual([ + { + name: 'foo', + type: { fqn: 'testpkg.submodule.Foo' }, + }, + { + name: 'props', + optional: true, + type: { fqn: 'consumerpkg.BarProps' }, + }, + ]); + }), +); + +test.each(['directly', 'as namespace', 'with alias'] as ImportStyle[])( + 'can reference nested types in submodules, importing %s', + (importStyle) => + TestWorkspace.withWorkspace(async (ws) => { + // There are 2 import styles: + // + // import { submodule } from 'lib'; + // import * as submodule from 'lib/submodule'; + // + // We need to support both import styles. + + // Dependency that exports a submodule + await ws.addDependency( + await compileJsiiForTest({ + 'index.ts': 'export * as submodule from "./subdir"', + 'subdir/index.ts': [ + 'export class Namespace {};', + 'export namespace Namespace {', + ' export class Foo { };', + ' export interface FooInterface { readonly value?: string }', + ' export interface IProtocol { readonly value?: string; }', + '}', + ].join('\n'), + 'subdir/README.md': 'This is the README', + }), + ); + + let importStatement; + let prefix; + switch (importStyle) { + case 'directly': + importStatement = "import { Namespace } from 'testpkg/subdir'"; + prefix = 'Namespace.'; + break; + case 'as namespace': + importStatement = "import { submodule } from 'testpkg'"; + prefix = 'submodule.Namespace.'; + break; + case 'with alias': + importStatement = "import { submodule as sub } from 'testpkg'"; + prefix = 'sub.Namespace.'; + break; + } + + // Main library that imports the submodule class directly + // Use the type in all possible positions + const result = await compileJsiiForTest( + { + 'index.ts': ` + ${importStatement}; + + export interface BarProps { + readonly foo?: ${prefix}Foo; + } + + export class Bar { + constructor(public readonly foo: ${prefix}Foo, props: BarProps = {}) { + Array.isArray(props); + } + + public returnValue(): ${prefix}Foo { + return new ${prefix}Foo(); + } + } + + export class SubFoo extends ${prefix}Foo {} + export interface SubInterface extends ${prefix}FooInterface {} + export class Implementor implements ${prefix}IProtocol {} + `, + }, + { + packageJson: { + // Must be a different name from the dependency + name: 'consumerpkg', + peerDependencies: { testpkg: '*' }, + }, + compilationDirectory: ws.rootDirectory, + }, + ); + + expect( + (result.assembly.types?.['consumerpkg.Bar'] as spec.ClassType) + ?.initializer?.parameters, + ).toEqual([ + { + name: 'foo', + type: { fqn: 'testpkg.submodule.Namespace.Foo' }, + }, + { + name: 'props', + optional: true, + type: { fqn: 'consumerpkg.BarProps' }, + }, + ]); + }), +); diff --git a/packages/oo-ascii-tree/package.json b/packages/oo-ascii-tree/package.json index d83af25dbe..97aca21143 100644 --- a/packages/oo-ascii-tree/package.json +++ b/packages/oo-ascii-tree/package.json @@ -32,9 +32,9 @@ }, "devDependencies": { "@types/jest": "^27.0.3", - "@types/node": "^12.20.37", - "eslint": "^8.4.1", - "jest": "^27.4.4", + "@types/node": "^12.20.38", + "eslint": "^8.5.0", + "jest": "^27.4.5", "jsii-build-tools": "^0.0.0", "prettier": "^2.5.1", "typescript": "~3.9.10" diff --git a/tools/jsii-compliance/package.json b/tools/jsii-compliance/package.json index 330f39132b..e25e4922e2 100644 --- a/tools/jsii-compliance/package.json +++ b/tools/jsii-compliance/package.json @@ -16,8 +16,8 @@ "tablemark": "^2.0.0" }, "devDependencies": { - "@types/node": "^12.20.37", - "eslint": "^8.4.1", + "@types/node": "^12.20.38", + "eslint": "^8.5.0", "prettier": "^2.5.1", "ts-node": "^10.4.0", "typescript": "~3.9.10" diff --git a/yarn.lock b/yarn.lock index 6fd133b9e4..14ebffdcd5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,18 +15,18 @@ integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.7.5": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" - integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.5.tgz#924aa9e1ae56e1e55f7184c8bf073a50d8677f5c" + integrity sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ== dependencies: "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helpers" "^7.16.0" - "@babel/parser" "^7.16.0" + "@babel/generator" "^7.16.5" + "@babel/helper-compilation-targets" "^7.16.3" + "@babel/helper-module-transforms" "^7.16.5" + "@babel/helpers" "^7.16.5" + "@babel/parser" "^7.16.5" "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" + "@babel/traverse" "^7.16.5" "@babel/types" "^7.16.0" convert-source-map "^1.7.0" debug "^4.1.0" @@ -35,16 +35,16 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.16.0", "@babel/generator@^7.7.2": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" - integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== +"@babel/generator@^7.16.5", "@babel/generator@^7.7.2": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.5.tgz#26e1192eb8f78e0a3acaf3eede3c6fc96d22bedf" + integrity sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA== dependencies: "@babel/types" "^7.16.0" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-compilation-targets@^7.16.0": +"@babel/helper-compilation-targets@^7.16.3": version "7.16.3" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== @@ -54,6 +54,13 @@ browserslist "^4.17.5" semver "^6.3.0" +"@babel/helper-environment-visitor@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz#f6a7f38b3c6d8b07c88faea083c46c09ef5451b8" + integrity sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-function-name@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" @@ -77,13 +84,6 @@ dependencies: "@babel/types" "^7.16.0" -"@babel/helper-member-expression-to-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" - integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== - dependencies: - "@babel/types" "^7.16.0" - "@babel/helper-module-imports@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" @@ -91,41 +91,24 @@ dependencies: "@babel/types" "^7.16.0" -"@babel/helper-module-transforms@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" - integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== +"@babel/helper-module-transforms@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz#530ebf6ea87b500f60840578515adda2af470a29" + integrity sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ== dependencies: + "@babel/helper-environment-visitor" "^7.16.5" "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" "@babel/helper-simple-access" "^7.16.0" "@babel/helper-split-export-declaration" "^7.16.0" "@babel/helper-validator-identifier" "^7.15.7" "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-optimise-call-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" - integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== - dependencies: + "@babel/traverse" "^7.16.5" "@babel/types" "^7.16.0" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-replace-supers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" - integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz#afe37a45f39fce44a3d50a7958129ea5b1a5c074" + integrity sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ== "@babel/helper-simple-access@^7.16.0": version "7.16.0" @@ -151,13 +134,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== -"@babel/helpers@^7.16.0": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" - integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== +"@babel/helpers@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.5.tgz#29a052d4b827846dd76ece16f565b9634c554ebd" + integrity sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw== dependencies: "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.3" + "@babel/traverse" "^7.16.5" "@babel/types" "^7.16.0" "@babel/highlight@^7.16.0": @@ -169,10 +152,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.0", "@babel/parser@^7.16.3", "@babel/parser@^7.7.2": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" - integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.0", "@babel/parser@^7.16.5", "@babel/parser@^7.7.2": + version "7.16.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.6.tgz#8f194828193e8fa79166f34a4b4e52f3e769a314" + integrity sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -259,16 +242,16 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz#2feeb13d9334cc582ea9111d3506f773174179bb" - integrity sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ== + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.5.tgz#f47a33e4eee38554f00fb6b2f894fa1f5649b0b3" + integrity sha512-/d4//lZ1Vqb4mZ5xTep3dDK888j7BGM/iKqBmndBaoYAFPlPKrGU608VVBz5JeyAb6YQDjRu1UKqj86UhwWVgw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.5" "@babel/runtime@^7.14.6", "@babel/runtime@^7.7.6": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" - integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.5.tgz#7f3e34bf8bdbbadf03fbb7b1ea0d929569c9487a" + integrity sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA== dependencies: regenerator-runtime "^0.13.4" @@ -281,17 +264,18 @@ "@babel/parser" "^7.16.0" "@babel/types" "^7.16.0" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.7.2": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" - integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.16.5", "@babel/traverse@^7.7.2": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.5.tgz#d7d400a8229c714a59b87624fc67b0f1fbd4b2b3" + integrity sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ== dependencies: "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" + "@babel/generator" "^7.16.5" + "@babel/helper-environment-visitor" "^7.16.5" "@babel/helper-function-name" "^7.16.0" "@babel/helper-hoist-variables" "^7.16.0" "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.3" + "@babel/parser" "^7.16.5" "@babel/types" "^7.16.0" debug "^4.1.0" globals "^11.1.0" @@ -396,15 +380,15 @@ jest-util "^27.4.2" slash "^3.0.0" -"@jest/core@^27.4.4": - version "27.4.4" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.4.4.tgz#f2ba293235ca23fb48b4b923ccfe67c17e791a92" - integrity sha512-xBNPVqYAdAiAMXnb4ugx9Cdmr0S52lBsLbQMR/sGBRO0810VSPKiuSDtuup6qdkK1e9vxbv3KK3IAP1QFAp8mw== +"@jest/core@^27.4.5": + version "27.4.5" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.4.5.tgz#cae2dc34259782f4866c6606c3b480cce920ed4c" + integrity sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ== dependencies: "@jest/console" "^27.4.2" - "@jest/reporters" "^27.4.4" + "@jest/reporters" "^27.4.5" "@jest/test-result" "^27.4.2" - "@jest/transform" "^27.4.4" + "@jest/transform" "^27.4.5" "@jest/types" "^27.4.2" "@types/node" "*" ansi-escapes "^4.2.1" @@ -413,15 +397,15 @@ exit "^0.1.2" graceful-fs "^4.2.4" jest-changed-files "^27.4.2" - jest-config "^27.4.4" - jest-haste-map "^27.4.4" + jest-config "^27.4.5" + jest-haste-map "^27.4.5" jest-message-util "^27.4.2" jest-regex-util "^27.4.0" - jest-resolve "^27.4.4" - jest-resolve-dependencies "^27.4.4" - jest-runner "^27.4.4" - jest-runtime "^27.4.4" - jest-snapshot "^27.4.4" + jest-resolve "^27.4.5" + jest-resolve-dependencies "^27.4.5" + jest-runner "^27.4.5" + jest-runtime "^27.4.5" + jest-snapshot "^27.4.5" jest-util "^27.4.2" jest-validate "^27.4.2" jest-watcher "^27.4.2" @@ -461,15 +445,15 @@ "@jest/types" "^27.4.2" expect "^27.4.2" -"@jest/reporters@^27.4.4": - version "27.4.4" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.4.4.tgz#9e809829f602cd6e68bd058d1ea528f4b7482365" - integrity sha512-ssyJSw9B9Awb1QaxDhIPSs4de1b7SE2kv7tqFehQL13xpn5HUkMYZK/ufTOXiCAnXFOZS+XDl1GaQ/LmJAzI1A== +"@jest/reporters@^27.4.5": + version "27.4.5" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.4.5.tgz#e229acca48d18ea39e805540c1c322b075ae63ad" + integrity sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA== dependencies: "@bcoe/v8-coverage" "^0.2.3" "@jest/console" "^27.4.2" "@jest/test-result" "^27.4.2" - "@jest/transform" "^27.4.4" + "@jest/transform" "^27.4.5" "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" @@ -482,10 +466,10 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.2" - jest-haste-map "^27.4.4" - jest-resolve "^27.4.4" + jest-haste-map "^27.4.5" + jest-resolve "^27.4.5" jest-util "^27.4.2" - jest-worker "^27.4.4" + jest-worker "^27.4.5" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" @@ -511,20 +495,20 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^27.4.4": - version "27.4.4" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.4.4.tgz#60be14369b2702e42d6042e71b8ab3fc69f5ce68" - integrity sha512-mCh+d4JTGTtX7vr13d7q2GHJy33nAobEwtEJ8X3u7R8+0ImVO2eAsQzsLfX8lyvdYHBxYABhqbYuaUNo42/pQw== +"@jest/test-sequencer@^27.4.5": + version "27.4.5" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz#1d7e026844d343b60d2ca7fd82c579a17b445d7d" + integrity sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ== dependencies: "@jest/test-result" "^27.4.2" graceful-fs "^4.2.4" - jest-haste-map "^27.4.4" - jest-runtime "^27.4.4" + jest-haste-map "^27.4.5" + jest-runtime "^27.4.5" -"@jest/transform@^27.4.4": - version "27.4.4" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.4.4.tgz#347e39402730879ba88c6ea6982db0d88640aa78" - integrity sha512-7U/nDSrGsGzL7+X8ScNFV71w8u8knJQWSa9C2xsrrKLMOgb+rWuCG4VAyWke/53BU96GnT+Ka81xCAHA5gk6zA== +"@jest/transform@^27.4.5": + version "27.4.5" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.4.5.tgz#3dfe2e3680cd4aa27356172bf25617ab5b94f195" + integrity sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew== dependencies: "@babel/core" "^7.1.0" "@jest/types" "^27.4.2" @@ -533,7 +517,7 @@ convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.2.4" - jest-haste-map "^27.4.4" + jest-haste-map "^27.4.5" jest-regex-util "^27.4.0" jest-util "^27.4.2" micromatch "^4.0.4" @@ -1518,9 +1502,9 @@ dotenv "*" "@types/eslint-scope@^3.7.0": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" - integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== + version "3.7.2" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.2.tgz#11e96a868c67acf65bf6f11d10bb89ea71d5e473" + integrity sha512-TzgYCWoPiTeRg6RQYgtuW7iODtVoKu3RVL72k3WohqhjfaOLK5Mg2T4Tg1o2bSfu0vPkoI48wdQFv5b/Xe04wQ== dependencies: "@types/eslint" "*" "@types/estree" "*" @@ -1621,15 +1605,20 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^16.9.2": - version "16.11.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.12.tgz#ac7fb693ac587ee182c3780c26eb65546a1a3c10" - integrity sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw== +"@types/node@*": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.2.tgz#a4c07d47ff737e8ee7e586fe636ff0e1ddff070a" + integrity sha512-JepeIUPFDARgIs0zD/SKPgFsJEAF0X5/qO80llx59gOxFTboS9Amv3S+QfB7lqBId5sFXJ99BN0J6zFRvL9dDA== + +"@types/node@^12.20.38": + version "12.20.38" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.38.tgz#74801983c0558a7a31a4ead18bce2edded2b0e2f" + integrity sha512-NxmtBRGipjx1B225OeMdI+CQmLbYqvvmYbukDTJGDgzIDgPQ1EcjGmYxGhOk5hTBqeB558S6RgHSpq2iiqifAQ== -"@types/node@^12.20.37": - version "12.20.37" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.37.tgz#abb38afa9d6e8a2f627a8cb52290b3c80fbe61ed" - integrity sha512-i1KGxqcvJaLQali+WuypQnXwcplhtNtjs66eNsZpp2P2FL/trJJxx/VWsM0YCL2iMoIJrbXje48lvIQAQ4p2ZA== +"@types/node@^16.9.2": + version "16.11.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.15.tgz#724da13bc1ba99fe8190d0f5cd35cb53c67db942" + integrity sha512-LMGR7iUjwZRxoYnfc9+YELxwqkaLmkJlo4/HUvOMyGvw9DaHO0gtAbH2FUdoFE6PXBTYZIT7x610r7kdo8o1fQ== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -1712,13 +1701,13 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.6.0.tgz#efd8668b3d6627c46ce722c2afe813928fe120a0" - integrity sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA== +"@typescript-eslint/eslint-plugin@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.0.tgz#52cd9305ceef98a5333f9492d519e6c6c7fe7d43" + integrity sha512-spu1UW7QuBn0nJ6+psnfCc3iVoQAifjKORgBngKOmC8U/1tbe2YJMzYQqDGYB4JCss7L8+RM2kKLb1B1Aw9BNA== dependencies: - "@typescript-eslint/experimental-utils" "5.6.0" - "@typescript-eslint/scope-manager" "5.6.0" + "@typescript-eslint/experimental-utils" "5.8.0" + "@typescript-eslint/scope-manager" "5.8.0" debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" @@ -1726,60 +1715,60 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz#f3a5960f2004abdcac7bb81412bafc1560841c23" - integrity sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA== +"@typescript-eslint/experimental-utils@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.0.tgz#0916ffe98d34b3c95e3652efa0cace61a7b25728" + integrity sha512-KN5FvNH71bhZ8fKtL+lhW7bjm7cxs1nt+hrDZWIqb6ViCffQcWyLunGrgvISgkRojIDcXIsH+xlFfI4RCDA0xA== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.6.0" - "@typescript-eslint/types" "5.6.0" - "@typescript-eslint/typescript-estree" "5.6.0" + "@typescript-eslint/scope-manager" "5.8.0" + "@typescript-eslint/types" "5.8.0" + "@typescript-eslint/typescript-estree" "5.8.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/parser@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.6.0.tgz#11677324659641400d653253c03dcfbed468d199" - integrity sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ== +"@typescript-eslint/parser@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.8.0.tgz#b39970b21c1d7bc4a6018507fb29b380328d2587" + integrity sha512-Gleacp/ZhRtJRYs5/T8KQR3pAQjQI89Dn/k+OzyCKOsLiZH2/Vh60cFBTnFsHNI6WAD+lNUo/xGZ4NeA5u0Ipw== dependencies: - "@typescript-eslint/scope-manager" "5.6.0" - "@typescript-eslint/types" "5.6.0" - "@typescript-eslint/typescript-estree" "5.6.0" + "@typescript-eslint/scope-manager" "5.8.0" + "@typescript-eslint/types" "5.8.0" + "@typescript-eslint/typescript-estree" "5.8.0" debug "^4.3.2" -"@typescript-eslint/scope-manager@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.6.0.tgz#9dd7f007dc8f3a34cdff6f79f5eaab27ae05157e" - integrity sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A== +"@typescript-eslint/scope-manager@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.8.0.tgz#2371095b4fa4c7be6a80b380f4e1b49c715e16f4" + integrity sha512-x82CYJsLOjPCDuFFEbS6e7K1QEWj7u5Wk1alw8A+gnJiYwNnDJk0ib6PCegbaPMjrfBvFKa7SxE3EOnnIQz2Gg== dependencies: - "@typescript-eslint/types" "5.6.0" - "@typescript-eslint/visitor-keys" "5.6.0" + "@typescript-eslint/types" "5.8.0" + "@typescript-eslint/visitor-keys" "5.8.0" -"@typescript-eslint/types@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.6.0.tgz#745cb1b59daadcc1f32f7be95f0f68accf38afdd" - integrity sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA== +"@typescript-eslint/types@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.8.0.tgz#e7fa74ec35d9dbe3560d039d3d8734986c3971e0" + integrity sha512-LdCYOqeqZWqCMOmwFnum6YfW9F3nKuxJiR84CdIRN5nfHJ7gyvGpXWqL/AaW0k3Po0+wm93ARAsOdzlZDPCcXg== -"@typescript-eslint/typescript-estree@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz#dfbb19c9307fdd81bd9c650c67e8397821d7faf0" - integrity sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA== +"@typescript-eslint/typescript-estree@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.0.tgz#900469ba9d5a37f4482b014ecce4a5dbb86cb4dd" + integrity sha512-srfeZ3URdEcUsSLbkOFqS7WoxOqn8JNil2NSLO9O+I2/Uyc85+UlfpEvQHIpj5dVts7KKOZnftoJD/Fdv0L7nQ== dependencies: - "@typescript-eslint/types" "5.6.0" - "@typescript-eslint/visitor-keys" "5.6.0" + "@typescript-eslint/types" "5.8.0" + "@typescript-eslint/visitor-keys" "5.8.0" debug "^4.3.2" globby "^11.0.4" is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz#3e36509e103fe9713d8f035ac977235fd63cb6e6" - integrity sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng== +"@typescript-eslint/visitor-keys@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.0.tgz#22d4ed96fe2451135299239feedb9fe1dcec780c" + integrity sha512-+HDIGOEMnqbxdAHegxvnOqESUH6RWFRR2b8qxP1W9CZnnYh4Usz6MBL+2KMAgPk/P0o9c1HqnYtwzVH6GTIqug== dependencies: - "@typescript-eslint/types" "5.6.0" + "@typescript-eslint/types" "5.8.0" eslint-visitor-keys "^3.0.0" "@webassemblyjs/ast@1.11.1": @@ -2227,12 +2216,12 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -babel-jest@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.4.4.tgz#a012441f8a155df909839543a09510ab3477aa11" - integrity sha512-+6RVutZxOQgJkt4svgTHPFtOQlVe9dUg3wrimIAM38pY6hL/nsL8glfFSUjD9jNVjaVjzkCzj6loFFecrjr9Qw== +babel-jest@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.4.5.tgz#d38bd0be8ea71d8b97853a5fc9f76deeb095c709" + integrity sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA== dependencies: - "@jest/transform" "^27.4.4" + "@jest/transform" "^27.4.5" "@jest/types" "^27.4.2" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.0.0" @@ -2326,12 +2315,12 @@ browser-process-hrtime@^1.0.0: integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browserslist@^4.14.5, browserslist@^4.17.5: - version "4.18.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" - integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== dependencies: - caniuse-lite "^1.0.30001280" - electron-to-chromium "^1.3.896" + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" escalade "^3.1.1" node-releases "^2.0.1" picocolors "^1.0.0" @@ -2426,10 +2415,10 @@ camelcase@^6.2.0, camelcase@^6.2.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== -caniuse-lite@^1.0.30001280: - version "1.0.30001286" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001286.tgz#3e9debad420419618cfdf52dc9b6572b28a8fff6" - integrity sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ== +caniuse-lite@^1.0.30001286: + version "1.0.30001292" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001292.tgz#4a55f61c06abc9595965cfd77897dc7bc1cdc456" + integrity sha512-jnT4Tq0Q4ma+6nncYQVe7d73kmDmE9C3OGTx3MvW7lBM/eY1S1DZTMBON7dqV481RhNiS5OxD7k9JQvmDOTirw== case@^1.6.3: version "1.6.3" @@ -3187,10 +3176,10 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-to-chromium@^1.3.896: - version "1.4.16" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.16.tgz#38ddecc616385e6f101359d1b978c802664157d2" - integrity sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA== +electron-to-chromium@^1.4.17: + version "1.4.26" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.26.tgz#d71b9da220543cf10614a576c3d5ebbe43d96efb" + integrity sha512-cA1YwlRzO6TGp7yd3+KAqh9Tt6Z4CuuKqsAJP6uF/H5MQryjAGDhMhnY5cEXo8MaRCczpzSBhMPdqRIodkbZYw== emittery@^0.8.1: version "0.8.1" @@ -3429,10 +3418,10 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz#eee4acea891814cda67a7d8812d9647dd0179af2" integrity sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA== -eslint@^8.4.1: - version "8.4.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.4.1.tgz#d6531bbf3e598dffd7c0c7d35ec52a0b30fdfa2d" - integrity sha512-TxU/p7LB1KxQ6+7aztTnO7K0i+h0tDi81YRY9VzB6Id71kNz+fFYnf5HD5UOQmxkzcoa0TlVZf9dpMtUv0GpWg== +eslint@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.5.0.tgz#ddd2c1afd8f412036f87ae2a063d2aa296d3175f" + integrity sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg== dependencies: "@eslint/eslintrc" "^1.0.5" "@humanwhocodes/config-array" "^0.9.2" @@ -4144,9 +4133,9 @@ ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.4, ignore@^5.1.8: - version "5.1.9" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" - integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -4568,10 +4557,10 @@ jest-changed-files@^27.4.2: execa "^5.0.0" throat "^6.0.1" -jest-circus@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.4.4.tgz#8bf89aa604b914ecc10e3d895aae283b529f965d" - integrity sha512-4DWhvQerDq5X4GaqhEUoZiBhuNdKDGr0geW0iJwarbDljAmGaGOErKQG+z2PBr0vgN05z7tsGSY51mdWr8E4xg== +jest-circus@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.4.5.tgz#70bfb78e0200cab9b84747bf274debacaa538467" + integrity sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw== dependencies: "@jest/environment" "^27.4.4" "@jest/test-result" "^27.4.2" @@ -4585,54 +4574,54 @@ jest-circus@^27.4.4: jest-each "^27.4.2" jest-matcher-utils "^27.4.2" jest-message-util "^27.4.2" - jest-runtime "^27.4.4" - jest-snapshot "^27.4.4" + jest-runtime "^27.4.5" + jest-snapshot "^27.4.5" jest-util "^27.4.2" pretty-format "^27.4.2" slash "^3.0.0" stack-utils "^2.0.3" throat "^6.0.1" -jest-cli@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.4.4.tgz#7115ff01f605c2c848314141b1ac144099ddeed5" - integrity sha512-+MfsHnZPUOBigCBURuQFRpgYoPCgmIFkICkqt4SrramZCUp/UAuWcst4pMZb84O3VU8JyKJmnpGG4qH8ClQloA== +jest-cli@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.4.5.tgz#8708f54c28d13681f3255ec9026a2b15b03d41e8" + integrity sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg== dependencies: - "@jest/core" "^27.4.4" + "@jest/core" "^27.4.5" "@jest/test-result" "^27.4.2" "@jest/types" "^27.4.2" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" import-local "^3.0.2" - jest-config "^27.4.4" + jest-config "^27.4.5" jest-util "^27.4.2" jest-validate "^27.4.2" prompts "^2.0.1" yargs "^16.2.0" -jest-config@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.4.4.tgz#0e3615392361baae0e29dbf64c296d5563d7e28b" - integrity sha512-6lxg0ugO6KS2zKEbpdDwBzu1IT0Xg4/VhxXMuBu+z/5FvBjLCEMTaWQm3bCaGCZUR9j9FK4DzUIxyhIgn6kVEg== +jest-config@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.4.5.tgz#77ed7f2ba7bcfd7d740ade711d0d13512e08a59e" + integrity sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^27.4.4" + "@jest/test-sequencer" "^27.4.5" "@jest/types" "^27.4.2" - babel-jest "^27.4.4" + babel-jest "^27.4.5" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.1" graceful-fs "^4.2.4" - jest-circus "^27.4.4" + jest-circus "^27.4.5" jest-environment-jsdom "^27.4.4" jest-environment-node "^27.4.4" jest-get-type "^27.4.0" - jest-jasmine2 "^27.4.4" + jest-jasmine2 "^27.4.5" jest-regex-util "^27.4.0" - jest-resolve "^27.4.4" - jest-runner "^27.4.4" + jest-resolve "^27.4.5" + jest-runner "^27.4.5" jest-util "^27.4.2" jest-validate "^27.4.2" micromatch "^4.0.4" @@ -4702,10 +4691,10 @@ jest-get-type@^27.4.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5" integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== -jest-haste-map@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.4.4.tgz#ec6013845368a155372e25e42e2b77e6ecc5019f" - integrity sha512-kvspmHmgPIZoDaqUsvsJFTaspuxhATvdO6wsFNGNSi8kfdiOCEEvECNbht8xG+eE5Ol88JyJmp2D7RF4dYo85Q== +jest-haste-map@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.4.5.tgz#c2921224a59223f91e03ec15703905978ef0cc1a" + integrity sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q== dependencies: "@jest/types" "^27.4.2" "@types/graceful-fs" "^4.1.2" @@ -4716,16 +4705,16 @@ jest-haste-map@^27.4.4: jest-regex-util "^27.4.0" jest-serializer "^27.4.0" jest-util "^27.4.2" - jest-worker "^27.4.4" + jest-worker "^27.4.5" micromatch "^4.0.4" walker "^1.0.7" optionalDependencies: fsevents "^2.3.2" -jest-jasmine2@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.4.4.tgz#1fcdc64de932913366e7d5f2960c375e1145176e" - integrity sha512-ygk2tUgtLeN3ouj4KEYw9p81GLI1EKrnvourPULN5gdgB482PH5op9gqaRG0IenbJhBbbRwiSvh5NoBoQZSqdA== +jest-jasmine2@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz#ff79d11561679ff6c89715b0cd6b1e8c0dfbc6dc" + integrity sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw== dependencies: "@babel/traverse" "^7.1.0" "@jest/environment" "^27.4.4" @@ -4740,8 +4729,8 @@ jest-jasmine2@^27.4.4: jest-each "^27.4.2" jest-matcher-utils "^27.4.2" jest-message-util "^27.4.2" - jest-runtime "^27.4.4" - jest-snapshot "^27.4.4" + jest-runtime "^27.4.5" + jest-snapshot "^27.4.5" jest-util "^27.4.2" pretty-format "^27.4.2" throat "^6.0.1" @@ -4797,24 +4786,24 @@ jest-regex-util@^27.4.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.4.0.tgz#e4c45b52653128843d07ad94aec34393ea14fbca" integrity sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg== -jest-resolve-dependencies@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.4.tgz#dae11e067a6d6a9553f1386a0ea1efe5be0e2332" - integrity sha512-iAnpCXh81sd9nbyqySvm5/aV9X6JZKE0dQyFXTC8tptXcdrgS0vjPFy+mEgzPHxXw+tq4TQupuTa0n8OXwRIxw== +jest-resolve-dependencies@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz#9398af854bdb12d6a9e5a8a536ee401f889a3ecf" + integrity sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w== dependencies: "@jest/types" "^27.4.2" jest-regex-util "^27.4.0" - jest-snapshot "^27.4.4" + jest-snapshot "^27.4.5" -jest-resolve@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.4.4.tgz#5b690662f54f38f7cfaffc0adcdb341ff7724408" - integrity sha512-Yh5jK3PBmDbm01Rc8pT0XqpBlTPEGwWp7cN61ijJuwony/tR2Taof3TLy6yfNiuRS8ucUOPO7NBYm3ei38kkcg== +jest-resolve@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.4.5.tgz#8dc44f5065fb8d58944c20f932cb7b9fe9760cca" + integrity sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw== dependencies: "@jest/types" "^27.4.2" chalk "^4.0.0" graceful-fs "^4.2.4" - jest-haste-map "^27.4.4" + jest-haste-map "^27.4.5" jest-pnp-resolver "^1.2.2" jest-util "^27.4.2" jest-validate "^27.4.2" @@ -4822,15 +4811,15 @@ jest-resolve@^27.4.4: resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.4.4.tgz#0b40cdcbac293ebc4c19c2d7805d17ab1072f1fd" - integrity sha512-AXv/8Q0Xf1puWnDf52m7oLrK7sXcv6re0V/kItwTSVHJbX7Oebm07oGFQqGmq0R0mhO1zpmB3OpqRuaCN2elPA== +jest-runner@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.4.5.tgz#daba2ba71c8f34137dc7ac45616add35370a681e" + integrity sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg== dependencies: "@jest/console" "^27.4.2" "@jest/environment" "^27.4.4" "@jest/test-result" "^27.4.2" - "@jest/transform" "^27.4.4" + "@jest/transform" "^27.4.5" "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" @@ -4840,27 +4829,27 @@ jest-runner@^27.4.4: jest-docblock "^27.4.0" jest-environment-jsdom "^27.4.4" jest-environment-node "^27.4.4" - jest-haste-map "^27.4.4" + jest-haste-map "^27.4.5" jest-leak-detector "^27.4.2" jest-message-util "^27.4.2" - jest-resolve "^27.4.4" - jest-runtime "^27.4.4" + jest-resolve "^27.4.5" + jest-runtime "^27.4.5" jest-util "^27.4.2" - jest-worker "^27.4.4" + jest-worker "^27.4.5" source-map-support "^0.5.6" throat "^6.0.1" -jest-runtime@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.4.4.tgz#0d486735e8a1c8bbcdbb9285b3155ed94c5e3670" - integrity sha512-tZGay6P6vXJq8t4jVFAUzYHx+lzIHXjz+rj1XBk6mAR1Lwtf5kz0Uun7qNuU+oqpZu4+hhuxpUfXb6j30bEPqA== +jest-runtime@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.4.5.tgz#97703ad2a1799d4f50ab59049bd21a9ceaed2813" + integrity sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ== dependencies: "@jest/console" "^27.4.2" "@jest/environment" "^27.4.4" "@jest/globals" "^27.4.4" "@jest/source-map" "^27.4.0" "@jest/test-result" "^27.4.2" - "@jest/transform" "^27.4.4" + "@jest/transform" "^27.4.5" "@jest/types" "^27.4.2" "@types/yargs" "^16.0.0" chalk "^4.0.0" @@ -4870,12 +4859,12 @@ jest-runtime@^27.4.4: exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.2.4" - jest-haste-map "^27.4.4" + jest-haste-map "^27.4.5" jest-message-util "^27.4.2" jest-mock "^27.4.2" jest-regex-util "^27.4.0" - jest-resolve "^27.4.4" - jest-snapshot "^27.4.4" + jest-resolve "^27.4.5" + jest-snapshot "^27.4.5" jest-util "^27.4.2" jest-validate "^27.4.2" slash "^3.0.0" @@ -4890,10 +4879,10 @@ jest-serializer@^27.4.0: "@types/node" "*" graceful-fs "^4.2.4" -jest-snapshot@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.4.4.tgz#fc0a2cd22f742fe66621c5359c9cd64f88260c6b" - integrity sha512-yy+rpCvYMOjTl7IMuaMI9OP9WT229zi8BhdNHm6e6mttAOIzvIiCxFoZ6yRxaV3HDPPgMryi+ReX2b8+IQJdPA== +jest-snapshot@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.4.5.tgz#2ea909b20aac0fe62504bc161331f730b8a7ecc7" + integrity sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ== dependencies: "@babel/core" "^7.7.2" "@babel/generator" "^7.7.2" @@ -4901,7 +4890,7 @@ jest-snapshot@^27.4.4: "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.0.0" - "@jest/transform" "^27.4.4" + "@jest/transform" "^27.4.5" "@jest/types" "^27.4.2" "@types/babel__traverse" "^7.0.4" "@types/prettier" "^2.1.5" @@ -4911,10 +4900,10 @@ jest-snapshot@^27.4.4: graceful-fs "^4.2.4" jest-diff "^27.4.2" jest-get-type "^27.4.0" - jest-haste-map "^27.4.4" + jest-haste-map "^27.4.5" jest-matcher-utils "^27.4.2" jest-message-util "^27.4.2" - jest-resolve "^27.4.4" + jest-resolve "^27.4.5" jest-util "^27.4.2" natural-compare "^1.4.0" pretty-format "^27.4.2" @@ -4957,23 +4946,23 @@ jest-watcher@^27.4.2: jest-util "^27.4.2" string-length "^4.0.1" -jest-worker@^27.0.6, jest-worker@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.4.tgz#9390a97c013a54d07f5c2ad2b5f6109f30c4966d" - integrity sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w== +jest-worker@^27.4.1, jest-worker@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.5.tgz#d696e3e46ae0f24cff3fa7195ffba22889262242" + integrity sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.4.4.tgz#9b1aa1db25d0b13477a49d18e22ba7cdff97105b" - integrity sha512-AXwEIFa58Uf1Jno3/KSo5HZZ0/2Xwqvfrz0/3bmTwImkFlbOvz5vARAW9nTrxRLkojjkitaZ1KNKAtw3JRFAaA== +jest@^27.4.5: + version "27.4.5" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.4.5.tgz#66e45acba44137fac26be9d3cc5bb031e136dc0f" + integrity sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg== dependencies: - "@jest/core" "^27.4.4" + "@jest/core" "^27.4.5" import-local "^3.0.2" - jest-cli "^27.4.4" + jest-cli "^27.4.5" js-tokens@^4.0.0: version "4.0.0" @@ -5883,9 +5872,9 @@ object-assign@^4.1.0: integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.1.tgz#d4bd7d7de54b9a75599f59a00bd698c1f1c6549b" - integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA== + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== object-is@^1.1.4: version "1.1.5" @@ -7265,11 +7254,11 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser-webpack-plugin@^5.1.3: - version "5.2.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz#ce65b9880a0c36872555c4874f45bbdb02ee32c9" - integrity sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g== + version "5.3.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz#21641326486ecf91d8054161c816e464435bae9f" + integrity sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ== dependencies: - jest-worker "^27.0.6" + jest-worker "^27.4.1" schema-utils "^3.1.1" serialize-javascript "^6.0.0" source-map "^0.6.1" @@ -7386,10 +7375,10 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -ts-jest@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.1.tgz#5a54aca96db1dac37c681f3029dd10f3a8c36192" - integrity sha512-Ds0VkB+cB+8g2JUmP/GKWndeZcCKrbe6jzolGrVWdqVUFByY/2KDHqxJ7yBSon7hDB1TA4PXxjfZ+JjzJisvgA== +ts-jest@^27.1.2: + version "27.1.2" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.2.tgz#5991d6eb3fd8e1a8d4b8f6de3ec0a3cc567f3151" + integrity sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x"