diff --git a/.all-contributorsrc b/.all-contributorsrc index ec91a7dec9..4a02daade6 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1093,6 +1093,25 @@ "contributions": [ "bug" ] + }, + { + "login": "yglcode", + "name": "Yigong Liu", + "avatar_url": "https://avatars.githubusercontent.com/u/11893614?v=4", + "profile": "https://github.com/yglcode", + "contributions": [ + "bug", + "ideas" + ] + }, + { + "login": "Cristim", + "name": "Cristian Măgherușan-Stanciu", + "avatar_url": "https://avatars.githubusercontent.com/u/95209?v=4", + "profile": "http://mcristi.wordpress.com", + "contributions": [ + "bug" + ] } ], "repoType": "github", diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index df2cee60e0..96a19e8cf9 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -25,7 +25,7 @@ jobs: run: |- echo "::set-output name=pip-cache::$(python3 -m pip cache dir)" - name: Cache - uses: actions/cache@v2.1.4 + uses: actions/cache@v2.1.5 with: path: ${{ steps.cache-locations.outputs.pip-cache }} key: ${{ runner.os }}-${{ hashFiles('**/requirements-dev.txt') }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index eff6cdeb75..08824077ee 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,9 +31,10 @@ jobs: with: go-version: '1.16' - name: Set up Java 8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: java-version: '8' + distribution: 'zulu' - name: Set up Node 12 uses: actions/setup-node@v2.1.5 with: @@ -57,7 +58,7 @@ jobs: echo "::set-output name=pip-cache::$(python3 -m pip cache dir)" echo "::set-output name=yarn-cache::$(yarn cache dir)" - name: Cache - uses: actions/cache@v2.1.4 + uses: actions/cache@v2.1.5 with: path: |- ${{ steps.cache-locations.outputs.pip-cache }} @@ -122,9 +123,10 @@ jobs: with: go-version: '1.16' - name: Set up Java 8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: java-version: '8' + distribution: 'zulu' - name: Set up Node 12 uses: actions/setup-node@v2.1.5 with: @@ -148,7 +150,7 @@ jobs: echo "::set-output name=pip-cache::$(python3 -m pip cache dir)" echo "::set-output name=yarn-cache::$(yarn cache dir)" - name: Cache - uses: actions/cache@v2.1.4 + uses: actions/cache@v2.1.5 with: path: |- ${{ steps.cache-locations.outputs.pip-cache }} @@ -273,9 +275,10 @@ jobs: with: go-version: ${{ matrix.go }} - name: Set up Java ${{ matrix.java }} - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: java-version: ${{ matrix.java }} + distribution: 'zulu' - name: Set up Node ${{ matrix.node }} uses: actions/setup-node@v2.1.5 with: @@ -309,7 +312,7 @@ jobs: echo "::set-output name=pip-cache::$(python3 -m pip cache dir)" echo "::set-output name=yarn-cache::$(yarn cache dir)" - name: Cache - uses: actions/cache@v2.1.4 + uses: actions/cache@v2.1.5 with: path: |- ${{ steps.cache-locations.outputs.pip-cache }} diff --git a/.github/workflows/yarn-upgrade.yml b/.github/workflows/yarn-upgrade.yml index 29243ee90b..771a9d003a 100644 --- a/.github/workflows/yarn-upgrade.yml +++ b/.github/workflows/yarn-upgrade.yml @@ -25,7 +25,7 @@ jobs: run: echo "::set-output name=dir::$(yarn cache dir)" - name: Restore Yarn cache - uses: actions/cache@v2.1.4 + uses: actions/cache@v2.1.5 with: path: ${{ steps.yarn-cache.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 02fa1eacf8..698da04c16 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.28.0](https://github.com/aws/jsii/compare/v1.27.1...v1.28.0) (2021-04-13) + + +### Features + +* **jsii-go:** use reflect to resolve overriden methods ([#2780](https://github.com/aws/jsii/issues/2780)) ([295d189](https://github.com/aws/jsii/commit/295d189610938d5e644243af8c4d1f17f1c2a8a0)), closes [#2768](https://github.com/aws/jsii/issues/2768) + + +### Bug Fixes + +* **dotnet:** unable to pass 2d-array of interfaces ([#2763](https://github.com/aws/jsii/issues/2763)) ([347cf69](https://github.com/aws/jsii/commit/347cf69305a82733da2dc10517cb0b911decbce1)), closes [aws/aws-cdk#12587](https://github.com/aws/aws-cdk/issues/12587) +* deprecated symbol stripping does not strip out heritage clause with imported type ([#2783](https://github.com/aws/jsii/issues/2783)) ([e87d879](https://github.com/aws/jsii/commit/e87d879f9b637a769b6b62af5fe7711ca0b8a3c5)) + ## [1.27.1](https://github.com/aws/jsii/compare/v1.27.0...v1.27.1) (2021-04-12) ### Bug Fixes diff --git a/README.md b/README.md index 96c6fd00df..668466e00b 100644 --- a/README.md +++ b/README.md @@ -86,110 +86,112 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Christophe Vico

πŸ›
Christopher Currie

πŸ’» πŸ€”
Christopher Rybicki

πŸ“– +
Cristian Măgherușan-Stanciu

πŸ›
CyrusNajmabadi

πŸ› πŸ€”
Daniel Dinu

πŸ› πŸ’» -
Daniel Schroeder

πŸ› πŸ’» πŸ“– πŸ€” 🚧 +
Daniel Schroeder

πŸ› πŸ’» πŸ“– πŸ€” 🚧
Dave Slotnick

πŸ›
Donald Stufft

πŸ› πŸ’» πŸ€” πŸ‘€
Dongie Agnir

πŸ’» πŸ‘€
Eduardo Sena S. Rosa

πŸ›
Elad Ben-Israel

πŸ› πŸ’» πŸ€” 🚧 πŸ‘€ πŸ“’
Eli Polonsky

πŸ› πŸ’» πŸ€” 🚧 πŸ‘€ -
Eric Z. Beard

πŸ“† +
Eric Z. Beard

πŸ“†
Erik Karlsson

πŸ›
Eugene Kozlov

πŸ’»
Fabio Gentile

πŸ›
Florian Eitel

πŸ€”
Graham Lea

πŸ€” πŸ‘€
Hamza Assyad

πŸ› πŸ’» πŸ€” πŸ‘€ -
Hari Pachuveetil

πŸ“ πŸ“– +
Hari Pachuveetil

πŸ“ πŸ“–
Hsing-Hui Hsu

πŸ’» πŸ“– πŸ€” πŸ‘€
James Kelley

πŸ›
James Mead

πŸ’»
James Siri

πŸ’» 🚧
Jason Del Ponte

πŸ€” πŸ‘€
Jason Fulghum

πŸ€” πŸ“† πŸ‘€ -
Jerry Kindall

πŸ“– πŸ€” +
Jerry Kindall

πŸ“– πŸ€”
Jimmy Gaussen

πŸ€”
Jon Steinich

πŸ› πŸ€” πŸ’»
Joseph Lawson

πŸ‘€
Joseph Martin

πŸ›
Junix

πŸ›
Justin Taylor

πŸ› -
Kyle Thomson

πŸ’» πŸ‘€ +
Kyle Thomson

πŸ’» πŸ‘€
Leandro Padua

πŸ›
Maja S Bratseth

πŸ›
Marcos Diez

πŸ›
Matthew Bonig

πŸ› πŸ“
Matthew Pirocchi

πŸ’» πŸ€” πŸ‘€
Mike Lane

πŸ› -
Mitch Garnaat

πŸ› πŸ’» πŸ€” πŸ‘€ +
Mitch Garnaat

πŸ› πŸ’» πŸ€” πŸ‘€
Mitchell Valine

πŸ› πŸ’» πŸ€” 🚧 πŸ‘€
Mohamad Soufan

πŸ“–
Neta Nir

πŸ’» πŸ€” 🚧 πŸ‘€
Nick Lynch

πŸ› πŸ’» 🚧 πŸ‘€
Niranjan Jayakar

πŸ› πŸ’» πŸ€” 🚧 πŸ‘€
Noah Litov

πŸ’» 🚧 πŸ‘€ -
PIDZ - Bart

πŸ€” +
PIDZ - Bart

πŸ€”
Petr Kacer

πŸ›
Petra Barus

πŸ’»
Philip Cali

πŸ€”
Quentin Loos

πŸ€”
Raphael

πŸ›
Richard H Boyd

πŸ› -
Rico Huijbers

πŸ› πŸ’» πŸ€” 🚧 πŸ‘€ +
Rico Huijbers

πŸ› πŸ’» πŸ€” 🚧 πŸ‘€
Romain Marcadier

πŸ› πŸ’» 🎨 πŸ€” 🚧 πŸ‘€ πŸ“
SADIK KUZU

πŸ‘€
SK

πŸ€”
Sam Fink

πŸ’» πŸ‘€
Sam Goodwin

πŸ‘€
Sebastian Korfmann

πŸ› πŸ’» πŸ€” -
Shane Witbeck

πŸ€” +
Shane Witbeck

πŸ€”
Shiv Lakshminarayan

πŸ’» 🚧 πŸ‘€
Somaya

πŸ’» πŸ€” 🚧 πŸ‘€
The Gitter Badger

πŸ’» 🚧
Thomas Poignant

πŸ›
Thomas Steinbach

πŸ›
Thorsten Hoeger

πŸ’» -
Tim Wagner

πŸ› πŸ€” +
Tim Wagner

πŸ› πŸ€”
Tobias Lidskog

πŸ’»
Ty Coghlan

πŸ›
Tyler van Hensbergen

πŸ€”
Vlad Hrybok

πŸ›
Vladimir Shchur

πŸ›
Yan Zhulanow

πŸ’» -
ajnarang

πŸ€” +
Yigong Liu

πŸ› πŸ€” +
ajnarang

πŸ€”
aniljava

πŸ’»
deccy-mcc

πŸ›
dependabot-preview[bot]

πŸ› 🚧
dependabot[bot]

🚧
dheffx

πŸ› -
gregswdl

πŸ› -
mattBrzezinski

πŸ“– +
gregswdl

πŸ› +
mattBrzezinski

πŸ“–
mergify[bot]

🚧
seiyashima42

πŸ› πŸ’» πŸ“–
sullis

πŸ’» diff --git a/gh-pages/content/user-guides/lib-user/language-specific/go.md b/gh-pages/content/user-guides/lib-user/language-specific/go.md index 375ff682b7..137632ffaf 100644 --- a/gh-pages/content/user-guides/lib-user/language-specific/go.md +++ b/gh-pages/content/user-guides/lib-user/language-specific/go.md @@ -121,10 +121,8 @@ following convention: `New_Override`, and receives the *overriding* struct instance as the first parameter. The **go** `struct` that *extends* the base *jsii class* must anonymously embed -the *jsii class*' **go** interface, while specifying the `overrides:"..."` field -tag. The value of the tag is a comma-separated list of **go** methods that are -locally overridden (note: in the case of *property accessors*, the *getter* name -is to be used, even if only the *setter* is overridden). +the *jsii class*' **go** interface. All overridden method *must* be defined +using a pointer receiver. Assuming the following abstract base class: @@ -165,8 +163,8 @@ import ( ) type childClass struct { - // We implement AbstractMethod, AbstractReadonlyProperty, and override the setter for ConcreteProperty - jsiimodule.AbstractBaseClass `overrides:"AbstractMethod,AbstractReadonlyProperty,ConcreteProperty"` + // Anonymous embed of the "base class". + jsiimodule.AbstractBaseClass // Our own storage stringValue string diff --git a/gh-pages/requirements-dev.txt b/gh-pages/requirements-dev.txt index b70d221646..b91cbc02ee 100644 --- a/gh-pages/requirements-dev.txt +++ b/gh-pages/requirements-dev.txt @@ -1,4 +1,4 @@ mkdocs~=1.1.2 mkdocs-awesome-pages-plugin~=2.5.0 -mkdocs-material~=7.0.7 +mkdocs-material~=7.1.1 mkdocs-git-revision-date-plugin~=0.3.1 diff --git a/jest.config.ts b/jest.config.ts index 590dba534b..9914401933 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,5 +1,6 @@ import type { Config } from '@jest/types'; import { defaults } from 'jest-config'; +import { cpus } from 'os'; import { env } from 'process'; /** @@ -28,6 +29,10 @@ const config: Config.InitialOptions = { testEnvironment: 'node', testMatch: ['**/?(*.)+(spec|test).ts'], testRunner: 'jest-circus/runner', + // Adjust maximum concurrency to specifically disallow running unbounded. Allow a minimum of 2 concurrent + // tests, and a maximum of 4 (which is the libuv thread pool size - more will likely cause wait times to + // quickly run out of control, and make everything very, very slow.) + maxConcurrency: Math.max(Math.min(cpus().length - 1, 4), 2), // When in Continuous Integration, allow double the default test timeout (assuming "frugal" runner type) testTimeout: env.CI === 'true' ? 10_000 : undefined, transform: { diff --git a/lerna.json b/lerna.json index dc6f050d66..cc51801f52 100644 --- a/lerna.json +++ b/lerna.json @@ -2,11 +2,13 @@ "lerna": "3.13.1", "npmClient": "yarn", "useWorkspaces": true, - "packages": ["packages/*"], + "packages": [ + "packages/*" + ], "command": { "bootstrap": { "rejectCycles": true } }, - "version": "1.27.1" + "version": "1.28.0" } diff --git a/package.json b/package.json index fc23b75147..14d3836ce7 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ }, "devDependencies": { "@jest/types": "^26.6.2", - "@typescript-eslint/eslint-plugin": "^4.20.0", - "@typescript-eslint/parser": "^4.20.0", + "@typescript-eslint/eslint-plugin": "^4.21.0", + "@typescript-eslint/parser": "^4.21.0", "all-contributors-cli": "^6.20.0", "eslint": "^7.23.0", "eslint-config-prettier": "^8.1.0", @@ -30,7 +30,7 @@ "jest-expect-message": "^1.0.2", "lerna": "^4.0.0", "prettier": "^2.2.1", - "standard-version": "^9.1.1", + "standard-version": "^9.2.0", "ts-jest": "^26.5.4", "ts-node": "^9.1.1", "typescript": "~3.9.9" diff --git a/packages/@jsii/Directory.Build.targets b/packages/@jsii/Directory.Build.targets index 3cf4d06899..236a616094 100644 --- a/packages/@jsii/Directory.Build.targets +++ b/packages/@jsii/Directory.Build.targets @@ -10,7 +10,7 @@ - + diff --git a/packages/@jsii/dotnet-runtime-test/test/Amazon.JSII.Runtime.IntegrationTests/ComplianceTests.cs b/packages/@jsii/dotnet-runtime-test/test/Amazon.JSII.Runtime.IntegrationTests/ComplianceTests.cs index e5a0b5d111..0177bfe499 100644 --- a/packages/@jsii/dotnet-runtime-test/test/Amazon.JSII.Runtime.IntegrationTests/ComplianceTests.cs +++ b/packages/@jsii/dotnet-runtime-test/test/Amazon.JSII.Runtime.IntegrationTests/ComplianceTests.cs @@ -1512,5 +1512,18 @@ public override String Repeat(String word) return word; } } + + [Fact(DisplayName = Prefix + nameof(ArrayOfInterfaces))] + public void ArrayOfInterfaces() + { + var bells = new IBell[1][]; + bells[0] = new IBell[1]; + bells[0][0] = new Bell(); + + var allTypes = new AllTypes(); + allTypes.AnyProperty = bells; + + Assert.Equal(bells, allTypes.AnyProperty); + } } } diff --git a/packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/Converters/FrameworkToJsiiConverter.cs b/packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/Converters/FrameworkToJsiiConverter.cs index 4cfddde92c..b89c0b07c2 100644 --- a/packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/Converters/FrameworkToJsiiConverter.cs +++ b/packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/Converters/FrameworkToJsiiConverter.cs @@ -1,4 +1,4 @@ -ο»Ώusing System; +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -348,6 +348,12 @@ TypeReference InferType(IReferenceMap referenceMap, Type type) return new TypeReference(enumAttribute.FullyQualifiedName); } + var interfaceAttribute = type.GetCustomAttribute(); + if (interfaceAttribute != null) + { + return new TypeReference(interfaceAttribute.FullyQualifiedName); + } + var structAttribute = type.GetCustomAttribute(); if (structAttribute != null) { diff --git a/packages/@jsii/go-runtime-test/project/compliance_test.go b/packages/@jsii/go-runtime-test/project/compliance_test.go index 751af539fb..56b1f6ba3e 100644 --- a/packages/@jsii/go-runtime-test/project/compliance_test.go +++ b/packages/@jsii/go-runtime-test/project/compliance_test.go @@ -347,7 +347,7 @@ func (suite *ComplianceSuite) TestEqualsIsResistantToPropertyShadowingResultVari } type overridableProtectedMemberDerived struct { - calc.OverridableProtectedMember `overrides:"OverrideReadOnly,OverrideReadWrite"` + calc.OverridableProtectedMember } func newOverridableProtectedMemberDerived() *overridableProtectedMemberDerived { @@ -381,7 +381,7 @@ func newImplementsAdditionalInterface(s calc.StructB) *implementsAdditionalInter return &n } -func (x implementsAdditionalInterface) ReturnStruct() *calc.StructB { +func (x *implementsAdditionalInterface) ReturnStruct() *calc.StructB { return &x._struct } @@ -500,7 +500,7 @@ func (suite *ComplianceSuite) TestCallbacksCorrectlyDeserializeArguments() { } type testCallbacksCorrectlyDeserializeArgumentsDataRenderer struct { - calc.DataRenderer `overrides:"RenderMap"` + calc.DataRenderer } func NewTestCallbacksCorrectlyDeserializeArgumentsDataRenderer() *testCallbacksCorrectlyDeserializeArgumentsDataRenderer { @@ -610,7 +610,7 @@ func (suite *ComplianceSuite) TestNullShouldBeTreatedAsUndefined() { } type myOverridableProtectedMember struct { - calc.OverridableProtectedMember `overrides:"OverrideMe"` + calc.OverridableProtectedMember } func newMyOverridableProtectedMember() *myOverridableProtectedMember { @@ -619,7 +619,7 @@ func newMyOverridableProtectedMember() *myOverridableProtectedMember { return &m } -func (x myOverridableProtectedMember) OverrideMe() *string { +func (x *myOverridableProtectedMember) OverrideMe() *string { return jsii.String("Cthulhu Fhtagn!") } @@ -685,7 +685,7 @@ func (suite *ComplianceSuite) TestMapReturnedByMethodCanBeRead() { } type myAbstractSuite struct { - calc.AbstractSuite `overrides:"SomeMethod,Property"` + calc.AbstractSuite _property *string } @@ -724,10 +724,10 @@ func (suite *ComplianceSuite) TestCanOverrideProtectedSetter() { } type TestCanOverrideProtectedSetterOverridableProtectedMember struct { - calc.OverridableProtectedMember `overrides:"OverrideReadWrite"` + calc.OverridableProtectedMember } -func (x TestCanOverrideProtectedSetterOverridableProtectedMember) SetOverrideReadWrite(val *string) { +func (x *TestCanOverrideProtectedSetterOverridableProtectedMember) SetOverrideReadWrite(val *string) { x.OverridableProtectedMember.SetOverrideReadWrite(jsii.String(fmt.Sprintf("zzzzzzzzz%s", *val))) } @@ -737,7 +737,6 @@ func newTestCanOverrideProtectedSetterOverridableProtectedMember() *TestCanOverr return &m } - func (suite *ComplianceSuite) TestObjRefsAreLabelledUsingWithTheMostCorrectType() { require := suite.Require() @@ -952,7 +951,7 @@ func (suite *ComplianceSuite) TestPropertyOverrides_Get_Calls_Super() { } type testPropertyOverridesGetCallsSuper struct { - calc.SyncVirtualMethods `overrides:"TheProperty"` + calc.SyncVirtualMethods } func (t *testPropertyOverridesGetCallsSuper) TheProperty() *string { @@ -1063,7 +1062,7 @@ func (suite *ComplianceSuite) TestPropertyOverrides_Get_Throws() { } type testPropertyOverridesGetThrows struct { - calc.SyncVirtualMethods `overrides:"TheProperty"` + calc.SyncVirtualMethods } func (t *testPropertyOverridesGetThrows) TheProperty() *string { @@ -1143,7 +1142,7 @@ func (suite *ComplianceSuite) TestPropertyOverrides_Set_Calls_Super() { } type testPropertyOverridesSetCallsSuper struct { - calc.SyncVirtualMethods `overrides:"TheProperty"` + calc.SyncVirtualMethods } func (t *testPropertyOverridesSetCallsSuper) SetTheProperty(value *string) { @@ -1327,8 +1326,8 @@ func (suite *ComplianceSuite) TestObjectIdDoesNotGetReallocatedWhenTheConstructo } type partiallyInitializedThisConsumerImpl struct { - calc.PartiallyInitializedThisConsumer `overrides:"ConsumePartiallyInitializedThis"` - require *require.Assertions + calc.PartiallyInitializedThisConsumer + require *require.Assertions } func NewPartiallyInitializedThisConsumerImpl(assert *require.Assertions) *partiallyInitializedThisConsumerImpl { @@ -1478,7 +1477,7 @@ func (suite *ComplianceSuite) TestPropertyOverrides_Set_Throws() { } type testPropertyOverrides_Set_ThrowsSyncVirtualMethods struct { - calc.SyncVirtualMethods `overrides:"TheProperty"` + calc.SyncVirtualMethods } func NewTestPropertyOverrides_Set_ThrowsSyncVirtualMethods() *testPropertyOverrides_Set_ThrowsSyncVirtualMethods { @@ -1582,7 +1581,7 @@ func (suite *ComplianceSuite) TestAsyncOverrides_OverrideCallsSuper() { } type OverrideCallsSuper struct { - calc.AsyncVirtualMethods `overrides:"OverrideMe"` + calc.AsyncVirtualMethods } func (o *OverrideCallsSuper) OverrideMe(mult *float64) *float64 { diff --git a/packages/@jsii/go-runtime-test/project/internal/overrideAsyncMethods/overrideAsyncMethods.go b/packages/@jsii/go-runtime-test/project/internal/overrideAsyncMethods/overrideAsyncMethods.go index 8890e55050..a95a0d405c 100644 --- a/packages/@jsii/go-runtime-test/project/internal/overrideAsyncMethods/overrideAsyncMethods.go +++ b/packages/@jsii/go-runtime-test/project/internal/overrideAsyncMethods/overrideAsyncMethods.go @@ -6,7 +6,7 @@ import ( ) type OverrideAsyncMethods struct { - jsiicalc.AsyncVirtualMethods `overrides:"OverrideMe"` + jsiicalc.AsyncVirtualMethods } func New() *OverrideAsyncMethods { diff --git a/packages/@jsii/go-runtime-test/project/internal/syncOverrides/syncOverrides.go b/packages/@jsii/go-runtime-test/project/internal/syncOverrides/syncOverrides.go index dc97ad7741..6b16d07ee3 100644 --- a/packages/@jsii/go-runtime-test/project/internal/syncOverrides/syncOverrides.go +++ b/packages/@jsii/go-runtime-test/project/internal/syncOverrides/syncOverrides.go @@ -7,11 +7,11 @@ import ( ) type SyncOverrides struct { - jsiicalc.SyncVirtualMethods `overrides:"VirtualMethod,TheProperty"` - AnotherTheProperty *string - Multiplier int - ReturnSuper bool - CallAsync bool + jsiicalc.SyncVirtualMethods + AnotherTheProperty *string + Multiplier int + ReturnSuper bool + CallAsync bool } func New() *SyncOverrides { diff --git a/packages/@jsii/go-runtime-test/project/internal/twoOverrides/twoOverrides.go b/packages/@jsii/go-runtime-test/project/internal/twoOverrides/twoOverrides.go index 5a6847f45c..73a012f064 100644 --- a/packages/@jsii/go-runtime-test/project/internal/twoOverrides/twoOverrides.go +++ b/packages/@jsii/go-runtime-test/project/internal/twoOverrides/twoOverrides.go @@ -6,7 +6,7 @@ import ( ) type TwoOverrides struct { - jsiicalc.AsyncVirtualMethods `overrides:"OverrideMe,OverrideMeToo"` + jsiicalc.AsyncVirtualMethods } func New() *TwoOverrides { diff --git a/packages/@jsii/go-runtime-test/project/internal/wallClock/wallClock.go b/packages/@jsii/go-runtime-test/project/internal/wallClock/wallClock.go index bf3f85ba16..5751782948 100644 --- a/packages/@jsii/go-runtime-test/project/internal/wallClock/wallClock.go +++ b/packages/@jsii/go-runtime-test/project/internal/wallClock/wallClock.go @@ -18,7 +18,7 @@ func (w *WallClock) Iso8601Now() *string { } type Entropy struct { - jsiicalc.Entropy `overrides:"Repeat"` + jsiicalc.Entropy } func NewEntropy(clock jsiicalc.IWallClock) *Entropy { diff --git a/packages/@jsii/go-runtime/jsii-runtime-go/internal/embedded/.gitattributes b/packages/@jsii/go-runtime/jsii-runtime-go/internal/embedded/.gitattributes new file mode 100644 index 0000000000..84ed02750e --- /dev/null +++ b/packages/@jsii/go-runtime/jsii-runtime-go/internal/embedded/.gitattributes @@ -0,0 +1 @@ +resources/ linguist-vendored diff --git a/packages/@jsii/go-runtime/jsii-runtime-go/overrides_reflect_test.go b/packages/@jsii/go-runtime/jsii-runtime-go/overrides_reflect_test.go new file mode 100644 index 0000000000..bfa1db7861 --- /dev/null +++ b/packages/@jsii/go-runtime/jsii-runtime-go/overrides_reflect_test.go @@ -0,0 +1,65 @@ +package jsii + +import ( + "reflect" + "sort" + "testing" +) + +type IFace interface { + M1() + M2() + M3() +} + +type Base struct { + X, Y int +} + +func (b *Base) M1() {} +func (b *Base) M2() {} +func (b *Base) M3() {} + +type D1 struct { + *Base +} + +func (d *D1) M1() {} + +func (d *D1) X1() {} + +type D2 struct { + Name string + IFace +} + +func (d *D2) M2() {} + +func (d *D2) X2() {} + +func TestOverrideReflection(t *testing.T) { + testCases := [...]struct { + //overriding instance + val interface{} + //instance overriding methods + methods []string + }{ + {&Base{}, []string(nil)}, + {&D1{&Base{}}, []string{"M1", "X1"}}, + {&D2{Name: "abc", IFace: &D1{&Base{}}}, []string{"M1", "X1", "M2", "X2"}}, + } + for _, tc := range testCases { + sort.Slice(tc.methods, func(i, j int) bool { + return tc.methods[i] < tc.methods[j] + }) + } + for _, tc := range testCases { + methods := getMethodOverrides(tc.val, "Base") + sort.Slice(methods, func(i, j int) bool { + return methods[i] < methods[j] + }) + if !reflect.DeepEqual(methods, tc.methods) { + t.Errorf("expect: %v, got: %v", tc.methods, methods) + } + } +} diff --git a/packages/@jsii/go-runtime/jsii-runtime-go/runtime.go b/packages/@jsii/go-runtime/jsii-runtime-go/runtime.go index 47f978d8a2..5eadf56461 100644 --- a/packages/@jsii/go-runtime/jsii-runtime-go/runtime.go +++ b/packages/@jsii/go-runtime/jsii-runtime-go/runtime.go @@ -113,8 +113,6 @@ func InitJsiiProxy(ptr interface{}) { func Create(fqn FQN, args []interface{}, inst interface{}) { client := kernel.GetClient() - var overrides []api.Override - instVal := reflect.ValueOf(inst) structVal := instVal.Elem() instType := structVal.Type() @@ -134,20 +132,6 @@ func Create(fqn FQN, args []interface{}, inst interface{}) { panic(err) } - if tag := field.Tag.Get("overrides"); tag != "" { - if names := strings.Split(tag, ","); len(names) > 0 { - overrides = make([]api.Override, len(names)) - registry := client.Types() - for i, name := range names { - if override, ok := registry.GetOverride(api.FQN(fqn), name); !ok { - panic(fmt.Errorf("unable to identify method or property for override %s declared by %v", name, field)) - } else { - overrides[i] = override - } - } - } - } - case reflect.Struct: fieldVal := structVal.Field(i) if !fieldVal.IsZero() { @@ -159,6 +143,36 @@ func Create(fqn FQN, args []interface{}, inst interface{}) { } } + // Find method overrides thru reflection + mOverrides := getMethodOverrides(inst, "jsiiProxy_") + // If overriding struct has no overriding methods, could happen if + // overriding methods are not defined with pointer receiver. + if len(mOverrides) == 0 && !strings.HasPrefix(instType.Name(), "jsiiProxy_") { + panic(fmt.Errorf("%s has no overriding methods. Overriding methods must be defined with a pointer receiver", instType.Name())) + } + var overrides []api.Override + registry := client.Types() + added := make(map[string]bool) + for _, name := range mOverrides { + // Use getter's name even if setter is overriden + if strings.HasPrefix(name, "Set") { + propName := name[3:] + if override, ok := registry.GetOverride(api.FQN(fqn), propName); ok { + if !added[propName] { + added[propName] = true + overrides = append(overrides, override) + } + continue + } + } + if override, ok := registry.GetOverride(api.FQN(fqn), name); ok { + if !added[name] { + added[name] = true + overrides = append(overrides, override) + } + } + } + interfaces, newOverrides := client.Types().DiscoverImplementation(instType) overrides = append(overrides, newOverrides...) @@ -361,6 +375,65 @@ func convertArguments(args []interface{}) []interface{} { return result } +// Get ptr's methods names which override "base" struct methods. +// The "base" struct is identified by name prefix "basePrefix". +func getMethodOverrides(ptr interface{}, basePrefix string) (methods []string) { + // Methods override cache: [methodName]bool + mCache := make(map[string]bool) + getMethodOverridesRec(ptr, basePrefix, mCache) + // Return overriden methods names in embedding hierarchy + for m, _ := range mCache { + methods = append(methods, m) + } + return +} + +func getMethodOverridesRec(ptr interface{}, basePrefix string, cache map[string]bool) { + ptrType := reflect.TypeOf(ptr) + if ptrType.Kind() != reflect.Ptr { + return + } + structType := ptrType.Elem() + if structType.Kind() != reflect.Struct { + return + } + if strings.HasPrefix(structType.Name(), basePrefix) { + // Skip base class + return + } + + ptrVal := reflect.ValueOf(ptr) + structVal := ptrVal.Elem() + + // Add embedded/super overrides first + for i := 0; i < structType.NumField(); i++ { + field := structType.Field(i) + if !field.Anonymous { + continue + } + if field.Type.Kind() == reflect.Ptr || + field.Type.Kind() == reflect.Interface { + p := structVal.Field(i) + if !p.IsNil() { + getMethodOverridesRec(p.Interface(), basePrefix, cache) + } + } + } + // Add overrides in current struct + // Current struct's value-type method-set + valMethods := make(map[string]bool) + for i := 0; i < structType.NumMethod(); i++ { + valMethods[structType.Method(i).Name] = true + } + // Compare current struct's pointer-type method-set to its value-type method-set + for i := 0; i < ptrType.NumMethod(); i++ { + mn := ptrType.Method(i).Name + if !valMethods[mn] { + cache[mn] = true + } + } +} + // Close finalizes the runtime process, signalling the end of the execution to // the jsii kernel process, and waiting for graceful termination. The best // practice is to defer call thins at the beginning of the "main" function. diff --git a/packages/@jsii/python-runtime/requirements.txt b/packages/@jsii/python-runtime/requirements.txt index 2fce16da48..7492f7afed 100644 --- a/packages/@jsii/python-runtime/requirements.txt +++ b/packages/@jsii/python-runtime/requirements.txt @@ -3,7 +3,7 @@ mypy==0.812 pip~=21.0 pytest~=6.2 pytest-mypy~=0.8 -setuptools~=54.2 +setuptools~=56.0 wheel~=0.36 -e . diff --git a/packages/@jsii/runtime/package.json b/packages/@jsii/runtime/package.json index b6469c57d7..7b8d9cdf5d 100644 --- a/packages/@jsii/runtime/package.json +++ b/packages/@jsii/runtime/package.json @@ -50,7 +50,7 @@ "source-map-loader": "^2.0.1", "ts-jest": "^26.5.4", "typescript": "~3.9.9", - "webpack": "^5.28.0", + "webpack": "^5.30.0", "webpack-cli": "^4.6.0" } } diff --git a/packages/jsii-pacmak/lib/targets/go.ts b/packages/jsii-pacmak/lib/targets/go.ts index 5d77d191be..478a9e81ef 100644 --- a/packages/jsii-pacmak/lib/targets/go.ts +++ b/packages/jsii-pacmak/lib/targets/go.ts @@ -43,17 +43,20 @@ export class Golang extends Target { try { // run `go build` with local.go.mod, go 1.16 requires that we download // modules explicit so go.sum is updated. - await go('mod', ['download', '-modfile', localGoMod], { cwd: pkgDir }); + await go('mod', ['download', '-modfile', localGoMod.path], { + cwd: pkgDir, + }); } catch (e) { - const content = await fs.readFile(localGoMod, 'utf8'); - logging.info(`Content of ${localGoMod} file:\n${content}`); + logging.info( + `[${pkgDir}] Content of ${localGoMod.path} file:\n${localGoMod.content}`, + ); return Promise.reject(e); } - await go('build', ['-modfile', localGoMod, './...'], { cwd: pkgDir }); + await go('build', ['-modfile', localGoMod.path, './...'], { cwd: pkgDir }); // delete local.go.mod and local.go.sum from the output directory so it doesn't get published - const localGoSum = `${path.basename(localGoMod, '.mod')}.sum`; - await fs.remove(path.join(pkgDir, localGoMod)); + const localGoSum = `${path.basename(localGoMod.path, '.mod')}.sum`; + await fs.remove(path.join(pkgDir, localGoMod.path)); return fs.remove(path.join(pkgDir, localGoSum)); } @@ -110,16 +113,19 @@ export class Golang extends Target { // read existing content const goMod = path.join(pkgDir, GOMOD_FILENAME); - const lines = (await fs.readFile(goMod, 'utf-8')).split('\n'); + const lines = [await fs.readFile(goMod, 'utf-8'), '', '// Local packages:']; for (const [from, to] of Object.entries(replace)) { - logging.info(`Local replace: ${from} => ${to}`); + logging.info(`[${pkgDir}] Local replace: ${from} => ${to}`); lines.push(`replace ${from} => ${to}`); } const localGoMod = `local.${GOMOD_FILENAME}`; - await fs.writeFile(path.join(pkgDir, localGoMod), lines.join('\n')); - return localGoMod; + const content = lines.join('\n'); + await fs.writeFile(path.join(pkgDir, localGoMod), content, { + encoding: 'utf-8', + }); + return { path: localGoMod, content }; } } diff --git a/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt b/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt index b5d704e37b..044b0fdf35 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~=54.1.2 # build-system +setuptools~=56.0.0 # build-system wheel~=0.36.2 # build-system twine~=3.4.1 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 b291f330f8..9a240d6f85 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~=54.1.2", "wheel~=0.36.2"] +requires = ["setuptools~=56.0.0", "wheel~=0.36.2"] 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~=54.1.2", "wheel~=0.36.2"] +requires = ["setuptools~=56.0.0", "wheel~=0.36.2"] 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 d949ab5da1..bdcfb16e5b 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~=54.1.2", "wheel~=0.36.2"] +requires = ["setuptools~=56.0.0", "wheel~=0.36.2"] 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~=54.1.2", "wheel~=0.36.2"] +requires = ["setuptools~=56.0.0", "wheel~=0.36.2"] 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~=54.1.2", "wheel~=0.36.2"] +requires = ["setuptools~=56.0.0", "wheel~=0.36.2"] 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~=54.1.2", "wheel~=0.36.2"] +requires = ["setuptools~=56.0.0", "wheel~=0.36.2"] 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 6ee91b0691..0612a6732c 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~=54.1.2", "wheel~=0.36.2"] +requires = ["setuptools~=56.0.0", "wheel~=0.36.2"] build-backend = "setuptools.build_meta" `; @@ -725,7 +725,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~=54.1.2", "wheel~=0.36.2"] +requires = ["setuptools~=56.0.0", "wheel~=0.36.2"] build-backend = "setuptools.build_meta" `; @@ -1179,7 +1179,7 @@ scope.jsii-calc-lib exports[`Generated code for "@scope/jsii-calc-lib": /python/pyproject.toml 1`] = ` [build-system] -requires = ["setuptools~=54.1.2", "wheel~=0.36.2"] +requires = ["setuptools~=56.0.0", "wheel~=0.36.2"] 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~=54.1.2", "wheel~=0.36.2"] +requires = ["setuptools~=56.0.0", "wheel~=0.36.2"] build-backend = "setuptools.build_meta" `; diff --git a/packages/jsii/lib/transforms/deprecated-remover.ts b/packages/jsii/lib/transforms/deprecated-remover.ts index b3f14649ef..82bf54f36a 100644 --- a/packages/jsii/lib/transforms/deprecated-remover.ts +++ b/packages/jsii/lib/transforms/deprecated-remover.ts @@ -591,7 +591,11 @@ class Transformation { const symbol = typeChecker.getSymbolAtLocation( ts.getNameOfDeclaration(node as ts.Declaration) ?? node, ); - return symbol && typeChecker.getFullyQualifiedName(symbol); + // This symbol ☝️ does not contain enough information in some cases - when + // an imported type is part of a heritage clause - to produce the fqn. + // Round tripping this to its type and back to a symbol seems to fix this. + const type = symbol && typeChecker.getDeclaredTypeOfSymbol(symbol); + return type?.symbol && typeChecker.getFullyQualifiedName(type.symbol); } private static typeReference( diff --git a/packages/jsii/test/deprecated-remover.test.ts b/packages/jsii/test/deprecated-remover.test.ts index 109509daf2..3ba3990175 100644 --- a/packages/jsii/test/deprecated-remover.test.ts +++ b/packages/jsii/test/deprecated-remover.test.ts @@ -1,4 +1,4 @@ -import { compileJsiiForTest } from '../lib'; +import { compileJsiiForTest, HelperCompilationResult } from '../lib'; const DEPRECATED = '/** @deprecated stripped */'; @@ -114,15 +114,7 @@ test('produces correct output', async () => { }, } `); - expect( - Object.entries(result.files) - .filter(([name]) => name.endsWith('.d.ts')) - .map(([name, content]) => { - const separator = '/'.repeat(name.length + 8); - return `${separator}\n/// ${name} ///\n${content}${separator}\n`; - }) - .join('\n\n'), - ).toMatchInlineSnapshot(` + expect(declFilesSnapshot(result)).toMatchInlineSnapshot(` "////////////////// /// index.d.ts /// import './deprecated'; @@ -159,3 +151,47 @@ test('produces correct output', async () => { " `); }); + +test('cross-file deprecated heritage', async () => { + const result = await compileJsiiForTest( + { + 'index.ts': ` + import { IDeprecated } from './deprecated'; + export * from './deprecated'; + export interface INotDeprecated extends IDeprecated {} + `, + 'deprecated.ts': ` + ${DEPRECATED} + export interface IDeprecated {} + `, + }, + undefined /* callback */, + { stripDeprecated: true }, + ); + + expect(declFilesSnapshot(result)).toMatchInlineSnapshot(` + "////////////////// + /// index.d.ts /// + import './deprecated'; + import './deprecated'; + export interface INotDeprecated { + } + ////////////////// + + + /////////////////////// + /// deprecated.d.ts /// + /////////////////////// + " + `); +}); + +function declFilesSnapshot(result: HelperCompilationResult) { + return Object.entries(result.files) + .filter(([name]) => name.endsWith('.d.ts')) + .map(([name, content]) => { + const separator = '/'.repeat(name.length + 8); + return `${separator}\n/// ${name} ///\n${content}${separator}\n`; + }) + .join('\n\n'); +} diff --git a/yarn.lock b/yarn.lock index 58705523f0..88184be3ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1279,9 +1279,9 @@ "@octokit/types" "^6.0.3" "@octokit/core@^3.2.3": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.3.2.tgz#128377d0e05d8b548b26fc6622570220b103bc69" - integrity sha512-Jx83n4tuX/z7QtxnPsAKxXPzH3vANtKmlCB3W3vt18JbkEaBYm+C8dgAlA1FNtqNk3L21pxsKNbWkUQAhiV7ng== + version "3.4.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.4.0.tgz#b48aa27d755b339fe7550548b340dcc2b513b742" + integrity sha512-6/vlKPP8NF17cgYXqucdshWqmMZGXkuvtcrWCgU5NOI0Pl2GjlmZyWgBMrU8zJ3v2MJlM6++CiB45VKYmhiWWg== dependencies: "@octokit/auth-token" "^2.4.4" "@octokit/graphql" "^4.5.8" @@ -1653,13 +1653,13 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.20.0.tgz#9d8794bd99aad9153092ad13c96164e3082e9a92" - integrity sha512-sw+3HO5aehYqn5w177z2D82ZQlqHCwcKSMboueo7oE4KU9QiC0SAgfS/D4z9xXvpTc8Bt41Raa9fBR8T2tIhoQ== +"@typescript-eslint/eslint-plugin@^4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.21.0.tgz#3fce2bfa76d95c00ac4f33dff369cb593aab8878" + integrity sha512-FPUyCPKZbVGexmbCFI3EQHzCZdy2/5f+jv6k2EDljGdXSRc0cKvbndd2nHZkSLqCNOPk0jB6lGzwIkglXcYVsQ== dependencies: - "@typescript-eslint/experimental-utils" "4.20.0" - "@typescript-eslint/scope-manager" "4.20.0" + "@typescript-eslint/experimental-utils" "4.21.0" + "@typescript-eslint/scope-manager" "4.21.0" debug "^4.1.1" functional-red-black-tree "^1.0.1" lodash "^4.17.15" @@ -1667,60 +1667,60 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.20.0.tgz#a8ab2d7b61924f99042b7d77372996d5f41dc44b" - integrity sha512-sQNlf6rjLq2yB5lELl3gOE7OuoA/6IVXJUJ+Vs7emrQMva14CkOwyQwD7CW+TkmOJ4Q/YGmoDLmbfFrpGmbKng== +"@typescript-eslint/experimental-utils@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.21.0.tgz#0b0bb7c15d379140a660c003bdbafa71ae9134b6" + integrity sha512-cEbgosW/tUFvKmkg3cU7LBoZhvUs+ZPVM9alb25XvR0dal4qHL3SiUqHNrzoWSxaXA9gsifrYrS1xdDV6w/gIA== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.20.0" - "@typescript-eslint/types" "4.20.0" - "@typescript-eslint/typescript-estree" "4.20.0" + "@typescript-eslint/scope-manager" "4.21.0" + "@typescript-eslint/types" "4.21.0" + "@typescript-eslint/typescript-estree" "4.21.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.20.0.tgz#8dd403c8b4258b99194972d9799e201b8d083bdd" - integrity sha512-m6vDtgL9EABdjMtKVw5rr6DdeMCH3OA1vFb0dAyuZSa3e5yw1YRzlwFnm9knma9Lz6b2GPvoNSa8vOXrqsaglA== +"@typescript-eslint/parser@^4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.21.0.tgz#a227fc2af4001668c3e3f7415d4feee5093894c1" + integrity sha512-eyNf7QmE5O/l1smaQgN0Lj2M/1jOuNg2NrBm1dqqQN0sVngTLyw8tdCbih96ixlhbF1oINoN8fDCyEH9SjLeIA== dependencies: - "@typescript-eslint/scope-manager" "4.20.0" - "@typescript-eslint/types" "4.20.0" - "@typescript-eslint/typescript-estree" "4.20.0" + "@typescript-eslint/scope-manager" "4.21.0" + "@typescript-eslint/types" "4.21.0" + "@typescript-eslint/typescript-estree" "4.21.0" debug "^4.1.1" -"@typescript-eslint/scope-manager@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.20.0.tgz#953ecbf3b00845ece7be66246608be9d126d05ca" - integrity sha512-/zm6WR6iclD5HhGpcwl/GOYDTzrTHmvf8LLLkwKqqPKG6+KZt/CfSgPCiybshmck66M2L5fWSF/MKNuCwtKQSQ== +"@typescript-eslint/scope-manager@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.21.0.tgz#c81b661c4b8af1ec0c010d847a8f9ab76ab95b4d" + integrity sha512-kfOjF0w1Ix7+a5T1knOw00f7uAP9Gx44+OEsNQi0PvvTPLYeXJlsCJ4tYnDj5PQEYfpcgOH5yBlw7K+UEI9Agw== dependencies: - "@typescript-eslint/types" "4.20.0" - "@typescript-eslint/visitor-keys" "4.20.0" + "@typescript-eslint/types" "4.21.0" + "@typescript-eslint/visitor-keys" "4.21.0" -"@typescript-eslint/types@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.20.0.tgz#c6cf5ef3c9b1c8f699a9bbdafb7a1da1ca781225" - integrity sha512-cYY+1PIjei1nk49JAPnH1VEnu7OYdWRdJhYI5wiKOUMhLTG1qsx5cQxCUTuwWCmQoyriadz3Ni8HZmGSofeC+w== +"@typescript-eslint/types@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.21.0.tgz#abdc3463bda5d31156984fa5bc316789c960edef" + integrity sha512-+OQaupjGVVc8iXbt6M1oZMwyKQNehAfLYJJ3SdvnofK2qcjfor9pEM62rVjBknhowTkh+2HF+/KdRAc/wGBN2w== -"@typescript-eslint/typescript-estree@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.20.0.tgz#8b3b08f85f18a8da5d88f65cb400f013e88ab7be" - integrity sha512-Knpp0reOd4ZsyoEJdW8i/sK3mtZ47Ls7ZHvD8WVABNx5Xnn7KhenMTRGegoyMTx6TiXlOVgMz9r0pDgXTEEIHA== +"@typescript-eslint/typescript-estree@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.21.0.tgz#3817bd91857beeaeff90f69f1f112ea58d350b0a" + integrity sha512-ZD3M7yLaVGVYLw4nkkoGKumb7Rog7QID9YOWobFDMQKNl+vPxqVIW/uDk+MDeGc+OHcoG2nJ2HphwiPNajKw3w== dependencies: - "@typescript-eslint/types" "4.20.0" - "@typescript-eslint/visitor-keys" "4.20.0" + "@typescript-eslint/types" "4.21.0" + "@typescript-eslint/visitor-keys" "4.21.0" debug "^4.1.1" globby "^11.0.1" is-glob "^4.0.1" semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/visitor-keys@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.20.0.tgz#1e84db034da13f208325e6bfc995c3b75f7dbd62" - integrity sha512-NXKRM3oOVQL8yNFDNCZuieRIwZ5UtjNLYtmMx2PacEAGmbaEYtGgVHUHVyZvU/0rYZcizdrWjDo+WBtRPSgq+A== +"@typescript-eslint/visitor-keys@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.21.0.tgz#990a9acdc124331f5863c2cf21c88ba65233cd8d" + integrity sha512-dH22dROWGi5Z6p+Igc8bLVLmwy7vEe8r+8c+raPQU0LxgogPUrRAtRGtvBWmlr9waTu3n+QLt/qrS/hWzk1x5w== dependencies: - "@typescript-eslint/types" "4.20.0" + "@typescript-eslint/types" "4.21.0" eslint-visitor-keys "^2.0.0" "@webassemblyjs/ast@1.11.0": @@ -1962,9 +1962,9 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.0.2.tgz#1396e27f208ed56dd5638ab5a251edeb1c91d402" - integrity sha512-V0HGxJd0PiDF0ecHYIesTOqfd1gJguwQUOYfMfAWnRsWQEXfc5ifbUFhD3Wjc+O+y7VAqL+g07prq9gHQ/JOZQ== + version "8.0.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.0.5.tgz#f07d6fdeffcdbb80485570ce3f1bc845fcc812b9" + integrity sha512-RkiLa/AeJx7+9OvniQ/qeWu0w74A8DiPPBclQ6ji3ZQkv5KamO+QGpqmi7O4JIw3rHGUXZ6CoP9tsAkn3gyazg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2037,9 +2037,9 @@ anymatch@^2.0.0: normalize-path "^2.1.1" anymatch@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -2275,9 +2275,9 @@ babel-preset-jest@^26.6.2: babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base@^0.11.1: version "0.11.2" @@ -2300,9 +2300,9 @@ bcrypt-pbkdf@^1.0.0: tweetnacl "^0.14.3" before-after-hook@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.0.tgz#09c40d92e936c64777aa385c4e9b904f8147eaf0" - integrity sha512-jH6rKQIfroBbhEXVmI7XmXe3ix5S/PgJqpzdDPnR8JGLHWNYLsYZ6tK5iWOF/Ra3oqEX0NobXGlzbiylIzVphQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c" + integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw== brace-expansion@^1.1.7: version "1.1.11" @@ -2469,9 +2469,9 @@ camelcase@^6.0.0, camelcase@^6.2.0: integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== caniuse-lite@^1.0.30001181: - version "1.0.30001205" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001205.tgz#d79bf6a6fb13196b4bb46e5143a22ca0242e0ef8" - integrity sha512-TL1GrS5V6LElbitPazidkBMD9sa448bQDDLrumDqaggmKFcuU2JW1wTOHJPukAcOMtEmLcmDJEzfRrf+GjM0Og== + version "1.0.30001207" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001207.tgz#364d47d35a3007e528f69adb6fecb07c2bb2cc50" + integrity sha512-UPQZdmAsyp2qfCTiMU/zqGSWOYaY9F9LL61V8f+8MrubsaDGpaHD9HRV/EWZGULZn0Hxu48SKzI5DgFwTvHuYw== capture-exit@^2.0.0: version "2.0.0" @@ -3289,9 +3289,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.3.649: - version "1.3.703" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.703.tgz#6d9b9a75c42a40775f5930329e642b22b227317f" - integrity sha512-SVBVhNB+4zPL+rvtWLw7PZQkw/Eqj1HQZs22xtcqW36+xoifzEOEEDEpkxSMfB6RFeSIOcG00w6z5mSqLr1Y6w== + version "1.3.709" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.709.tgz#d7be0b5686a2fdfe8bad898faa3a428d04d8f656" + integrity sha512-LolItk2/ikSGQ7SN8UkuKVNMBZp3RG7Itgaxj1npsHRzQobj9JjMneZOZfLhtwlYBe5fCJ75k+cVCiDFUs23oA== emittery@^0.7.1: version "0.7.2" @@ -3343,9 +3343,9 @@ env-paths@^2.2.0: integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3, envinfo@^7.7.4: - version "7.7.4" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.4.tgz#c6311cdd38a0e86808c1c9343f667e4267c4a320" - integrity sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ== + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== err-code@^2.0.2: version "2.0.3" @@ -4594,9 +4594,9 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: kind-of "^6.0.2" is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.0.tgz#b037c8815281edaad6c2562648a5f5f18839d5f7" + integrity sha512-K4GwB4i/HzhAzwP/XSlspzRdFTI9N8OxJOyOU7Y5Rz+p+WBokXWVWblaJeBkggthmoSV0OoGTH5thJNvplpkvQ== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -4709,9 +4709,9 @@ is-plain-object@^5.0.0: integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-potential-custom-element-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" - integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-regex@^1.1.1, is-regex@^1.1.2: version "1.1.2" @@ -5760,9 +5760,9 @@ map-obj@^1.0.0, map-obj@^1.0.1: integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-obj@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.0.tgz#0e8bc823e2aaca8a0942567d12ed14f389eec153" - integrity sha512-NAq0fCmZYGz9UFEQyndp7sisrow4GroyGeKluyKC/chuITZsPyOyC1UJZPJlVFImhXdROIP5xqouRLThT3BbpQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" + integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== map-visit@^1.0.0: version "1.0.0" @@ -5853,17 +5853,17 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.0.5" -mime-db@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" - integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== +mime-db@1.47.0: + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19: - version "2.1.29" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" - integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: - mime-db "1.46.0" + mime-db "1.47.0" mimic-fn@^2.1.0: version "2.1.0" @@ -6849,9 +6849,9 @@ promise-retry@^2.0.1: retry "^0.12.0" prompts@^2.0.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" - integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" @@ -7754,10 +7754,10 @@ stack-utils@^2.0.2: dependencies: escape-string-regexp "^2.0.0" -standard-version@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-9.1.1.tgz#7561df6351b075a44544ce3d3ebcffcb9582ba5a" - integrity sha512-PF9JnRauBwH7DAkmefYu1mB2Kx0MVG13udqDTFmDUiogbyikBAHBdMrVuauxtAb2YIkyZ3FMYCNv0hqUKMOPww== +standard-version@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-9.2.0.tgz#d4e64b201ec1abb8a677b265d8755e5e8b9e33a3" + integrity sha512-utJcqjk/wR4sePSwDoRcc5CzJ6S+kec5Hd0+1TJI+j1TRYuuptweAnEUdkkjGf2vYoGab2ezefyVtW065HZ1Uw== dependencies: chalk "^2.4.2" conventional-changelog "3.1.24" @@ -7972,9 +7972,9 @@ supports-color@^7.0.0, supports-color@^7.1.0: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" - integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" @@ -8608,10 +8608,10 @@ webpack-sources@^2.1.1: source-list-map "^2.0.1" source-map "^0.6.1" -webpack@^5.28.0: - version "5.28.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.28.0.tgz#0de8bcd706186b26da09d4d1e8cbd3e4025a7c2f" - integrity sha512-1xllYVmA4dIvRjHzwELgW4KjIU1fW4PEuEnjsylz7k7H5HgPOctIq7W1jrt3sKH9yG5d72//XWzsHhfoWvsQVg== +webpack@^5.30.0: + version "5.30.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.30.0.tgz#07d87c182a060e0c2491062f3dc0edc85a29d884" + integrity sha512-Zr9NIri5yzpfmaMea2lSMV1UygbW0zQsSlGLMgKUm63ACXg6alhd1u4v5UBSBjzYKXJN6BNMGVM7w165e7NxYA== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.46" @@ -8839,14 +8839,14 @@ xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + version "4.0.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.2.tgz#c504495ba9b59230dd60226d1dd89c3c0a1b745e" + integrity sha512-DnBDwcL54b5xWMM/7RfFg4xs5amYxq2ot49aUfLjQSAracXkGvlZq0txzqr3Pa6Q0ayuCxBcwTzrPUScKY0O8w== y18n@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" - integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + version "5.0.7" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.7.tgz#0c514aba53fc40e2db911aeb8b51566a3374efe7" + integrity sha512-oOhslryvNcA1lB9WYr+M6TMyLkLg81Dgmyb48ZDU0lvR+5bmNDTMz7iobM1QXooaLhbbrcHrlNaABhI6Vo6StQ== yallist@^3.0.0, yallist@^3.0.3: version "3.1.1"