From 771190b5435a82fe6033a05247bfa828276f0130 Mon Sep 17 00:00:00 2001 From: Kaizen Conroy <36202692+kaizen3031593@users.noreply.github.com> Date: Thu, 16 Dec 2021 05:44:41 -0500 Subject: [PATCH 01/22] fix(rosetta): non-compiling snippets not reported on subsequent extracts (#3260) Picture this scenario: there is a non-compiling snippet in a README.md file. I run `yarn rosetta:extract --compile` and it returns diagnostics as expected. Behind the scenes, `.jsii.tabl.json` gets created as a cache, and this snippet is inserted into that file with `didCompile = false`. _Without making any changes_, I run `yarn rosetta:extract --compile` again. This time, no diagnostics are returned, and it looks like my errors have magically fixed themselves. However what is really happening is that `extract` is finding a snippet in the cache that matches the offending snippet (since I changed nothing). It is then filtering out that cached snippet, meaning we do not actually try to compile the snippet again. This is bad; `extract` should honor the `--compile` flag and return errors the second time around too. There are two ways to solve this (that I can think of): we can return diagnostics for cached snippets as well, or we can ignore non-compiling cached snippets when `--compile` is set. I have opted for the second solution for this reason: it is possible that I am intending to rerun the same snippet with the expectation that I have changed _something else_ that will result in a successful compilation (for example, I add an import to the fixture). Open to dialogue about this. --- By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license]. [Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0 --- packages/jsii-rosetta/lib/commands/extract.ts | 2 +- .../jsii-rosetta/lib/rosetta-translator.ts | 5 +- .../test/commands/extract.test.ts | 69 +++++++++++++++++++ 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/packages/jsii-rosetta/lib/commands/extract.ts b/packages/jsii-rosetta/lib/commands/extract.ts index b43ac224b8..052c187668 100644 --- a/packages/jsii-rosetta/lib/commands/extract.ts +++ b/packages/jsii-rosetta/lib/commands/extract.ts @@ -99,7 +99,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; } diff --git a/packages/jsii-rosetta/lib/rosetta-translator.ts b/packages/jsii-rosetta/lib/rosetta-translator.ts index 7da1fc8aa9..b5f8c7d0ee 100644 --- a/packages/jsii-rosetta/lib/rosetta-translator.ts +++ b/packages/jsii-rosetta/lib/rosetta-translator.ts @@ -83,14 +83,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); } diff --git a/packages/jsii-rosetta/test/commands/extract.test.ts b/packages/jsii-rosetta/test/commands/extract.test.ts index d15bd55df0..74ff8da273 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( From 93c5a49ceb01c7b457f00b784becd049b236923b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Dec 2021 13:18:56 +0000 Subject: [PATCH 02/22] chore(deps-dev): update setuptools requirement from ~=59.1.1 to ~=59.6.0 in /packages/jsii-pacmak/lib/targets/python (#3252) --- .../jsii-pacmak/lib/targets/python/requirements-dev.txt | 2 +- packages/jsii-pacmak/package.json | 2 +- .../generated-code/__snapshots__/examples.test.ts.snap | 4 ++-- .../__snapshots__/prerelease-identifiers.test.ts.snap | 8 ++++---- .../__snapshots__/target-python.test.ts.snap | 8 ++++---- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt b/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt index 43f5f355a6..f0b835671d 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 diff --git a/packages/jsii-pacmak/package.json b/packages/jsii-pacmak/package.json index 80e6ca8d58..23d2efe1f9 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": { 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" `; From f6424d8510783c9953625daba618786310606d00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Dec 2021 14:15:36 +0000 Subject: [PATCH 03/22] chore(deps-dev): update twine requirement (#3241) --- packages/jsii-pacmak/lib/targets/python/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt b/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt index f0b835671d..90ffd2fc28 100644 --- a/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt +++ b/packages/jsii-pacmak/lib/targets/python/requirements-dev.txt @@ -6,4 +6,4 @@ setuptools~=59.6.0 # build-system wheel~=0.37.0 # build-system -twine~=3.7.0 +twine~=3.7.1 From 09e30e8b0cc884eaafe052370387685bc3b40e58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Dec 2021 15:24:36 +0000 Subject: [PATCH 04/22] chore(deps-dev): update mkdocs-material requirement in /gh-pages (#3264) --- gh-pages/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gh-pages/requirements-dev.txt b/gh-pages/requirements-dev.txt index fa6c5b31c1..aaa7ec2b67 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.2 mkdocs-git-revision-date-plugin~=0.3.1 From b11a9eff8c37d0f9e50855876b1d301a6d2fb12e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Dec 2021 16:34:22 +0000 Subject: [PATCH 05/22] chore(deps): update setuptools requirement (#3250) --- packages/@jsii/python-runtime/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@jsii/python-runtime/requirements.txt b/packages/@jsii/python-runtime/requirements.txt index 8325b38ea2..c808a3ba05 100644 --- a/packages/@jsii/python-runtime/requirements.txt +++ b/packages/@jsii/python-runtime/requirements.txt @@ -3,7 +3,7 @@ mypy==0.812 pip~=21.3 pytest~=6.2 pytest-mypy~=0.8 -setuptools~=59.2 +setuptools~=59.6 wheel~=0.37 -e . From beeadaa21d5bd5a34e97691c2410366f475d3da3 Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Fri, 17 Dec 2021 12:15:53 +0100 Subject: [PATCH 06/22] fix(rosetta): transliterate command does not translate in parallel (#3262) Make the `rosetta transliterate` command do translations in parallel. Achieve this by effectively running `rosetta extract` beforehand, which does to translations in parallel using worker threads, but don't save the results anywhere. Instead, use those results as an in-memory cache when doing the single pass. Since there shouldn't be any untranslated snippets left between extract and transliterate, set the `UnknownSnippetMode` to `FAIL`, which netted me errors showing that `extract` and `transliterate` don't look at the same fields! Specifically, initializer and parameters! --- By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license]. [Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0 --- packages/jsii-rosetta/lib/commands/extract.ts | 54 ++++++++++++------- .../lib/commands/transliterate.ts | 21 +++++++- packages/jsii-rosetta/lib/jsii/assemblies.ts | 22 +++++++- packages/jsii-rosetta/lib/rosetta-reader.ts | 4 +- .../jsii-rosetta/lib/rosetta-translator.ts | 6 +++ packages/jsii-rosetta/lib/snippet.ts | 15 +++++- 6 files changed, 95 insertions(+), 27 deletions(-) diff --git a/packages/jsii-rosetta/lib/commands/extract.ts b/packages/jsii-rosetta/lib/commands/extract.ts index 052c187668..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); } @@ -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 b5f8c7d0ee..e9e84a3c4f 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; 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' }; From cb9446a4d1135ce70078123e1f1f81e8bee9272c Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Fri, 17 Dec 2021 13:22:32 +0100 Subject: [PATCH 07/22] chore(jsii): more tests on importing (#3268) Add more tests on importing types in various flavours and referencing types in various positions to convince myself that it actually works. --- By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license]. [Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0 --- packages/jsii/test/submodules.test.ts | 232 +++++++++++++++++++++----- 1 file changed, 187 insertions(+), 45 deletions(-) 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' }, + }, + ]); + }), +); From 7fa7db810c72c54192ada9c524e69a457f04bbfe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Dec 2021 11:39:31 +0000 Subject: [PATCH 08/22] chore(deps): bump golang.org/x/tools in /packages/@jsii/go-runtime (#3231) --- packages/@jsii/go-runtime/go.mod | 2 +- packages/@jsii/go-runtime/go.sum | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) 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= From 1fd2644b23fb0e1b5f24a550acee2cb726517ce6 Mon Sep 17 00:00:00 2001 From: Romain Marcadier Date: Mon, 20 Dec 2021 19:20:27 +0100 Subject: [PATCH 09/22] chore: tweak auto-approval workflow (#3274) The automated approval workflow will no longer emit an approval if the PR already has reviews. In case the PR was issued by @dependabot, it will approve with `@dependabot squash and merge` as the review body, which requests @dependabot to automatically squash and merge the PR once all CI checks successfully complete. This should help remove the need for manual intervention on most dependabot PRs. --- By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license]. [Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0 --- .github/workflows/auto-approve.yml | 52 +++++++++++++++++++++++++++--- .github/workflows/pr-labeler.yml | 18 ----------- 2 files changed, 47 insertions(+), 23 deletions(-) delete mode 100644 .github/workflows/pr-labeler.yml diff --git a/.github/workflows/auto-approve.yml b/.github/workflows/auto-approve.yml index d3f02ab60c..6fcfc1fea2 100644 --- a/.github/workflows/auto-approve.yml +++ b/.github/workflows/auto-approve.yml @@ -1,15 +1,57 @@ # 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@0.3.0 + id: needs-approving + with: + script: |- + const { issue: { number: pull_number }, repo: { owner, repo } } = context; + const reviews = github.pulls.listReviews({ owner, repo, pull_number }) + .filter((review) => review.state !== 'DISMISSED'); + core.setOutput('result', `${reviews.length === 0}`); + + # If this is NOT a dependabot PR, just approve it. + - uses: actions/github-script@0.3.0 + if: steps.needs-approving.outputs.result == 'true' && github.actor != 'dependabot[bot]' && github.actor != 'dependabot-preview[bot]' + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + script: |- + const { issue: { number: pull_number }, repo: { owner, repo } } = context; + github.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@0.3.0 + if: steps.needs-approving.outputs.result == 'true' && (github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]') + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + script: |- + const { issue: { number: pull_number }, repo: { owner, repo } } = context; + github.pulls.createReview({ + owner, repo, pull_number, + body: '@dependabot squash and merge', + event: 'APPROVE', + }); 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 }} From 6e5a0b50e19af6cb0c1817fe3c447a24a9632a7b Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Wed, 22 Dec 2021 12:20:52 +0100 Subject: [PATCH 10/22] fix(pacmak): fails on bundled dependency without entry point (#3277) `projen` uses a bundled dependency called `shx`, and this library does not have an entry point. It exposes some command-line tools and nothing else. This conflicts with our dependency finding mechanism, which performs a `require()` on the library to find it. Ignore bundled dependencies in `pacmak`, it never needs to pack them individually anyway. Fixes #3275. --- By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license]. [Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0 --- packages/jsii-pacmak/lib/dependency-graph.ts | 10 ++- .../jsii-pacmak/test/dependency-graph.test.ts | 88 +++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) 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/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; + }); +} From d0b28100d005d123a4a74f0a9f6cd160a222d686 Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Wed, 22 Dec 2021 16:27:00 +0100 Subject: [PATCH 11/22] chore(rosetta): fix sign of "NNN more diagnostics" message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Math = hard --- packages/jsii-rosetta/lib/util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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)`); } } From 2c8c647356345981cc2f9416449d48b660b5da44 Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Thu, 23 Dec 2021 12:32:11 +0100 Subject: [PATCH 12/22] fix(jsii): color codes are logged to logfiles (#3284) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the output is not a terminal, color codes get in the way. They lead to unreadable logging like this: ``` monocdk: ^[[96mlib/aws-apigateway/lib/domain-name.ts^[[0m:^[[93m114^[[0m:^[[93m19^[[0m - ^[[93mwarning^[[0m^[[90m JSII5019: ^[[0mThe property name "domainName" conflicts with the declaring class "DomainName". This will result in renaming the class to "_DomainName" in C#. Consider renaming "domainName". monocdk: 114 public readonly domainName: string; monocdk:    ~~~~~~~~~~ ``` Don't output color codes if we detect the output is not a TTY. --- By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license]. [Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0 --- packages/jsii/bin/jsii.ts | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) 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, ''); +} From ad7f6a4a20564e733bf29a70956bbbe54d66562e Mon Sep 17 00:00:00 2001 From: Kaizen Conroy <36202692+kaizen3031593@users.noreply.github.com> Date: Thu, 23 Dec 2021 09:14:01 -0500 Subject: [PATCH 13/22] fix(rosetta): diagnostics from infused snippets were not ignored (#3282) Recently we implemented the `infused` metadata that turns `strict=false` and `loose=true` for the specific snippet. However we still output the diagnostics along with other snippets (with `isError=true`). One thing we could do is make these diagnostics `isError=false`, but I argue that we want to ignore these diagnostics entirely. They aren't actually diagnostics; we will find them in the cache and they do compile. --- By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license]. [Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0 --- packages/jsii-rosetta/lib/translate.ts | 4 +- .../test/commands/extract.test.ts | 43 +++++++++++++++++-- 2 files changed, 43 insertions(+), 4 deletions(-) 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/test/commands/extract.test.ts b/packages/jsii-rosetta/test/commands/extract.test.ts index 74ff8da273..ecc6c0c0c4 100644 --- a/packages/jsii-rosetta/test/commands/extract.test.ts +++ b/packages/jsii-rosetta/test/commands/extract.test.ts @@ -456,7 +456,7 @@ test('infused examples skip loose mode', async () => { try { const cacheToFile = path.join(otherAssembly.moduleDirectory, 'test.tabl.json'); - // Without exampleMetadata infused=true, expect an error + // Without exampleMetadata infused, expect an error await expect( extract.extractSnippets([otherAssembly.moduleDirectory], { cacheToFile, @@ -465,8 +465,7 @@ test('infused examples skip loose mode', async () => { ).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'; + otherAssembly.assembly.types!['my_assembly.ClassA'].docs!.custom!.exampleMetadata = 'lit=integ.test.ts infused'; await otherAssembly.updateAssembly(); // Expect same function call to succeed now @@ -484,6 +483,44 @@ test('infused examples skip loose mode', async () => { } }); +test('infused examples have no diagnostics', async () => { + const otherAssembly = await TestJsiiModule.fromSource( + { + 'index.ts': ` + /** + * ClassA + * + * @exampleMetadata infused + * @example x + */ + export class ClassA { + public someMethod() { + } + } + `, + }, + { + name: 'my_assembly', + jsii: { + ...DUMMY_JSII_CONFIG, + }, + }, + ); + try { + const cacheToFile = path.join(otherAssembly.moduleDirectory, 'test.tabl.json'); + + const results = await extract.extractSnippets([otherAssembly.moduleDirectory], { + cacheToFile, + includeCompilerDiagnostics: true, + loose: false, + }); + + expect(results.diagnostics).toEqual([]); + } finally { + await otherAssembly.cleanup(); + } +}); + class MockTranslator extends RosettaTranslator { public constructor(opts: RosettaTranslatorOptions, translatorFn: jest.Mock) { super(opts); From 06e2dfd4a51884b150886660c07d725451ea67b3 Mon Sep 17 00:00:00 2001 From: Eli Polonsky Date: Thu, 23 Dec 2021 19:39:39 +0200 Subject: [PATCH 14/22] chore: auto approve workflow broken (#3288) The auto-approve workflow is currently [failing](https://github.com/aws/jsii/runs/4618073266?check_suite_focus=true) with: ```console Error: Input required and not supplied: github-token Error: Input required and not supplied: github-token at Object.getInput (/home/runner/work/_actions/actions/github-script/0.3.0/node_modules/@actions/core/lib/core.js:73:15) at main (/home/runner/work/_actions/actions/github-s ``` This because version `0.3.0` of the action requires a `github-token`, and we don't always provide it. Instead of adding it, I upgraded to version `5.0.0` of the action, which no longer requires it. Some adjustments to the implementation were also necessary due to [breaking changes](https://github.com/actions/github-script#breaking-changes-in-v5). --- By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license]. [Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0 --- .github/workflows/auto-approve.yml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/workflows/auto-approve.yml b/.github/workflows/auto-approve.yml index 6fcfc1fea2..c6751dee68 100644 --- a/.github/workflows/auto-approve.yml +++ b/.github/workflows/auto-approve.yml @@ -23,35 +23,33 @@ jobs: # 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@0.3.0 + - uses: actions/github-script@v5.0.0 id: needs-approving with: script: |- const { issue: { number: pull_number }, repo: { owner, repo } } = context; - const reviews = github.pulls.listReviews({ owner, repo, pull_number }) + const reviews = (await github.rest.pulls.listReviews({ owner, repo, pull_number })).data .filter((review) => review.state !== 'DISMISSED'); - core.setOutput('result', `${reviews.length === 0}`); + return reviews.length === 0; # If this is NOT a dependabot PR, just approve it. - - uses: actions/github-script@0.3.0 + - uses: actions/github-script@v5.0.0 if: steps.needs-approving.outputs.result == 'true' && github.actor != 'dependabot[bot]' && github.actor != 'dependabot-preview[bot]' with: - github-token: "${{ secrets.GITHUB_TOKEN }}" script: |- const { issue: { number: pull_number }, repo: { owner, repo } } = context; - github.pulls.createReview({ + 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@0.3.0 + - uses: actions/github-script@v5.0.0 if: steps.needs-approving.outputs.result == 'true' && (github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]') with: - github-token: "${{ secrets.GITHUB_TOKEN }}" script: |- const { issue: { number: pull_number }, repo: { owner, repo } } = context; - github.pulls.createReview({ + github.rest.pulls.createReview({ owner, repo, pull_number, body: '@dependabot squash and merge', event: 'APPROVE', - }); + }); \ No newline at end of file From f1fed29ade7bfa6639512ec99a489c71e7ec6a91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Dec 2021 18:34:00 +0000 Subject: [PATCH 15/22] chore(deps): update black requirement in /packages/@jsii/python-runtime (#3227) --- packages/@jsii/python-runtime/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@jsii/python-runtime/requirements.txt b/packages/@jsii/python-runtime/requirements.txt index c808a3ba05..1f0bcade04 100644 --- a/packages/@jsii/python-runtime/requirements.txt +++ b/packages/@jsii/python-runtime/requirements.txt @@ -1,4 +1,4 @@ -black~=21.11b1 +black~=21.12b0 mypy==0.812 pip~=21.3 pytest~=6.2 From 1d9727689279ca9d60b441a974b2822af0bafa3c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Dec 2021 19:42:02 +0000 Subject: [PATCH 16/22] chore(deps-dev): update mkdocs-material requirement in /gh-pages (#3272) --- gh-pages/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gh-pages/requirements-dev.txt b/gh-pages/requirements-dev.txt index aaa7ec2b67..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~=8.1.2 +mkdocs-material~=8.1.3 mkdocs-git-revision-date-plugin~=0.3.1 From e76221eec597d075f44e169ef51774c178a1d5a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Dec 2021 20:58:56 +0000 Subject: [PATCH 17/22] chore(deps): update cattrs requirement in /packages/@jsii/python-runtime (#3226) --- packages/@jsii/python-runtime/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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", From e7f1f1a30997d238cadc60315ad647a186fd7c22 Mon Sep 17 00:00:00 2001 From: AWS CDK Automation <43080478+aws-cdk-automation@users.noreply.github.com> Date: Thu, 23 Dec 2021 23:13:51 +0100 Subject: [PATCH 18/22] chore: npm-check-updates && yarn upgrade (#3261) Ran npm-check-updates and yarn upgrade to keep the `yarn.lock` file up-to-date. --- package.json | 12 +- packages/@jsii/check-node/package.json | 4 +- .../@jsii/dotnet-runtime-test/package.json | 2 +- packages/@jsii/dotnet-runtime/package.json | 2 +- packages/@jsii/go-runtime/package.json | 4 +- packages/@jsii/integ-test/package.json | 6 +- packages/@jsii/java-runtime/package.json | 2 +- packages/@jsii/kernel/package.json | 8 +- packages/@jsii/runtime/package.json | 8 +- packages/@jsii/spec/package.json | 6 +- .../jsii-calc-base-of-base/package.json | 2 +- packages/@scope/jsii-calc-base/package.json | 2 +- packages/@scope/jsii-calc-lib/package.json | 2 +- packages/codemaker/package.json | 6 +- packages/jsii-calc/package.json | 4 +- packages/jsii-config/package.json | 6 +- packages/jsii-diff/package.json | 6 +- packages/jsii-pacmak/package.json | 8 +- packages/jsii-reflect/package.json | 6 +- packages/jsii-rosetta/package.json | 6 +- packages/jsii/package.json | 8 +- packages/oo-ascii-tree/package.json | 6 +- tools/jsii-compliance/package.json | 4 +- yarn.lock | 523 +++++++++--------- 24 files changed, 316 insertions(+), 327 deletions(-) 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/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/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/package.json b/packages/jsii-pacmak/package.json index 23d2efe1f9..91ef03460e 100644 --- a/packages/jsii-pacmak/package.json +++ b/packages/jsii-pacmak/package.json @@ -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-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/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/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/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" From dd444313b4177babce8d972da01071f308600416 Mon Sep 17 00:00:00 2001 From: Kaizen Conroy <36202692+kaizen3031593@users.noreply.github.com> Date: Fri, 24 Dec 2021 12:40:54 -0500 Subject: [PATCH 19/22] fix(rosetta): infused snippets not returned from cache (#3291) Infused snippets do not have the right full source since we are adding the local fixture to the snippet rather than the fixture from where the snippet came from. Since there is no hope in actually translating an infused snippet (unless it is in the same directory), we might as well take any cache result as is. So this PR adds logic that returns the cache result for infused snippets always. This was tested on my local machine and dropped all errors from infused snippets. There are still errors from directories that are not yet strict, which is understandable. Also, the infuse command was missing `cache-from` argument that is present in `infuseOptions`. We were using those options as part of `rosetta extract --infuse` but should be available via `rosetta infuse` as well. Also fixed up minor mistake in tests where I was testing for `infused=true` instead of `infused=''`. --- By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license]. [Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0 --- packages/jsii-rosetta/bin/jsii-rosetta.ts | 26 ++++- .../jsii-rosetta/lib/rosetta-translator.ts | 11 +++ .../test/commands/extract.test.ts | 97 +++++++++++++------ 3 files changed, 101 insertions(+), 33 deletions(-) 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/rosetta-translator.ts b/packages/jsii-rosetta/lib/rosetta-translator.ts index e9e84a3c4f..1a00e463c6 100644 --- a/packages/jsii-rosetta/lib/rosetta-translator.ts +++ b/packages/jsii-rosetta/lib/rosetta-translator.ts @@ -149,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 && @@ -160,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/test/commands/extract.test.ts b/packages/jsii-rosetta/test/commands/extract.test.ts index ecc6c0c0c4..51406b4629 100644 --- a/packages/jsii-rosetta/test/commands/extract.test.ts +++ b/packages/jsii-rosetta/test/commands/extract.test.ts @@ -432,44 +432,83 @@ test('extract and infuse in one command', async () => { expect(types!['my_assembly.ClassA'].docs?.example).toBeDefined(); }); -test('infused examples skip loose mode', async () => { - const otherAssembly = await TestJsiiModule.fromSource( - { - 'index.ts': ` - /** - * ClassA - * - * @exampleMetadata lit=integ.test.ts - * @example x - */ - export class ClassA { - public someMethod() { +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, - }, - ); - try { - const cacheToFile = path.join(otherAssembly.moduleDirectory, 'test.tabl.json'); + `, + }, + { + 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([otherAssembly.moduleDirectory], { + extract.extractSnippets([infusedAssembly.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'; - await otherAssembly.updateAssembly(); + // 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([otherAssembly.moduleDirectory], { + await extract.extractSnippets([infusedAssembly.moduleDirectory], { cacheToFile, ...defaultExtractOptions, }); @@ -478,9 +517,7 @@ test('infused examples skip loose mode', async () => { expect(tablet.count).toEqual(1); const tr = tablet.tryGetSnippet(tablet.snippetKeys[0]); expect(tr?.originalSource.source).toEqual('x'); - } finally { - await otherAssembly.cleanup(); - } + }); }); test('infused examples have no diagnostics', async () => { From f66c6767f119d65c6c590113033b776b48419026 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Dec 2021 19:16:18 +0000 Subject: [PATCH 20/22] chore(deps-dev): bump mypy in /packages/jsii-pacmak/test/generated-code (#3286) --- packages/jsii-pacmak/test/generated-code/requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 04d64c91da5e8a0eccd06cd03a4b7a20bce55845 Mon Sep 17 00:00:00 2001 From: Rico Huijbers Date: Fri, 24 Dec 2021 20:20:51 +0100 Subject: [PATCH 21/22] fix(jsii): slow with deep dependency tree (#3294) The `_loadDependencies` calls in jsii were taking a very long time with a deep dependency tree (like in `cdk-watchful`). The reason for this is another accidentally quadratic algorithm: every dependency would be processed for every time it transitively occurred in any of the dependency graph's dependencies. For a reason I don't completely understand yet, the timings got a whole lot worse recently in 1.49.0. Refactor to add some short-circuiting: if a directory has already been processed, no need to recurse into it yet again (the first recursion pass on that tree will have gathered all the information that is necessary already). I stared long and hard at the `semver-intersect` call... but as far as I could tell we would never be in a situation where `packageVersions` would/could already contain a previous version, and the intersection would actually do anything. I validated with a print statement. As far as I can tell this was dead code and I removed it. Timings on the `cdk-watchful` project for reference: ``` $ time npx tsc 5.88 real 9.62 user 0.38 sys $ time npx jsii@1.47.0 35.64 real 39.38 user 0.81 sys $ time npx jsii@1.49.0 334.26 real 239.60 user 141.71 sys $ time /path/to/my/jsii 6.11 real 9.82 user 0.42 sys ``` Diff a `diff` between a jsii assembly produced with the old and the new version. No change. --- packages/jsii/lib/project-info.ts | 190 +++++++++++++++++++----------- 1 file changed, 123 insertions(+), 67 deletions(-) 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; +} From 86a8d77bd0654e6523f0df6b509cc3dba0ad8c8b Mon Sep 17 00:00:00 2001 From: AWS CDK Team Date: Fri, 24 Dec 2021 19:23:40 +0000 Subject: [PATCH 22/22] chore(release): 1.50.0 --- CHANGELOG.md | 13 +++++++++++++ lerna.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) 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/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" }