diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index e36de07977df81..82f0447930bf9f 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM containerbase/node:14.17.6@sha256:ebe928dcb70c9ec5ad36adc576218d81a3f2a598f0b8cfa14c23467957596389 +FROM containerbase/node:14.17.6@sha256:449af722795fbfec2c8ee00724fea3b1b5a4bbd7bdfecfaf783fa746be48ba19 # renovate: datasource=npm diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c60b9e3f8bf6e7..f6bd8919bdbc84 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -22,7 +22,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@b0e70410b40f1a9af3bba1cecd95b4b57896af26 # renovate: tag=v1.0.12 + uses: github/codeql-action/init@89d78ba4572c7854683ec144d212bf0b52cd2a2a # renovate: tag=v1.0.13 # Override language selection by uncommenting this and choosing your languages # with: @@ -30,7 +30,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@b0e70410b40f1a9af3bba1cecd95b4b57896af26 # renovate: tag=v1.0.12 + uses: github/codeql-action/autobuild@89d78ba4572c7854683ec144d212bf0b52cd2a2a # renovate: tag=v1.0.13 # ℹī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -44,4 +44,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@b0e70410b40f1a9af3bba1cecd95b4b57896af26 # renovate: tag=v1.0.12 + uses: github/codeql-action/analyze@89d78ba4572c7854683ec144d212bf0b52cd2a2a # renovate: tag=v1.0.13 diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index 29ffd6dd478b3a..41ad1ce9994144 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -719,6 +719,14 @@ If configured, Renovate bypasses its normal major/minor/patch upgrade logic and Beware that Renovate follows tags strictly. For example, if you are following a tag like `next` and then that stream is released as `stable` and `next` is no longer being updated then that means your dependencies also won't be getting updated. +## gitAuthor + +You can customize the Git author that's used whenever Renovate creates a commit. +The `gitAuthor` option accepts a RFC5322-compliant string. + +**Note** We strongly recommend that the Git author email you use is unique to Renovate. +Otherwise, if another bot or human shares the same email and pushes to one of Renovate's branches then Renovate will mistake the branch as unmodified and potentially force push over the changes. + ## gitIgnoredAuthors Specify commit authors ignored by Renovate. @@ -1016,6 +1024,7 @@ Example: This can be a base URL (e.g. `https://api.github.com`) or a hostname like `github.com` or `api.github.com`. If the value starts with `http(s)` then it will only match against URLs which start with the full base URL. Otherwise, it will be matched by checking if the URL's hostname matches the `matchHost` directly or ends with it. +When checking the end of the hostname, a single dot is prefixed to the value of `matchHost`, if one is not already present, to ensure it can only match against whole domain segments. ### timeout diff --git a/docs/usage/docker.md b/docs/usage/docker.md index 147c7192d4bb4f..83323d0cde5828 100644 --- a/docs/usage/docker.md +++ b/docs/usage/docker.md @@ -227,7 +227,7 @@ To get access to the token a custom Renovate Docker image is needed that include The Dockerfile to create such an image can look like this: ```Dockerfile -FROM renovate/renovate:26.12.0 +FROM renovate/renovate:26.19.1 # Include the "Docker tip" which you can find here https://cloud.google.com/sdk/docs/install # under "Installation" for "Debian/Ubuntu" RUN ... diff --git a/docs/usage/java.md b/docs/usage/java.md index e58dbe408117b2..aa8c51072dc721 100644 --- a/docs/usage/java.md +++ b/docs/usage/java.md @@ -16,12 +16,18 @@ Renovate detects versions that are specified in a string `'group:artifact:versio Renovate can update `build.gradle`/`build.gradle.kts` files in the root of the repository. It also updates any `*.gradle`/`*.gradle.kts` files in a subdirectory as multi-project configurations. +Renovate also tries to find updates for dependencies whose version is defined in a `*.properties` file, and scans for `*.versions.toml` files and for `*.toml` files inside the `gradle` folder to keep [catalogs](https://docs.gradle.org/current/userguide/platforms.html) up to date. Renovate does not support: - Projects which do not have either a `build.gradle` or `build.gradle.kts` in the repository root - Android projects that require extra configuration to run (e.g. setting the Android SDK) -- Gradle versions prior to version 5.0. +- Gradle versions older than version 5.0 +- Catalogs defined inside a `build.gradle` or `build.gradle.kts` file rather than in TOML +- Catalogs with version ranges +- Catalogs using the `required`, `strictly`, `preferred`, `reject`, and `rejectAll` version declarations +- Catalogs with custom names that do not end in `.toml` +- Catalogs outside the `gradle` folder whose names do not end in `.versions.toml` ## Gradle Wrapper diff --git a/docs/usage/self-hosted-configuration.md b/docs/usage/self-hosted-configuration.md index 5da83d57cbafe2..387adb6da29c9c 100644 --- a/docs/usage/self-hosted-configuration.md +++ b/docs/usage/self-hosted-configuration.md @@ -205,14 +205,6 @@ This should be set to a Personal Access Token (GitHub only) when `forkMode` is s Renovate will use this token to fork the repository into the personal space of the person owning the Personal Access Token. Renovate will then create branches on the fork and opens Pull Requests on the parent repository. -## gitAuthor - -You can customize the Git author that's used whenever Renovate creates a commit. -The `gitAuthor` option accepts a RFC5322-compliant string. - -**Note** We strongly recommend that the Git author email you use is unique to Renovate. -Otherwise, if another bot or human shares the same email and pushes to one of Renovate's branches then Renovate will mistake the branch as unmodified and potentially force push over the changes. - ## gitNoVerify Controls when Renovate passes the `--no-verify` flag to `git`. diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts index 79226b72edd4ef..c6f9eec3b9d5cf 100644 --- a/lib/config/options/index.ts +++ b/lib/config/options/index.ts @@ -634,7 +634,6 @@ const options: RenovateOptions[] = [ name: 'gitAuthor', description: 'Author to use for Git commits. Must conform to RFC5322.', type: 'string', - globalOnly: true, }, { name: 'gitPrivateKey', diff --git a/lib/config/presets/internal/monorepo.ts b/lib/config/presets/internal/monorepo.ts index 0654471b4eafdb..8d8997f3816885 100644 --- a/lib/config/presets/internal/monorepo.ts +++ b/lib/config/presets/internal/monorepo.ts @@ -126,6 +126,7 @@ const repoGroups = { 'https://github.com/neutrinojs/neutrino', 'https://github.com/mozilla-neutrino/neutrino-dev', ], + nexpect: 'https://github.com/fluffynuts/NExpect', nextjs: [ 'https://github.com/zeit/next.js', // old repo 'https://github.com/vercel/next.js', diff --git a/lib/globals.d.ts b/lib/globals.d.ts index eef15fbf1826df..8cd937df0d0887 100644 --- a/lib/globals.d.ts +++ b/lib/globals.d.ts @@ -9,12 +9,6 @@ declare interface Error { validationMessage?: string; } -declare namespace NodeJS { - interface Global { - gitAuthor?: { name: string; email: string }; - } -} - // can't use `resolveJsonModule` because it will copy json files and change dist path declare module '*/package.json' { diff --git a/lib/manager/gradle/index.ts b/lib/manager/gradle/index.ts index 086aab095fdef3..087bf18a9a37ea 100644 --- a/lib/manager/gradle/index.ts +++ b/lib/manager/gradle/index.ts @@ -29,7 +29,12 @@ export function updateDependency( export const language = LANGUAGE_JAVA; export const defaultConfig = { - fileMatch: ['\\.gradle(\\.kts)?$', '(^|/)gradle.properties$'], + fileMatch: [ + '\\.gradle(\\.kts)?$', + '(^|/)gradle.properties$', + '(^|\\/)gradle\\/.+\\.toml$', + '\\.versions\\.toml$', + ], timeout: 600, versioning: gradleVersioning.id, }; diff --git a/lib/manager/gradle/shallow/__fixtures__/1/libs.versions.toml b/lib/manager/gradle/shallow/__fixtures__/1/libs.versions.toml new file mode 100644 index 00000000000000..60a452bda6ada9 --- /dev/null +++ b/lib/manager/gradle/shallow/__fixtures__/1/libs.versions.toml @@ -0,0 +1,17 @@ +[versions] +detekt = "1.17.0" +kotest = "4.6.0" +publish-on-central = "0.5.0" + +[libraries] +detekt-formatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" } +kotest-assertions-core-jvm = { module = "io.kotest:kotest-assertions-core-jvm", version.ref = "kotest" } +kotest-runner-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" } +mockito = { group = "org.mockito", name = "mockito-core", version = "3.10.0" } + +[bundles] +kotest = [ "kotest-runner-junit5", "kotest-assertions-core-jvm" ] + +[plugins] +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } +publish-on-central = { id = "org.danilopianini.publish-on-central", version.ref = "publish-on-central" } diff --git a/lib/manager/gradle/shallow/__fixtures__/2/libs.versions.toml b/lib/manager/gradle/shallow/__fixtures__/2/libs.versions.toml new file mode 100644 index 00000000000000..8308a0c81674fa --- /dev/null +++ b/lib/manager/gradle/shallow/__fixtures__/2/libs.versions.toml @@ -0,0 +1,13 @@ +[versions] +kotlin = "1.5.21" +retrofit = "2.8.2" + +[libraries] +okHttp = "com.squareup.okhttp3:okhttp:4.9.0" +okio = { module = "com.squareup.okio:okio", version = "2.8.0" } +picasso = { group = "com.squareup.picasso", name = "picasso", version = "2.5.1" } +retrofit2-retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } + +[plugins] +kotlinJvm = { id = "org.jetbrains.kotlin.jvm", version = "1.5.21" } +kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } diff --git a/lib/manager/gradle/shallow/extract.spec.ts b/lib/manager/gradle/shallow/extract.spec.ts index 1456652cd4e755..55f36525df3f7d 100644 --- a/lib/manager/gradle/shallow/extract.spec.ts +++ b/lib/manager/gradle/shallow/extract.spec.ts @@ -1,5 +1,5 @@ import { extractAllPackageFiles } from '..'; -import { fs } from '../../../../test/util'; +import { fs, loadFixture } from '../../../../test/util'; jest.mock('../../../util/fs'); @@ -136,4 +136,182 @@ describe('manager/gradle/shallow/extract', () => { }, ]); }); + + it('works with dependency catalogs', async () => { + const tomlFile = loadFixture('1/libs.versions.toml'); + const fsMock = { + 'gradle/libs.versions.toml': tomlFile, + }; + mockFs(fsMock); + const res = await extractAllPackageFiles({} as never, Object.keys(fsMock)); + expect(res).toMatchObject([ + { + packageFile: 'gradle/libs.versions.toml', + deps: [ + { + depName: 'io.gitlab.arturbosch.detekt:detekt-formatting', + groupName: 'io.gitlab.arturbosch.detekt', + currentValue: '1.17.0', + managerData: { + fileReplacePosition: 21, + packageFile: 'gradle/libs.versions.toml', + }, + }, + { + depName: 'io.kotest:kotest-assertions-core-jvm', + groupName: 'io.kotest', + currentValue: '4.6.0', + managerData: { + fileReplacePosition: 39, + packageFile: 'gradle/libs.versions.toml', + }, + }, + { + depName: 'io.kotest:kotest-runner-junit5', + groupName: 'io.kotest', + currentValue: '4.6.0', + managerData: { + fileReplacePosition: 39, + packageFile: 'gradle/libs.versions.toml', + }, + }, + { + depName: 'org.mockito:mockito-core', + groupName: 'org.mockito', + currentValue: '3.10.0', + managerData: { + fileReplacePosition: 460, + packageFile: 'gradle/libs.versions.toml', + }, + }, + { + depName: 'io.gitlab.arturbosch.detekt', + depType: 'plugin', + currentValue: '1.17.0', + commitMessageTopic: 'plugin detekt', + lookupName: + 'io.gitlab.arturbosch.detekt:io.gitlab.arturbosch.detekt.gradle.plugin', + managerData: { + fileReplacePosition: 21, + packageFile: 'gradle/libs.versions.toml', + }, + registryUrls: [ + 'https://repo.maven.apache.org/maven2', + 'https://plugins.gradle.org/m2/', + ], + }, + { + depName: 'org.danilopianini.publish-on-central', + depType: 'plugin', + currentValue: '0.5.0', + commitMessageTopic: 'plugin publish-on-central', + lookupName: + 'org.danilopianini.publish-on-central:org.danilopianini.publish-on-central.gradle.plugin', + managerData: { + fileReplacePosition: 68, + packageFile: 'gradle/libs.versions.toml', + }, + registryUrls: [ + 'https://repo.maven.apache.org/maven2', + 'https://plugins.gradle.org/m2/', + ], + }, + ], + }, + ]); + }); + + it("can run Javier's example", async () => { + const tomlFile = loadFixture('2/libs.versions.toml'); + const fsMock = { + 'gradle/libs.versions.toml': tomlFile, + }; + mockFs(fsMock); + const res = await extractAllPackageFiles({} as never, Object.keys(fsMock)); + expect(res).toMatchObject([ + { + packageFile: 'gradle/libs.versions.toml', + deps: [ + { + depName: 'com.squareup.okhttp3:okhttp', + groupName: 'com.squareup.okhttp3', + currentValue: '4.9.0', + managerData: { + fileReplacePosition: 99, + packageFile: 'gradle/libs.versions.toml', + }, + }, + { + depName: 'com.squareup.okio:okio', + groupName: 'com.squareup.okio', + currentValue: '2.8.0', + managerData: { + fileReplacePosition: 161, + packageFile: 'gradle/libs.versions.toml', + }, + }, + { + depName: 'com.squareup.picasso:picasso', + groupName: 'com.squareup.picasso', + currentValue: '2.5.1', + managerData: { + fileReplacePosition: 243, + packageFile: 'gradle/libs.versions.toml', + }, + }, + { + depName: 'com.squareup.retrofit2:retrofit', + groupName: 'com.squareup.retrofit2', + currentValue: '2.8.2', + managerData: { + fileReplacePosition: 41, + packageFile: 'gradle/libs.versions.toml', + }, + }, + { + depName: 'org.jetbrains.kotlin.jvm', + depType: 'plugin', + currentValue: '1.5.21', + commitMessageTopic: 'plugin kotlinJvm', + lookupName: + 'org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin', + managerData: { + fileReplacePosition: 415, + packageFile: 'gradle/libs.versions.toml', + }, + registryUrls: [ + 'https://repo.maven.apache.org/maven2', + 'https://plugins.gradle.org/m2/', + ], + }, + { + depName: 'org.jetbrains.kotlin.plugin.serialization', + depType: 'plugin', + currentValue: '1.5.21', + commitMessageTopic: 'plugin kotlinSerialization', + lookupName: + 'org.jetbrains.kotlin.plugin.serialization:org.jetbrains.kotlin.plugin.serialization.gradle.plugin', + managerData: { + fileReplacePosition: 21, + packageFile: 'gradle/libs.versions.toml', + }, + registryUrls: [ + 'https://repo.maven.apache.org/maven2', + 'https://plugins.gradle.org/m2/', + ], + }, + ], + }, + ]); + }); + + it('ignores an empty TOML', async () => { + const tomlFile = ''; + const fsMock = { + 'gradle/libs.versions.toml': tomlFile, + }; + mockFs(fsMock); + const res = await extractAllPackageFiles({} as never, Object.keys(fsMock)); + expect(res).toBeNull(); + }); }); diff --git a/lib/manager/gradle/shallow/extract.ts b/lib/manager/gradle/shallow/extract.ts index 7dabe5e1ee59d1..cd9a3161f800a5 100644 --- a/lib/manager/gradle/shallow/extract.ts +++ b/lib/manager/gradle/shallow/extract.ts @@ -11,12 +11,14 @@ import type { PackageFile, } from '../../types'; import type { GradleManagerData } from '../types'; +import { parseCatalog } from './extract/catalog'; import { parseGradle, parseProps } from './parser'; import type { PackageVariables, VariableRegistry } from './types'; import { getVars, isGradleFile, isPropsFile, + isTOMLFile, reorderFiles, toAbsolutePath, } from './utils'; @@ -64,6 +66,13 @@ export async function extractAllPackageFiles( const { vars, deps } = parseProps(content, packageFile); updateVars(vars); extractedDeps.push(...deps); + } else if (isTOMLFile(packageFile)) { + try { + const updatesFromCatalog = parseCatalog(packageFile, content); + extractedDeps.push(...updatesFromCatalog); + } catch (error) { + logger.warn({ error }, 'TOML parsing error'); + } } else if (isGradleFile(packageFile)) { const vars = getVars(registry, dir); const { diff --git a/lib/manager/gradle/shallow/extract/catalog.ts b/lib/manager/gradle/shallow/extract/catalog.ts new file mode 100644 index 00000000000000..0812932b95731c --- /dev/null +++ b/lib/manager/gradle/shallow/extract/catalog.ts @@ -0,0 +1,83 @@ +import { parse } from '@iarna/toml'; +import { PackageDependency } from '../../../types'; +import { GradleManagerData } from '../../types'; +import type { GradleCatalog, GradleCatalogPluginDescriptor } from '../types'; + +function findIndexAfter( + content: string, + sliceAfter: string, + find: string +): number { + const slicePoint = content.indexOf(sliceAfter) + sliceAfter.length; + return slicePoint + content.slice(slicePoint).indexOf(find); +} + +export function parseCatalog( + packageFile: string, + content: string +): PackageDependency[] { + const tomlContent = parse(content) as GradleCatalog; + const versions = tomlContent.versions || {}; + const libs = tomlContent.libraries || {}; + const libStartIndex = content.indexOf('libraries'); + const libSubContent = content.slice(libStartIndex); + const versionStartIndex = content.indexOf('versions'); + const versionSubContent = content.slice(versionStartIndex); + const extractedDeps: PackageDependency[] = []; + for (const libraryName of Object.keys(libs)) { + const libDescriptor = libs[libraryName]; + const group: string = + typeof libDescriptor === 'string' + ? libDescriptor.split(':')[0] + : libDescriptor.group || libDescriptor.module?.split(':')[0]; + const name: string = + typeof libDescriptor === 'string' + ? libDescriptor.split(':')[1] + : libDescriptor.name || libDescriptor.module?.split(':')[1]; + const version = libDescriptor.version || libDescriptor.split(':')[2]; + const currentVersion = + typeof version === 'string' ? version : versions[version.ref]; + const fileReplacePosition = + typeof version === 'string' + ? libStartIndex + + findIndexAfter(libSubContent, libraryName, currentVersion) + : versionStartIndex + + findIndexAfter(versionSubContent, version.ref, currentVersion); + const dependency = { + depName: `${group}:${name}`, + groupName: group, + currentValue: currentVersion, + managerData: { fileReplacePosition, packageFile }, + }; + extractedDeps.push(dependency); + } + const plugins = tomlContent.plugins || {}; + const pluginsStartIndex = content.indexOf('[plugins]'); + const pluginsSubContent = content.slice(pluginsStartIndex); + for (const pluginName of Object.keys(plugins)) { + const pluginDescriptor = plugins[ + pluginName + ] as GradleCatalogPluginDescriptor; + const pluginId = pluginDescriptor.id; + const version = pluginDescriptor.version; + const currentVersion: string = + typeof version === 'string' ? version : versions[version.ref]; + const fileReplacePosition = + typeof version === 'string' + ? pluginsStartIndex + + findIndexAfter(pluginsSubContent, pluginId, currentVersion) + : versionStartIndex + + findIndexAfter(versionSubContent, version.ref, currentVersion); + const dependency = { + depType: 'plugin', + depName: pluginId, + lookupName: `${pluginId}:${pluginId}.gradle.plugin`, + registryUrls: ['https://plugins.gradle.org/m2/'], + currentValue: currentVersion, + commitMessageTopic: `plugin ${pluginName}`, + managerData: { fileReplacePosition, packageFile }, + }; + extractedDeps.push(dependency); + } + return extractedDeps; +} diff --git a/lib/manager/gradle/shallow/types.ts b/lib/manager/gradle/shallow/types.ts index 4d71036dbbba37..a1867f968ceaf0 100644 --- a/lib/manager/gradle/shallow/types.ts +++ b/lib/manager/gradle/shallow/types.ts @@ -61,3 +61,32 @@ export interface ParseGradleResult { urls: string[]; vars: PackageVariables; } + +export interface GradleCatalog { + versions?: Map; + libraries?: Map< + string, + GradleCatalogModuleDescriptor | GradleCatalogArtifactDescriptor | string + >; + plugins?: Map; +} + +export interface GradleCatalogModuleDescriptor { + module: string; + version: string | VersionPointer; +} + +export interface GradleCatalogArtifactDescriptor { + name: string; + group: string; + version: string | VersionPointer; +} + +export interface GradleCatalogPluginDescriptor { + id: string; + version: string | VersionPointer; +} + +export interface VersionPointer { + ref: string; +} diff --git a/lib/manager/gradle/shallow/utils.ts b/lib/manager/gradle/shallow/utils.ts index 2d8080ef1a4367..75bf22405d4c56 100644 --- a/lib/manager/gradle/shallow/utils.ts +++ b/lib/manager/gradle/shallow/utils.ts @@ -81,6 +81,11 @@ export function isPropsFile(path: string): boolean { return filename === 'gradle.properties'; } +export function isTOMLFile(path: string): boolean { + const filename = upath.basename(path).toLowerCase(); + return filename.endsWith('.toml'); +} + export function toAbsolutePath(packageFile: string): string { return upath.join(packageFile.replace(/^[/\\]*/, '/')); } diff --git a/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap b/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap index 0388f42d24794e..53bd016a64ee3c 100644 --- a/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap +++ b/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap @@ -19,6 +19,7 @@ Array [ "cwd": "/tmp/github/some/repo", "encoding": "utf-8", "env": Object { + "HELM_EXPERIMENTAL_OCI": "1", "HOME": "/home/user", "HTTPS_PROXY": "https://example.com", "HTTP_PROXY": "http://example.com", @@ -53,6 +54,7 @@ Array [ "cwd": "/tmp/github/some/repo", "encoding": "utf-8", "env": Object { + "HELM_EXPERIMENTAL_OCI": "1", "HOME": "/home/user", "HTTPS_PROXY": "https://example.com", "HTTP_PROXY": "http://example.com", @@ -87,6 +89,7 @@ Array [ "cwd": "/tmp/github/some/repo", "encoding": "utf-8", "env": Object { + "HELM_EXPERIMENTAL_OCI": "1", "HOME": "/home/user", "HTTPS_PROXY": "https://example.com", "HTTP_PROXY": "http://example.com", @@ -128,11 +131,12 @@ Array [ }, }, Object { - "cmd": "docker run --rm --name=renovate_helm --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -w \\"/tmp/github/some/repo\\" renovate/helm bash -l -c \\"helm dependency update ''\\"", + "cmd": "docker run --rm --name=renovate_helm --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -e HELM_EXPERIMENTAL_OCI -w \\"/tmp/github/some/repo\\" renovate/helm bash -l -c \\"helm dependency update ''\\"", "options": Object { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", "env": Object { + "HELM_EXPERIMENTAL_OCI": "1", "HOME": "/home/user", "HTTPS_PROXY": "https://example.com", "HTTP_PROXY": "http://example.com", diff --git a/lib/manager/helmv3/__snapshots__/extract.spec.ts.snap b/lib/manager/helmv3/__snapshots__/extract.spec.ts.snap index 4c79e1380e1175..547524fa8d8e9d 100644 --- a/lib/manager/helmv3/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/helmv3/__snapshots__/extract.spec.ts.snap @@ -1,5 +1,28 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`manager/helmv3/extract extractPackageFile() extract correctly oci references 1`] = ` +Object { + "datasource": "helm", + "deps": Array [ + Object { + "currentValue": "0.1.0", + "datasource": "docker", + "depName": "library", + "lookupName": "ghcr.io/ankitabhopatkar13/library", + "registryUrls": Array [], + }, + Object { + "currentValue": "0.8.1", + "depName": "postgresql", + "registryUrls": Array [ + "https://charts.helm.sh/stable", + ], + }, + ], + "packageFileVersion": "0.1.0", +} +`; + exports[`manager/helmv3/extract extractPackageFile() parses simple Chart.yaml correctly 1`] = ` Object { "datasource": "helm", diff --git a/lib/manager/helmv3/artifacts.ts b/lib/manager/helmv3/artifacts.ts index 1903724d8497f5..3414afa6c3d102 100644 --- a/lib/manager/helmv3/artifacts.ts +++ b/lib/manager/helmv3/artifacts.ts @@ -17,6 +17,9 @@ async function helmUpdate(manifestPath: string): Promise { docker: { image: 'helm', }, + extraEnv: { + HELM_EXPERIMENTAL_OCI: '1', + }, }; await exec(cmd, execOptions); } diff --git a/lib/manager/helmv3/extract.spec.ts b/lib/manager/helmv3/extract.spec.ts index e9710fd4ec5800..3aa609097db193 100644 --- a/lib/manager/helmv3/extract.spec.ts +++ b/lib/manager/helmv3/extract.spec.ts @@ -1,4 +1,5 @@ import { fs } from '../../../test/util'; +import * as datasourceDocker from '../../datasource/docker'; import { extractPackageFile } from './extract'; jest.mock('../../util/fs'); @@ -66,6 +67,44 @@ describe('manager/helmv3/extract', () => { ], }); }); + + it('extract correctly oci references', async () => { + const content = ` + apiVersion: v2 + name: app2 + description: A Helm chart for Kubernetes + type: application + version: 0.1.0 + appVersion: "1.16.0" + dependencies: + - name: library + version: 0.1.0 + repository: oci://ghcr.io/ankitabhopatkar13/library + import-values: + - defaults + - name: postgresql + version: 0.8.1 + repository: https://charts.helm.sh/stable + condition: postgresql.enabled + `; + const fileName = 'Chart.yaml'; + const result = await extractPackageFile(content, fileName, { + aliases: { + stable: 'https://charts.helm.sh/stable', + }, + }); + expect(result).toMatchSnapshot({ + deps: [ + { + depName: 'library', + datasource: datasourceDocker.id, + currentValue: '0.1.0', + }, + { depName: 'postgresql', currentValue: '0.8.1' }, + ], + }); + }); + it('resolves aliased registry urls', async () => { const content = ` apiVersion: v2 diff --git a/lib/manager/helmv3/extract.ts b/lib/manager/helmv3/extract.ts index d589d3403c260b..bc0266ca3b12bb 100644 --- a/lib/manager/helmv3/extract.ts +++ b/lib/manager/helmv3/extract.ts @@ -1,5 +1,6 @@ import is from '@sindresorhus/is'; import { load } from 'js-yaml'; +import * as datasourceDocker from '../../datasource/docker'; import { HelmDatasource } from '../../datasource/helm'; import { logger } from '../../logger'; import { SkipReason } from '../../types'; @@ -75,8 +76,16 @@ export async function extractPackageFile( } else { try { const url = new URL(dep.repository); - if (url.protocol === 'file:') { - res.skipReason = SkipReason.LocalDependency; + switch (url.protocol) { + case 'oci:': + res.datasource = datasourceDocker.id; + res.lookupName = dep.repository.replace('oci://', ''); + res.registryUrls = []; + break; + case 'file:': + res.skipReason = SkipReason.LocalDependency; + break; + default: } } catch (err) { logger.debug({ err }, 'Error parsing url'); diff --git a/lib/manager/kustomize/__fixtures__/depsInResources.yaml b/lib/manager/kustomize/__fixtures__/depsInResources.yaml index acdcb457a67de3..d8c210bd9fb523 100644 --- a/lib/manager/kustomize/__fixtures__/depsInResources.yaml +++ b/lib/manager/kustomize/__fixtures__/depsInResources.yaml @@ -10,5 +10,8 @@ resources: - deployment.yaml - github.com/fluxcd/flux/deploy?ref=1.19.0 +components: +- github.com/fluxcd/flux/memcache-dep?ref=1.18.0 + images: - name: nginx diff --git a/lib/manager/kustomize/__snapshots__/extract.spec.ts.snap b/lib/manager/kustomize/__snapshots__/extract.spec.ts.snap index ec2fc9f8161ef3..55eaee54613589 100644 --- a/lib/manager/kustomize/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/kustomize/__snapshots__/extract.spec.ts.snap @@ -67,7 +67,7 @@ Array [ ] `; -exports[`manager/kustomize/extract extractPackageFile() should extract bases from bases block and the resources block 1`] = ` +exports[`manager/kustomize/extract extractPackageFile() should extract bases resources and components from their respective blocks 1`] = ` Array [ Object { "currentValue": "v0.0.1", @@ -79,6 +79,11 @@ Array [ "datasource": "github-tags", "depName": "fluxcd/flux", }, + Object { + "currentValue": "1.18.0", + "datasource": "github-tags", + "depName": "fluxcd/flux", + }, ] `; diff --git a/lib/manager/kustomize/extract.spec.ts b/lib/manager/kustomize/extract.spec.ts index 7fe27a25229599..44c2b71ca9c099 100644 --- a/lib/manager/kustomize/extract.spec.ts +++ b/lib/manager/kustomize/extract.spec.ts @@ -242,14 +242,16 @@ describe('manager/kustomize/extract', () => { it('does nothing with kustomize empty kustomize files', () => { expect(extractPackageFile(kustomizeEmpty)).toBeNull(); }); - it('should extract bases from bases block and the resources block', () => { + it('should extract bases resources and components from their respective blocks', () => { const res = extractPackageFile(kustomizeDepsInResources); expect(res).not.toBeNull(); expect(res.deps).toMatchSnapshot(); - expect(res.deps).toHaveLength(2); + expect(res.deps).toHaveLength(3); expect(res.deps[0].currentValue).toEqual('v0.0.1'); expect(res.deps[1].currentValue).toEqual('1.19.0'); + expect(res.deps[2].currentValue).toEqual('1.18.0'); expect(res.deps[1].depName).toEqual('fluxcd/flux'); + expect(res.deps[2].depName).toEqual('fluxcd/flux'); }); it('extracts sha256 instead of tag', () => { expect(extractPackageFile(sha)).toMatchSnapshot({ diff --git a/lib/manager/kustomize/extract.ts b/lib/manager/kustomize/extract.ts index 12bfb8280c0d8e..8a06c3da71caf7 100644 --- a/lib/manager/kustomize/extract.ts +++ b/lib/manager/kustomize/extract.ts @@ -84,7 +84,10 @@ export function parseKustomize(content: string): Kustomize | null { return null; } - pkg.bases = (pkg.bases || []).concat(pkg.resources || []); + pkg.bases = (pkg.bases || []).concat( + pkg.resources || [], + pkg.components || [] + ); pkg.images = pkg.images || []; return pkg; diff --git a/lib/manager/kustomize/readme.md b/lib/manager/kustomize/readme.md index b38948bb55f8db..1a63c7718cebf2 100644 --- a/lib/manager/kustomize/readme.md +++ b/lib/manager/kustomize/readme.md @@ -2,6 +2,7 @@ This package will manage two parts of the `kustomization.yaml` file: 1. [remote bases](https://github.com/kubernetes-sigs/kustomize/blob/master/examples/remoteBuild.md) 2. [image tags](https://github.com/kubernetes-sigs/kustomize/blob/master/examples/image.md) +3. [components](https://github.com/kubernetes-sigs/kustomize/blob/master/examples/components.md) **How It Works** diff --git a/lib/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap index b9a7056544c978..0804bdebec848b 100644 --- a/lib/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap +++ b/lib/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap @@ -43,20 +43,24 @@ Array [ "lernaClient": undefined, "managerData": Object { "lernaJsonFile": "lerna.json", + "yarnZeroInstall": undefined, }, "npmLock": undefined, "packageFile": "packages/a/package.json", "packageJsonName": "@org/a", + "skipInstalls": undefined, "yarnLock": undefined, }, Object { "lernaClient": undefined, "managerData": Object { "lernaJsonFile": "lerna.json", + "yarnZeroInstall": undefined, }, "npmLock": undefined, "packageFile": "packages/b/package.json", "packageJsonName": "@org/b", + "skipInstalls": undefined, "yarnLock": undefined, }, ] @@ -108,20 +112,24 @@ Array [ "lernaClient": undefined, "managerData": Object { "lernaJsonFile": "lerna.json", + "yarnZeroInstall": undefined, }, "npmLock": undefined, "packageFile": "packages/a/package.json", "packageJsonName": "@org/a", + "skipInstalls": undefined, "yarnLock": undefined, }, Object { "lernaClient": undefined, "managerData": Object { "lernaJsonFile": "lerna.json", + "yarnZeroInstall": undefined, }, "npmLock": undefined, "packageFile": "packages/b/package.json", "packageJsonName": "@org/b", + "skipInstalls": undefined, "yarnLock": undefined, }, ] @@ -146,20 +154,24 @@ Array [ "lernaClient": "yarn", "managerData": Object { "lernaJsonFile": "lerna.json", + "yarnZeroInstall": undefined, }, "npmLock": undefined, "packageFile": "packages/a/package.json", "packageJsonName": "@org/a", + "skipInstalls": undefined, "yarnLock": undefined, }, Object { "lernaClient": "yarn", "managerData": Object { "lernaJsonFile": "lerna.json", + "yarnZeroInstall": undefined, }, "npmLock": undefined, "packageFile": "packages/b/package.json", "packageJsonName": "@org/b", + "skipInstalls": undefined, "yarnLock": undefined, }, ] @@ -178,22 +190,68 @@ Array [ "lernaClient": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": undefined, }, "npmLock": undefined, "npmrc": "@org:registry=//registry.some.org ", "packageFile": "packages/a/package.json", "packageJsonName": "@org/a", + "skipInstalls": undefined, "yarnLock": "yarn.lock", }, Object { "lernaClient": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": undefined, }, "npmLock": undefined, "packageFile": "packages/b/package.json", "packageJsonName": "@org/b", + "skipInstalls": undefined, + "yarnLock": undefined, + }, +] +`; + +exports[`manager/npm/extract/monorepo .extractPackageFile() uses yarnZeroInstall and skipInstalls from yarn workspaces package settings 1`] = ` +Array [ + Object { + "managerData": Object { + "yarnZeroInstall": true, + }, + "npmrc": "@org:registry=//registry.some.org +", + "packageFile": "package.json", + "skipInstalls": false, + "yarnWorkspacesPackages": "packages/*", + }, + Object { + "hasYarnWorkspaces": true, + "lernaClient": undefined, + "managerData": Object { + "lernaJsonFile": undefined, + "yarnZeroInstall": true, + }, + "npmLock": undefined, + "npmrc": "@org:registry=//registry.some.org +", + "packageFile": "packages/a/package.json", + "packageJsonName": "@org/a", + "skipInstalls": false, + "yarnLock": "yarn.lock", + }, + Object { + "lernaClient": undefined, + "managerData": Object { + "lernaJsonFile": undefined, + "yarnZeroInstall": true, + }, + "npmLock": undefined, + "packageFile": "packages/b/package.json", + "packageJsonName": "@org/b", + "skipInstalls": false, "yarnLock": undefined, }, ] diff --git a/lib/manager/npm/extract/monorepo.spec.ts b/lib/manager/npm/extract/monorepo.spec.ts index 8fd569946f7719..62121992b16529 100644 --- a/lib/manager/npm/extract/monorepo.spec.ts +++ b/lib/manager/npm/extract/monorepo.spec.ts @@ -57,6 +57,7 @@ describe('manager/npm/extract/monorepo', () => { ) ).toBe(true); }); + it('updates internal packages', async () => { const packageFiles = [ { @@ -110,6 +111,7 @@ describe('manager/npm/extract/monorepo', () => { ) ).toBe(false); }); + it('uses yarn workspaces package settings with lerna', async () => { const packageFiles = [ { @@ -134,6 +136,7 @@ describe('manager/npm/extract/monorepo', () => { expect(packageFiles).toMatchSnapshot(); expect(packageFiles[1].managerData.lernaJsonFile).toEqual('lerna.json'); }); + it('uses yarn workspaces package settings without lerna', async () => { const packageFiles = [ { @@ -155,5 +158,32 @@ describe('manager/npm/extract/monorepo', () => { // FIXME: explicit assert condition expect(packageFiles).toMatchSnapshot(); }); + + it('uses yarnZeroInstall and skipInstalls from yarn workspaces package settings', async () => { + const packageFiles = [ + { + packageFile: 'package.json', + managerData: { + yarnZeroInstall: true, + }, + skipInstalls: false, + npmrc: '@org:registry=//registry.some.org\n', + yarnWorkspacesPackages: 'packages/*', + }, + { + packageFile: 'packages/a/package.json', + packageJsonName: '@org/a', + yarnLock: 'yarn.lock', + }, + { + packageFile: 'packages/b/package.json', + packageJsonName: '@org/b', + skipInstalls: true, + }, + ]; + await detectMonorepos(packageFiles, false); + // FIXME: explicit assert condition + expect(packageFiles).toMatchSnapshot(); + }); }); }); diff --git a/lib/manager/npm/extract/monorepo.ts b/lib/manager/npm/extract/monorepo.ts index 1181375a669ab5..f8128902e7fb63 100644 --- a/lib/manager/npm/extract/monorepo.ts +++ b/lib/manager/npm/extract/monorepo.ts @@ -22,8 +22,9 @@ export async function detectMonorepos( lernaClient, lernaPackages, yarnWorkspacesPackages, + skipInstalls, } = p; - const { lernaJsonFile } = managerData; + const { lernaJsonFile, yarnZeroInstall } = managerData; const packages = yarnWorkspacesPackages || lernaPackages; if (packages?.length) { const internalPackagePatterns = ( @@ -48,9 +49,11 @@ export async function detectMonorepos( for (const subPackage of internalPackageFiles) { subPackage.managerData = subPackage.managerData || {}; subPackage.managerData.lernaJsonFile = lernaJsonFile; + subPackage.managerData.yarnZeroInstall = yarnZeroInstall; subPackage.lernaClient = lernaClient; subPackage.yarnLock = subPackage.yarnLock || yarnLock; subPackage.npmLock = subPackage.npmLock || npmLock; + subPackage.skipInstalls = skipInstalls && subPackage.skipInstalls; // skip if both are true if (subPackage.yarnLock) { subPackage.hasYarnWorkspaces = !!yarnWorkspacesPackages; subPackage.npmrc = subPackage.npmrc || npmrc; diff --git a/lib/platform/azure/index.ts b/lib/platform/azure/index.ts index 27efa594855b81..d91f5aa485fe2d 100644 --- a/lib/platform/azure/index.ts +++ b/lib/platform/azure/index.ts @@ -180,8 +180,6 @@ export async function initRepo({ ...config, url, extraCloneOpts: getStorageExtraCloneOpts(opts), - gitAuthorName: global.gitAuthor?.name, - gitAuthorEmail: global.gitAuthor?.email, cloneSubmodules, }); const repoConfig: RepoResult = { diff --git a/lib/platform/bitbucket-server/index.spec.ts b/lib/platform/bitbucket-server/index.spec.ts index 1002b9aafa2719..9ca7dba1e8353c 100644 --- a/lib/platform/bitbucket-server/index.spec.ts +++ b/lib/platform/bitbucket-server/index.spec.ts @@ -1311,18 +1311,13 @@ describe('platform/bitbucket-server/index', () => { .twice() .reply(200, { conflicted: false }); - const author = global.gitAuthor; - try { - expect(await bitbucket.getPr(3)).toMatchSnapshot(); + expect(await bitbucket.getPr(3)).toMatchSnapshot(); - expect(await bitbucket.getPr(5)).toMatchSnapshot(); + expect(await bitbucket.getPr(5)).toMatchSnapshot(); - expect(await bitbucket.getPr(5)).toMatchSnapshot(); + expect(await bitbucket.getPr(5)).toMatchSnapshot(); - expect(httpMock.getTrace()).toMatchSnapshot(); - } finally { - global.gitAuthor = author; - } + expect(httpMock.getTrace()).toMatchSnapshot(); }); it('gets a closed PR', async () => { diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts index 44bc93d61a6a4f..711be02aa8b476 100644 --- a/lib/platform/bitbucket-server/index.ts +++ b/lib/platform/bitbucket-server/index.ts @@ -214,8 +214,6 @@ export async function initRepo({ await git.initRepo({ ...config, url: gitUrl, - gitAuthorName: global.gitAuthor?.name, - gitAuthorEmail: global.gitAuthor?.email, cloneSubmodules, }); diff --git a/lib/platform/bitbucket/index.spec.ts b/lib/platform/bitbucket/index.spec.ts index 2711cf3cc7a998..2d8508446e5942 100644 --- a/lib/platform/bitbucket/index.spec.ts +++ b/lib/platform/bitbucket/index.spec.ts @@ -726,7 +726,6 @@ describe('platform/bitbucket/index', () => { it('canRebase', async () => { expect.assertions(4); - const author = global.gitAuthor; const scope = await initRepoMock(); scope .get('/2.0/repositories/some/repo/pullrequests/3') @@ -747,22 +746,13 @@ describe('platform/bitbucket/index', () => { .get('/2.0/repositories/some/repo/pullrequests/5/diff') .twice() .reply(200, diff); - try { - expect(await bitbucket.getPr(3)).toMatchSnapshot(); - - global.gitAuthor = { - email: 'renovate@whitesourcesoftware.com', - name: 'bot', - }; - expect(await bitbucket.getPr(5)).toMatchSnapshot(); - - global.gitAuthor = { email: 'jane@example.com', name: 'jane' }; - expect(await bitbucket.getPr(5)).toMatchSnapshot(); - - expect(httpMock.getTrace()).toMatchSnapshot(); - } finally { - global.gitAuthor = author; - } + expect(await bitbucket.getPr(3)).toMatchSnapshot(); + + expect(await bitbucket.getPr(5)).toMatchSnapshot(); + + expect(await bitbucket.getPr(5)).toMatchSnapshot(); + + expect(httpMock.getTrace()).toMatchSnapshot(); }); }); diff --git a/lib/platform/bitbucket/index.ts b/lib/platform/bitbucket/index.ts index 98471047aa87f7..7f2cc28fc5f219 100644 --- a/lib/platform/bitbucket/index.ts +++ b/lib/platform/bitbucket/index.ts @@ -179,8 +179,6 @@ export async function initRepo({ await git.initRepo({ ...config, url, - gitAuthorName: global.gitAuthor?.name, - gitAuthorEmail: global.gitAuthor?.email, cloneSubmodules, }); const repoConfig: RepoResult = { diff --git a/lib/platform/gitea/index.spec.ts b/lib/platform/gitea/index.spec.ts index 2c41ac96a9cd02..1cd6325da00ce1 100644 --- a/lib/platform/gitea/index.spec.ts +++ b/lib/platform/gitea/index.spec.ts @@ -176,8 +176,6 @@ describe('platform/gitea/index', () => { gitvcs.isBranchStale.mockResolvedValue(false); gitvcs.getBranchCommit.mockReturnValue(mockCommitHash); - global.gitAuthor = { name: 'Renovate', email: 'renovate@example.com' }; - setBaseUrl('https://gitea.renovatebot.com/api/v1'); }); @@ -574,7 +572,9 @@ describe('platform/gitea/index', () => { partial({ commit: { id: mockCommitHash, - author: partial({ email: global.gitAuthor.email }), + author: partial({ + email: 'renovate@whitesourcesoftware.com', + }), }, }) ); diff --git a/lib/platform/gitea/index.ts b/lib/platform/gitea/index.ts index c7d831e6b007a7..a72082431d3995 100644 --- a/lib/platform/gitea/index.ts +++ b/lib/platform/gitea/index.ts @@ -297,8 +297,6 @@ const platform: Platform = { await git.initRepo({ ...config, url: URL.format(gitEndpoint), - gitAuthorName: global.gitAuthor?.name, - gitAuthorEmail: global.gitAuthor?.email, }); // Reset cached resources diff --git a/lib/platform/github/index.spec.ts b/lib/platform/github/index.spec.ts index 3d0c716cff4a53..ff04c1f864f4d3 100644 --- a/lib/platform/github/index.spec.ts +++ b/lib/platform/github/index.spec.ts @@ -30,7 +30,6 @@ describe('platform/github/index', () => { git.getBranchCommit.mockReturnValue( '0d9c7726c3d628b7e28af234595cfd20febdbf8e' ); - delete global.gitAuthor; hostRules.find.mockReturnValue({ token: 'abc123', }); @@ -1900,10 +1899,6 @@ describe('platform/github/index', () => { const scope = httpMock.scope(githubApiHost); initRepoMock(scope, 'some/repo'); scope.post('/graphql').reply(200, graphqlOpenPullRequests); - global.gitAuthor = { - name: 'Renovate Bot', - email: 'renovate@whitesourcesoftware.com', - }; await github.initRepo({ repository: 'some/repo', } as any); diff --git a/lib/platform/github/index.ts b/lib/platform/github/index.ts index 7b3af04531fc11..f45144e82a77c8 100644 --- a/lib/platform/github/index.ts +++ b/lib/platform/github/index.ts @@ -420,8 +420,6 @@ export async function initRepo({ await git.initRepo({ ...config, url, - gitAuthorName: global.gitAuthor?.name, - gitAuthorEmail: global.gitAuthor?.email, }); const repoConfig: RepoResult = { defaultBranch: config.defaultBranch, diff --git a/lib/platform/gitlab/__snapshots__/index.spec.ts.snap b/lib/platform/gitlab/__snapshots__/index.spec.ts.snap index 2a334d52630101..9fffb450cdf82f 100644 --- a/lib/platform/gitlab/__snapshots__/index.spec.ts.snap +++ b/lib/platform/gitlab/__snapshots__/index.spec.ts.snap @@ -2653,63 +2653,12 @@ Array [ ] `; -exports[`platform/gitlab/index initRepo should use ssh_url_to_repo if gitUrl is set to ssh 1`] = ` -Array [ - Object { - "headers": Object { - "accept": "application/json", - "accept-encoding": "gzip, deflate, br", - "authorization": "Bearer abc123", - "host": "gitlab.com", - "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", - }, - "method": "GET", - "url": "https://gitlab.com/api/v4/projects/some%2Frepo%2Fproject", - }, -] -`; - -exports[`platform/gitlab/index initRepo should use ssh_url_to_repo if gitUrl is set to ssh 2`] = ` -Array [ - Array [ - Object { - "cloneSubmodules": undefined, - "defaultBranch": "master", - "gitAuthorEmail": undefined, - "gitAuthorName": undefined, - "ignorePrAuthor": undefined, - "mergeMethod": "merge", - "repository": "some%2Frepo%2Fproject", - "url": "ssh://git@gitlab.com/some%2Frepo%2Fproject.git", - }, - ], -] -`; - -exports[`platform/gitlab/index initRepo should throw if ssh_url_to_repo is not present but gitUrl is set to ssh 1`] = ` -Array [ - Object { - "headers": Object { - "accept": "application/json", - "accept-encoding": "gzip, deflate, br", - "authorization": "Bearer abc123", - "host": "gitlab.com", - "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", - }, - "method": "GET", - "url": "https://gitlab.com/api/v4/projects/some%2Frepo%2Fproject", - }, -] -`; - exports[`platform/gitlab/index initRepo should fall back respecting when GITLAB_IGNORE_REPO_URL is set 1`] = ` Array [ Array [ Object { "cloneSubmodules": undefined, "defaultBranch": "master", - "gitAuthorEmail": undefined, - "gitAuthorName": undefined, "ignorePrAuthor": undefined, "mergeMethod": "merge", "repository": "some%2Frepo%2Fproject", @@ -2869,6 +2818,53 @@ Array [ ] `; +exports[`platform/gitlab/index initRepo should throw if ssh_url_to_repo is not present but gitUrl is set to ssh 1`] = ` +Array [ + Object { + "headers": Object { + "accept": "application/json", + "accept-encoding": "gzip, deflate, br", + "authorization": "Bearer abc123", + "host": "gitlab.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://gitlab.com/api/v4/projects/some%2Frepo%2Fproject", + }, +] +`; + +exports[`platform/gitlab/index initRepo should use ssh_url_to_repo if gitUrl is set to ssh 1`] = ` +Array [ + Object { + "headers": Object { + "accept": "application/json", + "accept-encoding": "gzip, deflate, br", + "authorization": "Bearer abc123", + "host": "gitlab.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://gitlab.com/api/v4/projects/some%2Frepo%2Fproject", + }, +] +`; + +exports[`platform/gitlab/index initRepo should use ssh_url_to_repo if gitUrl is set to ssh 2`] = ` +Array [ + Array [ + Object { + "cloneSubmodules": undefined, + "defaultBranch": "master", + "ignorePrAuthor": undefined, + "mergeMethod": "merge", + "repository": "some%2Frepo%2Fproject", + "url": "ssh://git@gitlab.com/some%2Frepo%2Fproject.git", + }, + ], +] +`; + exports[`platform/gitlab/index massageMarkdown(input) returns updated pr body 1`] = ` "https://github.com/foo/bar/issues/5 plus also [a link](https://github.com/foo/bar/issues/5 diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts index 688437f3cc6d36..6fdbccf4312394 100644 --- a/lib/platform/gitlab/index.ts +++ b/lib/platform/gitlab/index.ts @@ -286,8 +286,6 @@ export async function initRepo({ await git.initRepo({ ...config, url, - gitAuthorName: global.gitAuthor?.name, - gitAuthorEmail: global.gitAuthor?.email, }); } catch (err) /* istanbul ignore next */ { logger.debug({ err }, 'Caught initRepo error'); diff --git a/lib/platform/index.spec.ts b/lib/platform/index.spec.ts index 54fd78d40abe1b..1a29be4909fd66 100644 --- a/lib/platform/index.spec.ts +++ b/lib/platform/index.spec.ts @@ -70,31 +70,4 @@ describe('platform/index', () => { platform: PLATFORM_TYPE_BITBUCKET, }); }); - - it('returns null if empty email given', () => { - expect(platform.parseGitAuthor(undefined)).toBeNull(); - }); - it('parses bot email', () => { - // FIXME: explicit assert condition - expect( - platform.parseGitAuthor('some[bot]@users.noreply.github.com') - ).toMatchSnapshot(); - }); - it('parses bot name and email', () => { - // FIXME: explicit assert condition - expect( - platform.parseGitAuthor( - '"some[bot]" ' - ) - ).toMatchSnapshot(); - }); - it('escapes names', () => { - // FIXME: explicit assert condition - expect( - platform.parseGitAuthor('name [what] ').name - ).toMatchSnapshot(); - }); - it('gives up', () => { - expect(platform.parseGitAuthor('a.b.c')).toBeNull(); - }); }); diff --git a/lib/platform/index.ts b/lib/platform/index.ts index 8268aecdc7c1da..8780d11ecce4e8 100644 --- a/lib/platform/index.ts +++ b/lib/platform/index.ts @@ -1,10 +1,9 @@ import URL from 'url'; -import addrs from 'email-addresses'; import type { AllConfig } from '../config/types'; import { PLATFORM_NOT_FOUND } from '../constants/error-messages'; import { logger } from '../logger'; import type { HostRule } from '../types'; -import { setNoVerify, setPrivateKey } from '../util/git'; +import { setGitAuthor, setNoVerify, setPrivateKey } from '../util/git'; import * as hostRules from '../util/host-rules'; import platforms from './api'; import type { Platform } from './types'; @@ -39,48 +38,6 @@ export function setPlatformApi(name: string): void { _platform = platforms.get(name); } -interface GitAuthor { - name?: string; - address?: string; -} - -export function parseGitAuthor(input: string): GitAuthor | null { - let result: GitAuthor = null; - if (!input) { - return null; - } - try { - result = addrs.parseOneAddress(input); - if (result) { - return result; - } - if (input.includes('[bot]@')) { - // invalid github app/bot addresses - const parsed = addrs.parseOneAddress( - input.replace('[bot]@', '@') - ) as addrs.ParsedMailbox; - if (parsed?.address) { - result = { - name: parsed.name || input.replace(/@.*/, ''), - address: parsed.address.replace('@', '[bot]@'), - }; - return result; - } - } - if (input.includes('<') && input.includes('>')) { - // try wrapping the name part in quotations - result = addrs.parseOneAddress('"' + input.replace(/(\s?<)/, '"$1')); - if (result) { - return result; - } - } - } catch (err) /* istanbul ignore next */ { - logger.error({ err }, 'Unknown error parsing gitAuthor'); - } - // give up - return null; -} - export async function initPlatform(config: AllConfig): Promise { setPrivateKey(config.gitPrivateKey); setNoVerify(config.gitNoVerify ?? []); @@ -88,30 +45,16 @@ export async function initPlatform(config: AllConfig): Promise { // TODO: types const platformInfo = await platform.initPlatform(config); const returnConfig: any = { ...config, ...platformInfo }; - let gitAuthor: string; // istanbul ignore else if (config?.gitAuthor) { logger.debug(`Using configured gitAuthor (${config.gitAuthor})`); - gitAuthor = config.gitAuthor; + returnConfig.gitAuthor = config.gitAuthor; } else if (platformInfo?.gitAuthor) { logger.debug(`Using platform gitAuthor: ${String(platformInfo.gitAuthor)}`); - gitAuthor = platformInfo.gitAuthor; - } else { - logger.debug( - 'Using default gitAuthor: Renovate Bot ' - ); - gitAuthor = 'Renovate Bot '; + returnConfig.gitAuthor = platformInfo.gitAuthor; } - const gitAuthorParsed = parseGitAuthor(gitAuthor); - // istanbul ignore if - if (!gitAuthorParsed) { - throw new Error('Init: gitAuthor is not parsed as valid RFC5322 format'); - } - global.gitAuthor = { - name: gitAuthorParsed.name, - email: gitAuthorParsed.address, - }; - + // This is done for validation and will be overridden later once repo config is incorporated + setGitAuthor(returnConfig.gitAuthor); const platformRule: HostRule = { hostType: returnConfig.platform, matchHost: URL.parse(returnConfig.endpoint).hostname, diff --git a/lib/platform/__snapshots__/index.spec.ts.snap b/lib/util/git/__snapshots__/author.spec.ts.snap similarity index 50% rename from lib/platform/__snapshots__/index.spec.ts.snap rename to lib/util/git/__snapshots__/author.spec.ts.snap index 3217d7d515f0db..844b8e8eb738a1 100644 --- a/lib/platform/__snapshots__/index.spec.ts.snap +++ b/lib/util/git/__snapshots__/author.spec.ts.snap @@ -1,15 +1,15 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`platform/index escapes names 1`] = `"name [what]"`; +exports[`util/git/author parseGitAuthor escapes names 1`] = `"name [what]"`; -exports[`platform/index parses bot email 1`] = ` +exports[`util/git/author parseGitAuthor parses bot email 1`] = ` Object { "address": "some[bot]@users.noreply.github.com", "name": "some[bot]", } `; -exports[`platform/index parses bot name and email 1`] = ` +exports[`util/git/author parseGitAuthor parses bot name and email 1`] = ` Object { "address": "some[bot]@users.noreply.github.com", "name": "some[bot]", diff --git a/lib/util/git/author.spec.ts b/lib/util/git/author.spec.ts new file mode 100644 index 00000000000000..cd80f6a393fcec --- /dev/null +++ b/lib/util/git/author.spec.ts @@ -0,0 +1,30 @@ +import { parseGitAuthor } from './author'; + +describe('util/git/author', () => { + describe('parseGitAuthor', () => { + it('returns null if empty email given', () => { + expect(parseGitAuthor(undefined)).toBeNull(); + }); + it('parses bot email', () => { + // FIXME: explicit assert condition + expect( + parseGitAuthor('some[bot]@users.noreply.github.com') + ).toMatchSnapshot(); + }); + it('parses bot name and email', () => { + // FIXME: explicit assert condition + expect( + parseGitAuthor('"some[bot]" ') + ).toMatchSnapshot(); + }); + it('escapes names', () => { + // FIXME: explicit assert condition + expect( + parseGitAuthor('name [what] ').name + ).toMatchSnapshot(); + }); + it('gives up', () => { + expect(parseGitAuthor('a.b.c')).toBeNull(); + }); + }); +}); diff --git a/lib/util/git/author.ts b/lib/util/git/author.ts new file mode 100644 index 00000000000000..bb149346afc7fe --- /dev/null +++ b/lib/util/git/author.ts @@ -0,0 +1,44 @@ +import addrs from 'email-addresses'; +import { logger } from '../../logger'; + +export interface GitAuthor { + name?: string; + address?: string; +} + +export function parseGitAuthor(input: string): GitAuthor | null { + let result: GitAuthor = null; + if (!input) { + return null; + } + try { + result = addrs.parseOneAddress(input); + if (result) { + return result; + } + if (input.includes('[bot]@')) { + // invalid github app/bot addresses + const parsed = addrs.parseOneAddress( + input.replace('[bot]@', '@') + ) as addrs.ParsedMailbox; + if (parsed?.address) { + result = { + name: parsed.name || input.replace(/@.*/, ''), + address: parsed.address.replace('@', '[bot]@'), + }; + return result; + } + } + if (input.includes('<') && input.includes('>')) { + // try wrapping the name part in quotations + result = addrs.parseOneAddress('"' + input.replace(/(\s?<)/, '"$1')); + if (result) { + return result; + } + } + } catch (err) /* istanbul ignore next */ { + logger.debug({ err }, 'Unknown error parsing gitAuthor'); + } + // give up + return null; +} diff --git a/lib/util/git/index.spec.ts b/lib/util/git/index.spec.ts index c08bb5beb3bf41..d7412b37208283 100644 --- a/lib/util/git/index.spec.ts +++ b/lib/util/git/index.spec.ts @@ -3,6 +3,7 @@ import Git from 'simple-git'; import SimpleGit from 'simple-git/src/git'; import tmp from 'tmp-promise'; import { setGlobalConfig } from '../../config/global'; +import { CONFIG_VALIDATION } from '../../constants/error-messages'; import * as git from '.'; import { GitNoVerifyOption, setNoVerify } from '.'; @@ -73,10 +74,9 @@ describe('util/git/index', () => { setGlobalConfig({ localDir: tmpDir.path }); await git.initRepo({ url: origin.path, - gitAuthorName: 'Jest', - gitAuthorEmail: 'Jest@example.com', }); git.setUserRepoConfig({ branchPrefix: 'renovate/' }); + git.setGitAuthor('Jest '); setNoVerify([]); await git.syncGit(); // override some local git settings for better testing @@ -548,4 +548,9 @@ describe('util/git/index', () => { expect(res).toBe('test-extra-config-value'); }); }); + describe('setGitAuthor()', () => { + it('throws for invalid', () => { + expect(() => git.setGitAuthor('invalid')).toThrow(CONFIG_VALIDATION); + }); + }); }); diff --git a/lib/util/git/index.ts b/lib/util/git/index.ts index c3e1d20ce47e32..d84d60a2ef2003 100644 --- a/lib/util/git/index.ts +++ b/lib/util/git/index.ts @@ -9,7 +9,6 @@ import Git, { TaskOptions, } from 'simple-git'; import { join } from 'upath'; -import { configFileNames } from '../../config/app-strings'; import { getGlobalConfig } from '../../config/global'; import type { RenovateConfig } from '../../config/types'; import { @@ -24,6 +23,7 @@ import { logger } from '../../logger'; import { ExternalHostError } from '../../types/errors/external-host-error'; import { GitOptions, GitProtocol } from '../../types/git'; import { Limit, incLimitedValue } from '../../workers/global/limits'; +import { parseGitAuthor } from './author'; import { GitNoVerifyOption, getNoVerify } from './config'; import { configSigningKey, writePrivateKey } from './private-key'; @@ -44,8 +44,6 @@ interface StorageConfig { currentBranch?: string; url: string; extraCloneOpts?: GitOptions; - gitAuthorName?: string; - gitAuthorEmail?: string; cloneSubmodules?: boolean; } @@ -56,6 +54,8 @@ interface LocalConfig extends StorageConfig { branchCommits: Record; branchIsModified: Record; ignoredAuthors: string[]; + gitAuthorName?: string; + gitAuthorEmail?: string; } // istanbul ignore next @@ -214,8 +214,67 @@ async function cleanLocalBranches(): Promise { } } -export function setUserRepoConfig({ gitIgnoredAuthors }: RenovateConfig): void { +/* + * When we initially clone, we clone only the default branch so how no knowledge of other branches existing. + * By calling this function once the repo's branchPrefix is known, we can fetch all of Renovate's branches in one command. + */ +async function setBranchPrefix(branchPrefix: string): Promise { + config.branchPrefix = branchPrefix; + // If the repo is already cloned then set branchPrefix now, otherwise it will be called again during syncGit() + if (gitInitialized) { + logger.debug('Setting branchPrefix: ' + branchPrefix); + const ref = `refs/heads/${branchPrefix}*:refs/remotes/origin/${branchPrefix}*`; + try { + await git.fetch(['origin', ref, '--depth=5', '--force']); + } catch (err) /* istanbul ignore next */ { + checkForPlatformFailure(err); + throw err; + } + } +} + +export function setGitAuthor(gitAuthor: string): void { + const gitAuthorParsed = parseGitAuthor( + gitAuthor || 'Renovate Bot ' + ); + if (!gitAuthorParsed) { + const error = new Error(CONFIG_VALIDATION); + error.validationSource = 'None'; + error.validationError = 'Invalid gitAuthor'; + error.validationMessage = `gitAuthor is not parsed as valid RFC5322 format: ${gitAuthor}`; + throw error; + } + config.gitAuthorName = gitAuthorParsed.name; + config.gitAuthorEmail = gitAuthorParsed.address; +} + +export async function writeGitAuthor(): Promise { + const { gitAuthorName, gitAuthorEmail } = config; + try { + if (gitAuthorName) { + logger.debug({ gitAuthorName }, 'Setting git author name'); + await git.addConfig('user.name', gitAuthorName); + } + if (gitAuthorEmail) { + logger.debug({ gitAuthorEmail }, 'Setting git author email'); + await git.addConfig('user.email', gitAuthorEmail); + } + } catch (err) /* istanbul ignore next */ { + checkForPlatformFailure(err); + logger.debug( + { err, gitAuthorName, gitAuthorEmail }, + 'Error setting git author config' + ); + throw new Error(TEMPORARY_ERROR); + } +} + +export function setUserRepoConfig({ + gitIgnoredAuthors, + gitAuthor, +}: RenovateConfig): Promise { config.ignoredAuthors = gitIgnoredAuthors ?? []; + setGitAuthor(gitAuthor); } export async function getSubmodules(): Promise { @@ -320,21 +379,6 @@ export async function syncGit(): Promise { } logger.warn({ err }, 'Cannot retrieve latest commit'); } - try { - const { gitAuthorName, gitAuthorEmail } = config; - if (gitAuthorName) { - logger.debug({ gitAuthorName }, 'Setting git author name'); - await git.addConfig('user.name', gitAuthorName); - } - if (gitAuthorEmail) { - logger.debug({ gitAuthorEmail }, 'Setting git author email'); - await git.addConfig('user.email', gitAuthorEmail); - } - } catch (err) /* istanbul ignore next */ { - checkForPlatformFailure(err); - logger.debug({ err }, 'Error setting git author config'); - throw new Error(TEMPORARY_ERROR); - } config.currentBranch = config.currentBranch || (await getDefaultBranch(git)); } @@ -637,20 +681,6 @@ export type CommitFilesConfig = { force?: boolean; }; -async function gitAdd(files: string | string[]): Promise { - try { - await git.add(files); - } catch (err) /* istanbul ignore next */ { - if ( - !err.message.includes( - 'The following paths are ignored by one of your .gitignore files' - ) - ) { - throw err; - } - } -} - export async function commitFiles({ branchName, files, @@ -665,21 +695,31 @@ export async function commitFiles({ } const { localDir } = getGlobalConfig(); await configSigningKey(localDir); + await writeGitAuthor(); try { await git.reset(ResetMode.HARD); await git.raw(['clean', '-fd']); await git.checkout(['-B', branchName, 'origin/' + config.currentBranch]); - const fileNames: string[] = []; - const deleted: string[] = []; + const deletedFiles: string[] = []; + const addedModifiedFiles: string[] = []; + const ignoredFiles: string[] = []; for (const file of files) { + let fileName = file.name; // istanbul ignore if - if (file.name === '|delete|') { - deleted.push(file.contents as string); - } else if (await isDirectory(join(localDir, file.name))) { - fileNames.push(file.name); - await gitAdd(file.name); + if (fileName === '|delete|') { + fileName = file.contents as string; + try { + await git.rm([fileName]); + deletedFiles.push(fileName); + } catch (err) /* istanbul ignore next */ { + checkForPlatformFailure(err); + logger.warn({ err, fileName }, 'Cannot delete file'); + ignoredFiles.push(fileName); + } + } else if (await isDirectory(join(localDir, fileName))) { + logger.warn({ fileName }, 'Skipping directory commit'); + ignoredFiles.push(fileName); } else { - fileNames.push(file.name); let contents: Buffer; // istanbul ignore else if (typeof file.contents === 'string') { @@ -687,23 +727,20 @@ export async function commitFiles({ } else { contents = file.contents; } - await fs.outputFile(join(localDir, file.name), contents); - } - } - // istanbul ignore if - if (fileNames.length === 1 && configFileNames.includes(fileNames[0])) { - fileNames.unshift('-f'); - } - if (fileNames.length) { - await gitAdd(fileNames); - } - if (deleted.length) { - for (const f of deleted) { + await fs.outputFile(join(localDir, fileName), contents); try { - await git.rm([f]); + await git.add(fileName); + addedModifiedFiles.push(fileName); } catch (err) /* istanbul ignore next */ { - checkForPlatformFailure(err); - logger.debug({ err }, 'Cannot delete ' + f); + if ( + !err.message.includes( + 'The following paths are ignored by one of your .gitignore files' + ) + ) { + throw err; + } + logger.debug({ fileName }, 'Cannot commit ignored file'); + ignoredFiles.push(file.name); } } } @@ -723,11 +760,14 @@ export async function commitFiles({ logger.warn({ commitRes }, 'Detected empty commit - aborting git push'); return null; } - logger.debug({ result: commitRes }, `git commit`); + logger.debug( + { deletedFiles, ignoredFiles, result: commitRes }, + `git commit` + ); const commit = commitRes?.commit || 'unknown'; if (!force && !(await hasDiff(`origin/${branchName}`))) { logger.debug( - { branchName, fileNames }, + { branchName, deletedFiles, addedModifiedFiles, ignoredFiles }, 'No file changes detected. Skipping commit' ); return null; diff --git a/lib/util/host-rules.spec.ts b/lib/util/host-rules.spec.ts index 1e01f83c89c948..7bc63e902dde7d 100644 --- a/lib/util/host-rules.spec.ts +++ b/lib/util/host-rules.spec.ts @@ -208,6 +208,15 @@ describe('util/host-rules', () => { expect(find({ url: 'https://domain.com' }).token).toEqual('def'); expect(find({ url: 'httpsdomain.com' }).token).toBeUndefined(); }); + it('matches on matchHost with dot prefix', () => { + add({ + matchHost: '.domain.com', + token: 'def', + }); + expect(find({ url: 'https://api.domain.com' }).token).toEqual('def'); + expect(find({ url: 'https://domain.com' }).token).toBeUndefined(); + expect(find({ url: 'httpsdomain.com' }).token).toBeUndefined(); + }); it('matches on hostType and endpoint', () => { add({ hostType: datasourceNuget.id, diff --git a/lib/util/host-rules.ts b/lib/util/host-rules.ts index d9c18f536b3855..c6887c5a0ea62b 100644 --- a/lib/util/host-rules.ts +++ b/lib/util/host-rules.ts @@ -85,7 +85,10 @@ function matchesHost(rule: HostRule, search: HostRuleSearch): boolean { return false; } const { hostname } = parsedUrl; - return hostname === rule.matchHost || hostname.endsWith(`.${rule.matchHost}`); + const dotPrefixedMatchHost = rule.matchHost.startsWith('.') + ? rule.matchHost + : `.${rule.matchHost}`; + return hostname === rule.matchHost || hostname.endsWith(dotPrefixedMatchHost); } export function find(search: HostRuleSearch): HostRule { diff --git a/lib/workers/pr/changelog/release-notes.spec.ts b/lib/workers/pr/changelog/release-notes.spec.ts index 3a86c3db889fb9..622b0d618b3e37 100644 --- a/lib/workers/pr/changelog/release-notes.spec.ts +++ b/lib/workers/pr/changelog/release-notes.spec.ts @@ -68,8 +68,8 @@ describe('workers/pr/changelog/release-notes', () => { const now = DateTime.local(); it.each([ [now, 55], - [now.minus({ week: 2 }), 1435], - [now.minus({ year: 1 }), 14495], + [now.minus({ weeks: 2 }), 1435], + [now.minus({ years: 1 }), 14495], ])('works with string date (%s, %i)', (date, minutes) => { expect(releaseNotesCacheMinutes(date?.toISO())).toEqual(minutes); }); diff --git a/lib/workers/repository/onboarding/branch/index.ts b/lib/workers/repository/onboarding/branch/index.ts index 5af0f6f74b7504..370e668069f38e 100644 --- a/lib/workers/repository/onboarding/branch/index.ts +++ b/lib/workers/repository/onboarding/branch/index.ts @@ -7,7 +7,7 @@ import { } from '../../../../constants/error-messages'; import { logger } from '../../../../logger'; import { platform } from '../../../../platform'; -import { checkoutBranch } from '../../../../util/git'; +import { checkoutBranch, setGitAuthor } from '../../../../util/git'; import { extractAllDependencies } from '../../extract'; import { mergeRenovateConfig } from '../../init/merge'; import { isOnboarded, onboardingPrExists } from './check'; @@ -30,6 +30,8 @@ export async function checkOnboardingBranch( throw new Error(REPOSITORY_FORKED); } logger.debug('Repo is not onboarded'); + // global gitAuthor will need to be used + setGitAuthor(config.gitAuthor); if (await onboardingPrExists(config)) { logger.debug('Onboarding PR already exists'); const commit = await rebaseOnboardingBranch(config); diff --git a/package.json b/package.json index 4fa965180f9ec6..85be34c5992441 100644 --- a/package.json +++ b/package.json @@ -131,18 +131,18 @@ "@yarnpkg/parsers": "2.4.0", "azure-devops-node-api": "11.0.1", "bunyan": "1.8.15", - "cacache": "15.2.0", + "cacache": "15.3.0", "chalk": "4.1.2", "changelog-filename-regex": "2.0.1", "clean-git-ref": "2.0.1", - "commander": "7.2.0", + "commander": "8.1.0", "conventional-commits-detector": "1.0.3", "crypto-random-string": "3.3.1", "deepmerge": "4.2.2", "delay": "5.0.0", "dequal": "2.0.2", "detect-indent": "6.1.0", - "email-addresses": "4.0.0", + "email-addresses": "5.0.0", "emoji-regex": "9.2.2", "emojibase": "5.2.0", "emojibase-regex": "5.1.3", @@ -184,7 +184,7 @@ "semver-utils": "1.1.4", "shlex": "2.1.0", "shortid": "2.2.16", - "simple-git": "2.44.0", + "simple-git": "2.45.0", "slugify": "1.6.0", "traverse": "0.6.6", "upath": "2.0.1", @@ -198,9 +198,9 @@ }, "devDependencies": { "@actions/core": "1.5.0", - "@jest/globals": "27.0.6", - "@jest/reporters": "27.0.6", - "@jest/test-result": "27.0.6", + "@jest/globals": "27.1.0", + "@jest/reporters": "27.1.0", + "@jest/test-result": "27.1.0", "@ls-lint/ls-lint": "1.10.0", "@renovate/eslint-plugin": "https://github.com/renovatebot/eslint-plugin#v0.0.3", "@semantic-release/exec": "5.0.0", @@ -219,12 +219,12 @@ "@types/js-yaml": "4.0.3", "@types/json-dup-key-validator": "1.0.0", "@types/linkify-markdown": "1.0.1", - "@types/luxon": "2.0.0", - "@types/markdown-it": "12.2.0", + "@types/luxon": "2.0.2", + "@types/markdown-it": "12.2.1", "@types/markdown-table": "2.0.0", "@types/moo": "0.5.5", "@types/nock": "10.0.3", - "@types/node": "14.17.11", + "@types/node": "14.17.12", "@types/node-emoji": "1.8.1", "@types/parse-link-header": "1.0.0", "@types/registry-auth-token": "4.2.1", @@ -250,27 +250,27 @@ "glob": "7.1.7", "graphql": "15.5.1", "husky": "7.0.2", - "jest": "27.0.6", + "jest": "27.1.0", "jest-extended": "0.11.5", "jest-github-actions-reporter": "1.0.3", "jest-junit": "12.2.0", "jest-mock-extended": "1.0.18", "jest-silent-reporter": "0.5.0", - "markdownlint-cli2": "0.2.0", + "markdownlint-cli2": "0.3.0", "mockdate": "3.0.5", "nock": "13.1.3", "npm-run-all": "4.1.5", "prettier": "2.3.2", "pretty-quick": "3.1.1", "rimraf": "3.0.2", - "semantic-release": "17.4.6", + "semantic-release": "17.4.7", "shelljs": "0.8.4", "strip-ansi": "6.0.0", "tmp-promise": "3.0.2", "ts-jest": "27.0.5", "ts-node": "10.2.1", "type-fest": "2.1.0", - "typescript": "4.3.5", + "typescript": "4.4.2", "unified": "9.2.2" }, "resolutions": { diff --git a/tsconfig.json b/tsconfig.json index 920493bcb7b5e5..409aaf9567f698 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,6 +13,7 @@ "noUnusedLocals": true, "noImplicitOverride": true, "experimentalDecorators": true, + "useUnknownInCatchVariables": false /* we aren't prepared for enabling this by default since ts 4.4*/, "lib": ["es2018"], "types": ["node", "jest", "jest-extended"], "allowJs": true, diff --git a/yarn.lock b/yarn.lock index b57d76e64e74c7..02dab6d2efb02e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -465,11 +465,16 @@ "@aws-sdk/types" "3.25.0" tslib "^2.3.0" -"@aws-sdk/types@3.25.0", "@aws-sdk/types@^3.1.0": +"@aws-sdk/types@3.25.0": version "3.25.0" resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.25.0.tgz#981210272dae2d259130f6dca8429522d9a564bb" integrity sha512-vS0+cTKwj6CujlR07HmeEBxzWPWSrdmZMYnxn/QC9KW9dFu0lsyCGSCqWsFluI6GI0flsnYYWNkP5y4bfD9tqg== +"@aws-sdk/types@^3.1.0": + version "3.29.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.29.0.tgz#792050dfd4ff97fca448160ca9f652d5f33514b0" + integrity sha512-8ilWQU5ZTdiRfblmmjl38+6JZKKM8EqA5Sbn8djgDLShCLeVJ2TsL2guzNi+WHcL7BHdv1pI/NNmTcgRUo6yOw== + "@aws-sdk/url-parser@3.25.0": version "3.25.0" resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.25.0.tgz#668c7d9d4bc21854c10bfb8bdf762a9206776fae" @@ -532,9 +537,9 @@ tslib "^2.3.0" "@aws-sdk/util-locate-window@^3.0.0": - version "3.23.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.23.0.tgz#e9bf2a023dce2ea1d13ec2e8c7c92abb333a1442" - integrity sha512-mM8kWW7SWIxCshkNllpYqCQi5SzwJ+sv5nURhtquOB5/H3qGqZm0V5lUE3qpE1AYmqKwk6qbGUy1woFn1T5nrw== + version "3.29.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.29.0.tgz#a87bd77234864c2fffa98d33b58808e3553a9a18" + integrity sha512-gvcbl9UdTOvuCCzgbtTTsKnL1l/cnT/CFl0f6ZCQ6qubUTRCuL/aK8DvgWa1n9p/ddCiVKPLmHu/L1xtX4gc0A== dependencies: tslib "^2.3.0" @@ -563,13 +568,20 @@ "@aws-sdk/types" "3.25.0" tslib "^2.3.0" -"@aws-sdk/util-utf8-browser@3.23.0", "@aws-sdk/util-utf8-browser@^3.0.0": +"@aws-sdk/util-utf8-browser@3.23.0": version "3.23.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.23.0.tgz#dff7e891c67936de677b7d7a6c796e5c2e1b1510" integrity sha512-fSB95AKnvCnAbCd7o0xLbErfAgD9wnLCaEu23AgfGAiaG3nFF8Z2+wtjebU/9Z4RI9d/x83Ho/yguRnJdkMsPA== dependencies: tslib "^2.3.0" +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.29.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.29.0.tgz#8d04f4159763c2dccaad4eb09bf2a6118dbfea12" + integrity sha512-ZIHbBYByMq5vadQ1SZOQTHVtrkGAFiuypATYF5ST8YB3j7XKvflv+fiBX2xQ8xpqb28noEg6dNPnvqkQQ1n/aw== + dependencies: + tslib "^2.3.0" + "@aws-sdk/util-utf8-node@3.23.0": version "3.23.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.23.0.tgz#9f9fe76745c79c8a148f15d78e9a5c03d2bf0441" @@ -607,19 +619,19 @@ integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== "@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.0.tgz#749e57c68778b73ad8082775561f67f5196aafa8" - integrity sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw== + version "7.15.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" + integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg== dependencies: "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.0" - "@babel/helper-module-transforms" "^7.15.0" - "@babel/helpers" "^7.14.8" - "@babel/parser" "^7.15.0" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" + "@babel/generator" "^7.15.4" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.5" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -627,111 +639,111 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.15.0", "@babel/generator@^7.7.2": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15" - integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ== +"@babel/generator@^7.15.4", "@babel/generator@^7.7.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" + integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== dependencies: - "@babel/types" "^7.15.0" + "@babel/types" "^7.15.4" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-compilation-targets@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818" - integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A== +"@babel/helper-compilation-targets@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== dependencies: "@babel/compat-data" "^7.15.0" "@babel/helper-validator-option" "^7.14.5" browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" - integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== +"@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== dependencies: - "@babel/helper-get-function-arity" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-get-function-arity@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" - integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-hoist-variables@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" - integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-member-expression-to-functions@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b" - integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg== +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== dependencies: - "@babel/types" "^7.15.0" + "@babel/types" "^7.15.4" -"@babel/helper-module-imports@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" - integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== +"@babel/helper-module-imports@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" -"@babel/helper-module-transforms@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08" - integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg== +"@babel/helper-module-transforms@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c" + integrity sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw== dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.0" - "@babel/helper-simple-access" "^7.14.8" - "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" "@babel/helper-validator-identifier" "^7.14.9" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-optimise-call-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" - integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" "@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.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4" - integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA== +"@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.0" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-simple-access@^7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" - integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg== +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== dependencies: - "@babel/types" "^7.14.8" + "@babel/types" "^7.15.4" -"@babel/helper-split-export-declaration@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" - integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.4" "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": version "7.14.9" @@ -743,14 +755,14 @@ 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.14.8": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.3.tgz#c96838b752b95dcd525b4e741ed40bb1dc2a1357" - integrity sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g== +"@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== dependencies: - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" "@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": version "7.14.5" @@ -761,10 +773,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.15.0", "@babel/parser@^7.7.2": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862" - integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA== +"@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.5", "@babel/parser@^7.7.2": + version "7.15.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.5.tgz#d33a58ca69facc05b26adfe4abebfed56c1c2dac" + integrity sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -858,41 +870,41 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/runtime-corejs3@^7.12.1": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.15.3.tgz#28754263988198f2a928c09733ade2fb4d28089d" - integrity sha512-30A3lP+sRL6ml8uhoJSs+8jwpKzbw8CqBvDc1laeptxPm5FahumJxirigcbD2qTs71Sonvj1cyZB0OKGAmxQ+A== + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz#403139af262b9a6e8f9ba04a6fdcebf8de692bf1" + integrity sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg== dependencies: core-js-pure "^3.16.0" regenerator-runtime "^0.13.4" -"@babel/template@^7.14.5", "@babel/template@^7.3.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" - integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== +"@babel/template@^7.15.4", "@babel/template@^7.3.3": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== dependencies: "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.15.0", "@babel/traverse@^7.7.2": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" - integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.7.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== dependencies: "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.15.0" - "@babel/types" "^7.15.0" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" - integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== +"@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.4.tgz#74eeb86dbd6748d2741396557b9860e57fce0a0d" + integrity sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw== dependencies: "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" @@ -983,7 +995,7 @@ chalk "^2.0.1" slash "^2.0.0" -"@jest/console@^27.0.6", "@jest/console@^27.1.0": +"@jest/console@^27.1.0": version "27.1.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.1.0.tgz#de13b603cb1d389b50c0dc6296e86e112381e43c" integrity sha512-+Vl+xmLwAXLNlqT61gmHEixeRbS4L8MUzAjtpBCOPWH+izNI/dR16IeXjkXJdRtIVWVSf9DO1gdp67B1XorZhQ== @@ -995,7 +1007,7 @@ jest-util "^27.1.0" slash "^3.0.0" -"@jest/core@^27.0.6", "@jest/core@^27.1.0": +"@jest/core@^27.1.0": version "27.1.0" resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.1.0.tgz#622220f18032f5869e579cecbe744527238648bf" integrity sha512-3l9qmoknrlCFKfGdrmiQiPne+pUR4ALhKwFTYyOeKw6egfDwJkO21RJ1xf41rN8ZNFLg5W+w6+P4fUqq4EMRWA== @@ -1030,7 +1042,7 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^27.0.6", "@jest/environment@^27.1.0": +"@jest/environment@^27.1.0": version "27.1.0" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.1.0.tgz#c7224a67004759ec203d8fa44e8bc0db93f66c44" integrity sha512-wRp50aAMY2w1U2jP1G32d6FUVBNYqmk8WaGkiIEisU48qyDV0WPtw3IBLnl7orBeggveommAkuijY+RzVnNDOQ== @@ -1052,16 +1064,7 @@ jest-mock "^27.1.0" jest-util "^27.1.0" -"@jest/globals@27.0.6": - version "27.0.6" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.0.6.tgz#48e3903f99a4650673d8657334d13c9caf0e8f82" - integrity sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw== - dependencies: - "@jest/environment" "^27.0.6" - "@jest/types" "^27.0.6" - expect "^27.0.6" - -"@jest/globals@^27.1.0": +"@jest/globals@27.1.0", "@jest/globals@^27.1.0": version "27.1.0" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.1.0.tgz#e093a49c718dd678a782c197757775534c88d3f2" integrity sha512-73vLV4aNHAlAgjk0/QcSIzzCZSqVIPbmFROJJv9D3QUR7BI4f517gVdJpSrCHxuRH3VZFhe0yGG/tmttlMll9g== @@ -1070,37 +1073,7 @@ "@jest/types" "^27.1.0" expect "^27.1.0" -"@jest/reporters@27.0.6": - version "27.0.6" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.0.6.tgz#91e7f2d98c002ad5df94d5b5167c1eb0b9fd5b00" - integrity sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.0.6" - "@jest/test-result" "^27.0.6" - "@jest/transform" "^27.0.6" - "@jest/types" "^27.0.6" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^27.0.6" - jest-resolve "^27.0.6" - jest-util "^27.0.6" - jest-worker "^27.0.6" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.0.0" - -"@jest/reporters@^27.1.0": +"@jest/reporters@27.1.0", "@jest/reporters@^27.1.0": version "27.1.0" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.1.0.tgz#02ed1e6601552c2f6447378533f77aad002781d4" integrity sha512-5T/zlPkN2HnK3Sboeg64L5eC8iiaZueLpttdktWTJsvALEtP2YMkC5BQxwjRWQACG9SwDmz+XjjkoxXUDMDgdw== @@ -1148,13 +1121,13 @@ graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@27.0.6": - version "27.0.6" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.0.6.tgz#3fa42015a14e4fdede6acd042ce98c7f36627051" - integrity sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w== +"@jest/test-result@27.1.0", "@jest/test-result@^27.1.0": + version "27.1.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.1.0.tgz#9345ae5f97f6a5287af9ebd54716cd84331d42e8" + integrity sha512-Aoz00gpDL528ODLghat3QSy6UBTD5EmmpjrhZZMK/v1Q2/rRRqTGnFxHuEkrD4z/Py96ZdOHxIWkkCKRpmnE1A== dependencies: - "@jest/console" "^27.0.6" - "@jest/types" "^27.0.6" + "@jest/console" "^27.1.0" + "@jest/types" "^27.1.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" @@ -1167,16 +1140,6 @@ "@jest/types" "^24.9.0" "@types/istanbul-lib-coverage" "^2.0.0" -"@jest/test-result@^27.0.6", "@jest/test-result@^27.1.0": - version "27.1.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.1.0.tgz#9345ae5f97f6a5287af9ebd54716cd84331d42e8" - integrity sha512-Aoz00gpDL528ODLghat3QSy6UBTD5EmmpjrhZZMK/v1Q2/rRRqTGnFxHuEkrD4z/Py96ZdOHxIWkkCKRpmnE1A== - dependencies: - "@jest/console" "^27.1.0" - "@jest/types" "^27.1.0" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - "@jest/test-sequencer@^27.1.0": version "27.1.0" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.1.0.tgz#04e8b3bd735570d3d48865e74977a14dc99bff2d" @@ -1187,7 +1150,7 @@ jest-haste-map "^27.1.0" jest-runtime "^27.1.0" -"@jest/transform@^27.0.6", "@jest/transform@^27.1.0": +"@jest/transform@^27.1.0": version "27.1.0" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.1.0.tgz#962e385517e3d1f62827fa39c305edcc3ca8544b" integrity sha512-ZRGCA2ZEVJ00ubrhkTG87kyLbN6n55g1Ilq0X9nJb5bX3MhMp3O6M7KG+LvYu+nZRqG5cXsQnJEdZbdpTAV8pQ== @@ -1228,7 +1191,7 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jest/types@^27.0.6", "@jest/types@^27.1.0": +"@jest/types@^27.1.0": version "27.1.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.1.0.tgz#674a40325eab23c857ebc0689e7e191a3c5b10cc" integrity sha512-pRP5cLIzN7I7Vp6mHKRSaZD7YpBTK7hawx5si8trMKqk4+WOdK8NEKOTO2G8PKWD1HbKMVckVB6/XHh/olhf2g== @@ -1278,9 +1241,9 @@ fastq "^1.6.0" "@npmcli/arborist@*", "@npmcli/arborist@^2.3.0", "@npmcli/arborist@^2.5.0": - version "2.8.2" - resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-2.8.2.tgz#643f8c8a26ffbaa579983972f67a60cb6217e86a" - integrity sha512-6E1XJ0YXBaI9J+25gcTF110MGNx3jv6npr4Rz1U0UAqkuVV7bbDznVJvNqi6F0p8vgrE+Smf9jDTn1DR+7uBjQ== + version "2.8.3" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-2.8.3.tgz#5569e7d2038f6893abc81f9c879f497b506e6980" + integrity sha512-miFcxbZjmQqeFTeRSLLh+lc/gxIKDO5L4PVCp+dp+kmcwJmYsEJmF7YvHR2yi3jF+fxgvLf3CCFzboPIXAuabg== dependencies: "@npmcli/installed-package-contents" "^1.0.7" "@npmcli/map-workspaces" "^1.0.2" @@ -1320,9 +1283,9 @@ integrity sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q== "@npmcli/config@*": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-2.2.0.tgz#c3f6cb76e74691d1ae746cda482b7df751ed2124" - integrity sha512-y0V3F7RCWXy8kBOvKvKSRUNKRobLB6vL/UNchy/6+IUNIqu+UyrY3Z7jvj1ZA/AkYc/0WkCUtppCo+bPhMU8Aw== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-2.3.0.tgz#364fbe942037e562a832a113206e14ccb651f7bc" + integrity sha512-yjiC1xv7KTmUTqfRwN2ZL7BHV160ctGF0fLXmKkkMXj40UOvBe45Apwvt5JsFRtXSoHkUYy1ouzscziuWNzklg== dependencies: ini "^2.0.0" mkdirp-infer-owner "^2.0.0" @@ -1435,7 +1398,7 @@ dependencies: "@octokit/types" "^6.0.3" -"@octokit/core@^3.5.0": +"@octokit/core@^3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.5.1.tgz#8601ceeb1ec0e1b1b8217b960a413ed8e947809b" integrity sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw== @@ -1458,37 +1421,37 @@ universal-user-agent "^6.0.0" "@octokit/graphql@^4.5.8": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.7.0.tgz#cbe12edc2bc61e9eaa5f9e5d092644c92b6fcb74" - integrity sha512-diY0qMPyQjfu4rDu3kDhJ9qIZadIm4IISO3RJSv9ajYUWJUCO0AykbgzLcg1xclxtXgzY583u3gAv66M6zz5SA== + version "4.8.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.8.0.tgz#664d9b11c0e12112cbf78e10f49a05959aa22cc3" + integrity sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg== dependencies: "@octokit/request" "^5.6.0" "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^9.5.0": - version "9.7.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-9.7.0.tgz#9897cdefd629cd88af67b8dbe2e5fb19c63426b2" - integrity sha512-TUJ16DJU8mekne6+KVcMV5g6g/rJlrnIKn7aALG9QrNpnEipFc1xjoarh0PKaAWf2Hf+HwthRKYt+9mCm5RsRg== +"@octokit/openapi-types@^10.1.0": + version "10.1.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-10.1.1.tgz#74607482d193e9c9cc7e23ecf04b1bde3eabb6d8" + integrity sha512-ygp/6r25Ezb1CJuVMnFfOsScEtPF0zosdTJDZ7mZ+I8IULl7DP1BS5ZvPRwglcarGPXOvS5sHdR0bjnVDDfQdQ== -"@octokit/plugin-paginate-rest@^2.6.2": - version "2.15.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.15.1.tgz#264189dd3ce881c6c33758824aac05a4002e056a" - integrity sha512-47r52KkhQDkmvUKZqXzA1lKvcyJEfYh3TKAIe5+EzMeyDM3d+/s5v11i2gTk8/n6No6DPi3k5Ind6wtDbo/AEg== +"@octokit/plugin-paginate-rest@^2.16.0": + version "2.16.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.0.tgz#09dbda2e5fbca022e3cdf76b63618f7b357c9f0c" + integrity sha512-8YYzALPMvEZ35kgy5pdYvQ22Roz+BIuEaedO575GwE2vb/ACDqQn0xQrTJR4tnZCJn7pi8+AWPVjrFDaERIyXQ== dependencies: - "@octokit/types" "^6.24.0" + "@octokit/types" "^6.26.0" -"@octokit/plugin-request-log@^1.0.2": +"@octokit/plugin-request-log@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.8.0.tgz#33b342fe41f2603fdf8b958e6652103bb3ea3f3b" - integrity sha512-qeLZZLotNkoq+it6F+xahydkkbnvSK0iDjlXFo3jNTB+Ss0qIbYQb9V/soKLMkgGw8Q2sHjY5YEXiA47IVPp4A== +"@octokit/plugin-rest-endpoint-methods@^5.9.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.10.0.tgz#8058acf408d518defa2dc59a46777adbcd7ee8e8" + integrity sha512-HiUZliq5wNg15cevJlTo9zDnPXAD0BMRhLxbRNPnq9J3HELKesDTOiou56ax2jC/rECUkK/uJTugrizYKSo/jg== dependencies: - "@octokit/types" "^6.25.0" + "@octokit/types" "^6.27.0" deprecation "^2.3.1" "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": @@ -1513,21 +1476,21 @@ universal-user-agent "^6.0.0" "@octokit/rest@^18.0.0": - version "18.9.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.9.1.tgz#db1d7ac1d7b10e908f7d4b78fe35a392554ccb26" - integrity sha512-idZ3e5PqXVWOhtZYUa546IDHTHjkGZbj3tcJsN0uhCy984KD865e8GB2WbYDc2ZxFuJRiyd0AftpL2uPNhF+UA== + version "18.10.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.10.0.tgz#8a0add9611253e0e31d3ed5b4bc941a3795a7648" + integrity sha512-esHR5OKy38bccL/sajHqZudZCvmv4yjovMJzyXlphaUo7xykmtOdILGJ3aAm0mFHmMLmPFmDMJXf39cAjNJsrw== dependencies: - "@octokit/core" "^3.5.0" - "@octokit/plugin-paginate-rest" "^2.6.2" - "@octokit/plugin-request-log" "^1.0.2" - "@octokit/plugin-rest-endpoint-methods" "5.8.0" + "@octokit/core" "^3.5.1" + "@octokit/plugin-paginate-rest" "^2.16.0" + "@octokit/plugin-request-log" "^1.0.4" + "@octokit/plugin-rest-endpoint-methods" "^5.9.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.24.0", "@octokit/types@^6.25.0": - version "6.25.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.25.0.tgz#c8e37e69dbe7ce55ed98ee63f75054e7e808bf1a" - integrity sha512-bNvyQKfngvAd/08COlYIN54nRgxskmejgywodizQNyiKoXmWRAjKup2/LYwm+T9V0gsKH6tuld1gM0PzmOiB4Q== +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.26.0", "@octokit/types@^6.27.0": + version "6.27.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.27.0.tgz#2ffcd4d1cf344285f4151978c6fd36a2edcdf922" + integrity sha512-ha27f8DToxXBPEJdzHCCuqpw7AgKfjhWGdNf3yIlBAhAsaexBXTfWw36zNSsncALXGvJq4EjLy1p3Wz45Aqb4A== dependencies: - "@octokit/openapi-types" "^9.5.0" + "@octokit/openapi-types" "^10.1.0" "@renovate/eslint-plugin@https://github.com/renovatebot/eslint-plugin#v0.0.3": version "0.0.1" @@ -1895,15 +1858,15 @@ resolved "https://registry.yarnpkg.com/@types/linkify-markdown/-/linkify-markdown-1.0.1.tgz#0b750a592107dd46ecf2b5be0eeb7656b1fc814d" integrity sha512-RYDOtCol7/sHGhSJvWVnl0AmOdQQWgUYys6cwn5Lt3RiYhyhTLMLv7B9wdixMgCfnNt0MQj/YSGi3qN0IQqLeQ== -"@types/luxon@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-2.0.0.tgz#3dd1d8c51b49e34585c5158ba3393e95c51fee89" - integrity sha512-L7iL3FitRSeuz8fbeLtql7qU6inHVtwEDWI1+vBXgyp0J2tmxOD7TgMBiEQjII/Y/TPcwrKasXb1BPuiCXRgxg== +"@types/luxon@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-2.0.2.tgz#89db62ab8299ed3a703e75eef525d6bdf94349bc" + integrity sha512-CUrDlIVYv7TNkdQV8YfT2WGAHyMAwFIT1PXoUcQhX2EFMVL20lxEQHWc73gdJfRtMsI6Vc22HvR7eUN0jkx6+w== -"@types/markdown-it@12.2.0": - version "12.2.0" - resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.0.tgz#f609929ac1e50cf0d039473fb331ebc62e313b34" - integrity sha512-YEpywby5S2wt64C2E3bcpLvtIV8BuCj+4AGtL7tU51V8Vr1qwm+cX9gFfWRyclgLC0UK/7w2heYmhymDi+snzw== +"@types/markdown-it@12.2.1": + version "12.2.1" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.1.tgz#ca36e1edce6f15a770f3e99e68622d1d2e2f0c65" + integrity sha512-iij+ilRX/vxtUPCREjn74xzHo/RorHJDwOsJ6X+TgKw7zSvazhVXnDfwlTnyLOMdiVUjtRYU4CrcUZ7Aci4PmQ== dependencies: "@types/linkify-it" "*" "@types/mdurl" "*" @@ -1954,14 +1917,14 @@ integrity sha512-0fRfA90FWm6KJfw6P9QGyo0HDTCmthZ7cWaBQndITlaWLTZ6njRyKwrwpzpg+n6kBXBIGKeUHEQuBx7bphGJkA== "@types/node@*": - version "16.7.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.7.6.tgz#8666478db8095aa66e25b7e469f3e7b53ea2855e" - integrity sha512-VESVNFoa/ahYA62xnLBjo5ur6gPsgEE5cNRy8SrdnkZ2nwJSW0kJ4ufbFr2zuU9ALtHM8juY53VcRoTA7htXSg== + version "16.7.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.7.10.tgz#7aa732cc47341c12a16b7d562f519c2383b6d4fc" + integrity sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA== -"@types/node@14.17.11": - version "14.17.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.11.tgz#82d266d657aec5ff01ca59f2ffaff1bb43f7bf0f" - integrity sha512-n2OQ+0Bz6WEsUjrvcHD1xZ8K+Kgo4cn9/w94s1bJS690QMUWfJPW/m7CCb7gPkA1fcYwL2UpjXP/rq/Eo41m6w== +"@types/node@14.17.12": + version "14.17.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.12.tgz#7a31f720b85a617e54e42d24c4ace136601656c7" + integrity sha512-vhUqgjJR1qxwTWV5Ps5txuy2XMdf7Fw+OrdChRboy8BmWUPkckOhphaohzFG6b8DW7CrxaBMdrdJ47SYFq1okw== "@types/node@^13.7.0": version "13.13.52" @@ -2116,7 +2079,7 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@4.29.3", "@typescript-eslint/experimental-utils@^4.0.1": +"@typescript-eslint/experimental-utils@4.29.3": version "4.29.3" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.3.tgz#52e437a689ccdef73e83c5106b34240a706f15e1" integrity sha512-ffIvbytTVWz+3keg+Sy94FG1QeOvmV9dP2YSdLFHw/ieLXWCa3U1TYu8IRCOpMv2/SPS8XqhM1+ou1YHsdzKrg== @@ -2128,7 +2091,19 @@ eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/parser@4.29.3", "@typescript-eslint/parser@^4.4.1": +"@typescript-eslint/experimental-utils@^4.0.1": + version "4.30.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.30.0.tgz#9e49704fef568432ae16fc0d6685c13d67db0fd5" + integrity sha512-K8RNIX9GnBsv5v4TjtwkKtqMSzYpjqAQg/oSphtxf3xxdt6T0owqnpojztjjTcatSteH3hLj3t/kklKx87NPqw== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.30.0" + "@typescript-eslint/types" "4.30.0" + "@typescript-eslint/typescript-estree" "4.30.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@4.29.3": version "4.29.3" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.29.3.tgz#2ac25535f34c0e98f50c0e6b28c679c2357d45f2" integrity sha512-jrHOV5g2u8ROghmspKoW7pN8T/qUzk0+DITun0MELptvngtMrwUJ1tv5zMI04CYVEUsSrN4jV7AKSv+I0y0EfQ== @@ -2138,6 +2113,16 @@ "@typescript-eslint/typescript-estree" "4.29.3" debug "^4.3.1" +"@typescript-eslint/parser@^4.4.1": + version "4.30.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.30.0.tgz#6abd720f66bd790f3e0e80c3be77180c8fcb192d" + integrity sha512-HJ0XuluSZSxeboLU7Q2VQ6eLlCwXPBOGnA7CqgBnz2Db3JRQYyBDJgQnop6TZ+rsbSx5gEdWhw4rE4mDa1FnZg== + dependencies: + "@typescript-eslint/scope-manager" "4.30.0" + "@typescript-eslint/types" "4.30.0" + "@typescript-eslint/typescript-estree" "4.30.0" + debug "^4.3.1" + "@typescript-eslint/scope-manager@4.29.3": version "4.29.3" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.29.3.tgz#497dec66f3a22e459f6e306cf14021e40ec86e19" @@ -2146,11 +2131,24 @@ "@typescript-eslint/types" "4.29.3" "@typescript-eslint/visitor-keys" "4.29.3" +"@typescript-eslint/scope-manager@4.30.0": + version "4.30.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.30.0.tgz#1a3ffbb385b1a06be85cd5165a22324f069a85ee" + integrity sha512-VJ/jAXovxNh7rIXCQbYhkyV2Y3Ac/0cVHP/FruTJSAUUm4Oacmn/nkN5zfWmWFEanN4ggP0vJSHOeajtHq3f8A== + dependencies: + "@typescript-eslint/types" "4.30.0" + "@typescript-eslint/visitor-keys" "4.30.0" + "@typescript-eslint/types@4.29.3": version "4.29.3" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.29.3.tgz#d7980c49aef643d0af8954c9f14f656b7fd16017" integrity sha512-s1eV1lKNgoIYLAl1JUba8NhULmf+jOmmeFO1G5MN/RBCyyzg4TIOfIOICVNC06lor+Xmy4FypIIhFiJXOknhIg== +"@typescript-eslint/types@4.30.0": + version "4.30.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.30.0.tgz#fb9d9b0358426f18687fba82eb0b0f869780204f" + integrity sha512-YKldqbNU9K4WpTNwBqtAerQKLLW/X2A/j4yw92e3ZJYLx+BpKLeheyzoPfzIXHfM8BXfoleTdiYwpsvVPvHrDw== + "@typescript-eslint/typescript-estree@4.29.3": version "4.29.3" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.3.tgz#1bafad610015c4ded35c85a70b6222faad598b40" @@ -2164,6 +2162,19 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@4.30.0": + version "4.30.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.30.0.tgz#ae57833da72a753f4846cd3053758c771670c2ac" + integrity sha512-6WN7UFYvykr/U0Qgy4kz48iGPWILvYL34xXJxvDQeiRE018B7POspNRVtAZscWntEPZpFCx4hcz/XBT+erenfg== + dependencies: + "@typescript-eslint/types" "4.30.0" + "@typescript-eslint/visitor-keys" "4.30.0" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + "@typescript-eslint/visitor-keys@4.29.3": version "4.29.3" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.3.tgz#c691760a00bd86bf8320d2a90a93d86d322f1abf" @@ -2172,6 +2183,14 @@ "@typescript-eslint/types" "4.29.3" eslint-visitor-keys "^2.0.0" +"@typescript-eslint/visitor-keys@4.30.0": + version "4.30.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.30.0.tgz#a47c6272fc71b0c627d1691f68eaecf4ad71445e" + integrity sha512-pNaaxDt/Ol/+JZwzP7MqWc8PJQTUhZwoee/PVlQ+iYoYhagccvoHnC9e4l+C/krQYYkENxznhVSDwClIbZVxRw== + dependencies: + "@typescript-eslint/types" "4.30.0" + eslint-visitor-keys "^2.0.0" + "@yarnpkg/core@2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@yarnpkg/core/-/core-2.4.0.tgz#b5d8cc7ee2ddb022816c7afa3f83c3ee3d317c80" @@ -2210,9 +2229,9 @@ tunnel "^0.0.6" "@yarnpkg/fslib@^2.4.0", "@yarnpkg/fslib@^2.5.0": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@yarnpkg/fslib/-/fslib-2.5.1.tgz#3e99dccf48790697d52f1b1ac133dce218424521" - integrity sha512-Y360rwoaUBCF8i9nRepyuFQFNF5OybHafO4PQ5Pf68sT3H6ulmT2t/KjdtMey8zyJkDu5qrC3IgHk0c7zWRIrg== + version "2.5.2" + resolved "https://registry.yarnpkg.com/@yarnpkg/fslib/-/fslib-2.5.2.tgz#6dcfbe12fe2d1bce14cb6e4518054abb1dd7c48d" + integrity sha512-Tonb3jXsxsGB+uTlzG6r2zcAUekIG0FfCZV/kM14fPvTE3Z1wC0cMtiD4IUzxSqyhC/zR+T1pLaTPT3xDzSvqg== dependencies: "@yarnpkg/libzip" "^2.2.2" tslib "^1.13.0" @@ -2448,10 +2467,18 @@ archy@*: resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= -are-we-there-yet@^1.1.5, are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -2792,13 +2819,13 @@ browser-process-hrtime@^1.0.0: integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browserslist@^4.16.6: - version "4.16.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0" - integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ== + version "4.17.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.0.tgz#1fcd81ec75b41d6d4994fb0831b92ac18c01649c" + integrity sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g== dependencies: - caniuse-lite "^1.0.30001251" + caniuse-lite "^1.0.30001254" colorette "^1.3.0" - electron-to-chromium "^1.3.811" + electron-to-chromium "^1.3.830" escalade "^3.1.1" node-releases "^1.1.75" @@ -2849,7 +2876,7 @@ bunyan@1.8.15: mv "~2" safe-json-stringify "~1" -cacache@*, cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0: +cacache@*, cacache@15.3.0, cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0: version "15.3.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== @@ -2873,29 +2900,6 @@ cacache@*, cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0: tar "^6.0.2" unique-filename "^1.1.1" -cacache@15.2.0: - version "15.2.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" - integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== - dependencies: - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -2961,10 +2965,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@^1.0.30001251: - version "1.0.30001252" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz#cb16e4e3dafe948fc4a9bb3307aea054b912019a" - integrity sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw== +caniuse-lite@^1.0.30001254: + version "1.0.30001255" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz#f3b09b59ab52e39e751a569523618f47c4298ca0" + integrity sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ== cardinal@^2.1.1: version "2.1.1" @@ -3216,10 +3220,10 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.1.0.tgz#db36e3e66edf24ff591d639862c6ab2c52664362" + integrity sha512-mf45ldcuHSYShkplHHGKWb4TrmwQadxOn7v4WuhDJy0ZVoY5JFajaRDKD0PNe5qXzBX0rhovjTnP6Kz9LETcuA== common-ancestor-path@^1.0.1: version "1.0.1" @@ -3331,20 +3335,25 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-pure@^3.16.0: - version "3.16.4" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.16.4.tgz#8b23122628d88c560f209812b9b2d9ebbce5e29c" - integrity sha512-bY1K3/1Jy9D8Jd12eoeVahNXHLfHFb4TXWI8SQ4y8bImR9qDPmGITBAfmcffTkgUvbJn87r8dILOTWW5kZzkgA== + version "3.17.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.17.2.tgz#ba6311b6aa1e2f2adeba4ac6ec51a9ff40bdc1af" + integrity sha512-2VV7DlIbooyTI7Bh+yzOOWL9tGwLnQKHno7qATE+fqZzDKYr6llVjVQOzpD/QLZFgXDPb8T71pJokHEZHEYJhQ== core-js@^3.6.5: - version "3.16.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.16.4.tgz#0fb1029a554fc2688c0963d7c900e188188a78e0" - integrity sha512-Tq4GVE6XCjE+hcyW6hPy0ofN3hwtLudz5ZRdrlCnsnD/xkm/PWQRudzYHiKgZKUcefV6Q57fhDHjZHJP5dpfSg== + version "3.17.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.17.2.tgz#f960eae710dc62c29cca93d5332e3660e289db10" + integrity sha512-XkbXqhcXeMHPRk2ItS+zQYliAMilea2euoMsnpRRdDad6b2VY6CQQcwz1K8AnWesfw4p165RzY0bTnr3UrbYiA== -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cosmiconfig@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" @@ -3533,9 +3542,9 @@ deep-extend@^0.6.0: integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@4.2.2, deepmerge@^4.2.2: version "4.2.2" @@ -3762,15 +3771,15 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-to-chromium@^1.3.811: - version "1.3.822" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.822.tgz#7036edc7f669b0aa79e9801dc5f56866c6ddc0b2" - integrity sha512-k7jG5oYYHxF4jx6PcqwHX3JVME/OjzolqOZiIogi9xtsfsmTjTdie4x88OakYFPEa8euciTgCCzvVNwvmjHb1Q== +electron-to-chromium@^1.3.830: + version "1.3.830" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.830.tgz#40e3144204f8ca11b2cebec83cf14c20d3499236" + integrity sha512-gBN7wNAxV5vl1430dG+XRcQhD4pIeYeak6p6rjdCtlz5wWNwDad8jwvphe5oi1chL5MV6RNRikfffBBiFuj+rQ== -email-addresses@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-4.0.0.tgz#94fa214c30f943b02eaf91da717d89ff6a19e345" - integrity sha512-Nas3sSSiD5lSIoqBos0FMjB9h4clHxXuAahHKGJ5doRWavEB7pBHzOxnI7R5f1MuGNrrSnsZFJ81HCBv0DZmnw== +email-addresses@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-5.0.0.tgz#7ae9e7f58eef7d5e3e2c2c2d3ea49b78dc854fa6" + integrity sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw== emittery@^0.8.1: version "0.8.1" @@ -4208,7 +4217,7 @@ expect@^24.1.0: jest-message-util "^24.9.0" jest-regex-util "^24.9.0" -expect@^27.0.6, expect@^27.1.0: +expect@^27.1.0: version "27.1.0" resolved "https://registry.yarnpkg.com/expect/-/expect-27.1.0.tgz#380de0abb3a8f2299c4c6c66bbe930483b5dba9b" integrity sha512-9kJngV5hOJgkFil4F/uXm3hVBubUK2nERVfvqNNwxxuW8ZOUwSTTSysgfzckYtv/LBzj/LJXbiAF7okHCXgdug== @@ -5521,7 +5530,7 @@ jest-circus@^27.1.0: stack-utils "^2.0.3" throat "^6.0.1" -jest-cli@^27.0.6: +jest-cli@^27.1.0: version "27.1.0" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.1.0.tgz#118438e4d11cf6fb66cb2b2eb5778817eab3daeb" integrity sha512-h6zPUOUu+6oLDrXz0yOWY2YXvBLk8gQinx4HbZ7SF4V3HzasQf+ncoIbKENUMwXyf54/6dBkYXvXJos+gOHYZw== @@ -5660,7 +5669,7 @@ jest-github-actions-reporter@1.0.3: dependencies: "@actions/core" "^1.2.0" -jest-haste-map@^27.0.6, jest-haste-map@^27.1.0: +jest-haste-map@^27.1.0: version "27.1.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.1.0.tgz#a39f456823bd6a74e3c86ad25f6fa870428326bf" integrity sha512-7mz6LopSe+eA6cTFMf10OfLLqRoIPvmMyz5/OnSXnHO7hB0aDP1iIeLWCXzAcYU5eIJVpHr12Bk9yyq2fTW9vg== @@ -5819,7 +5828,7 @@ jest-resolve-dependencies@^27.1.0: jest-regex-util "^27.0.6" jest-snapshot "^27.1.0" -jest-resolve@^27.0.6, jest-resolve@^27.1.0: +jest-resolve@^27.1.0: version "27.1.0" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.1.0.tgz#bb22303c9e240cccdda28562e3c6fbcc6a23ac86" integrity sha512-TXvzrLyPg0vLOwcWX38ZGYeEztSEmW+cQQKqc4HKDUwun31wsBXwotRlUz4/AYU/Fq4GhbMd/ileIWZEtcdmIA== @@ -5954,7 +5963,7 @@ jest-util@^26.0.0: is-ci "^2.0.0" micromatch "^4.0.2" -jest-util@^27.0.0, jest-util@^27.0.6, jest-util@^27.1.0: +jest-util@^27.0.0, jest-util@^27.1.0: version "27.1.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.1.0.tgz#06a53777a8cb7e4940ca8e20bf9c67dd65d9bd68" integrity sha512-edSLD2OneYDKC6gZM1yc+wY/877s/fuJNoM1k3sOEpzFyeptSmke3SLnk1dDHk9CgTA+58mnfx3ew3J11Kes/w== @@ -5991,7 +6000,7 @@ jest-watcher@^27.1.0: jest-util "^27.1.0" string-length "^4.0.1" -jest-worker@^27.0.6, jest-worker@^27.1.0: +jest-worker@^27.1.0: version "27.1.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.1.0.tgz#65f4a88e37148ed984ba8ca8492d6b376938c0aa" integrity sha512-mO4PHb2QWLn9yRXGp7rkvXLAYuxwhq1ZYUo0LoDhg8wqvv4QizP1ZWEJOeolgbEgAWZLIEU0wsku8J+lGWfBhg== @@ -6000,14 +6009,14 @@ jest-worker@^27.0.6, jest-worker@^27.1.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.0.6.tgz#10517b2a628f0409087fbf473db44777d7a04505" - integrity sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA== +jest@27.1.0: + version "27.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.1.0.tgz#eaab62dfdc02d8b7c814cd27b8d2d92bc46d3d69" + integrity sha512-pSQDVwRSwb109Ss13lcMtdfS9r8/w2Zz8+mTUA9VORD66GflCdl8nUFCqM96geOD2EBwWCNURrNAfQsLIDNBdg== dependencies: - "@jest/core" "^27.0.6" + "@jest/core" "^27.1.0" import-local "^3.0.2" - jest-cli "^27.0.6" + jest-cli "^27.1.0" js-tokens@^4.0.0: version "4.0.0" @@ -6541,17 +6550,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-it@12.0.4: - version "12.0.4" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.4.tgz#eec8247d296327eac3ba9746bdeec9cfcc751e33" - integrity sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q== - dependencies: - argparse "^2.0.1" - entities "~2.1.0" - linkify-it "^3.0.1" - mdurl "^1.0.1" - uc.micro "^1.0.5" - markdown-it@12.2.0: version "12.2.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.2.0.tgz#091f720fd5db206f80de7a8d1f1a7035fd0d38db" @@ -6575,30 +6573,30 @@ markdownlint-cli2-formatter-default@^0.0.2: resolved "https://registry.yarnpkg.com/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.2.tgz#76f1a064d70966178dfe3bb489af9423d830ca79" integrity sha512-jIz1X3SIC8sX4NDFqQFUXL+JEtfnDoN4i+xocEu+etcxGX455pHb6sx86f/yVk4mKJ2o7aNe2ydSx9an22BfBg== -markdownlint-cli2@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/markdownlint-cli2/-/markdownlint-cli2-0.2.0.tgz#cecbd8a85ab21b070668e57c3aaa7f6f3056e2fc" - integrity sha512-/MIaG2MOlm39SBApQbeHK847/bgX6FfUPZMpCzA2UMYXR8NTwzTdjQAXjjLBK6+zG52GWKyhdmBKobkhLnq8wQ== +markdownlint-cli2@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/markdownlint-cli2/-/markdownlint-cli2-0.3.0.tgz#415407003021b48343a63bd177ed76f4aedc064b" + integrity sha512-0nmB8MMqxwTolfkOaGW9RLqkBVG6DW6oBTyDKd3SP+7e8FPhihg6KBqpz1puj37C2Wd3POS98xiE1GljEVNyHw== dependencies: globby "~11.0.4" - markdownlint "~0.23.1" + markdownlint "~0.24.0" markdownlint-cli2-formatter-default "^0.0.2" - markdownlint-rule-helpers "~0.14.0" + markdownlint-rule-helpers "~0.15.0" micromatch "~4.0.4" strip-json-comments "~3.1.1" yaml "~1.10.2" -markdownlint-rule-helpers@~0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.14.0.tgz#4d0e1ae320e85559d8cbed1490934855791627bb" - integrity sha512-vRTPqSU4JK8vVXmjICHSBhwXUvbfh/VJo+j7hvxqe15tLJyomv3FLgFdFgb8kpj0Fe8SsJa/TZUAXv7/sN+N7A== +markdownlint-rule-helpers@~0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.15.0.tgz#11434c573649b9235ae70b967314f5711f7d8fa8" + integrity sha512-A+9mswc3m/kkqpJCqntmte/1VKhDJ+tjZsERLz5L4h/Qr7ht2/BkGkgY5E7/wsxIhcpl+ctIfz+oS3PQrMOB2w== -markdownlint@~0.23.1: - version "0.23.1" - resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.23.1.tgz#98292b5d340d01e9c113f3d7fb3b2ccf89628dc2" - integrity sha512-iOEwhDfNmq2IJlaA8mzEkHYUi/Hwoa6Ss+HO5jkwUR6wQ4quFr0WzSx+Z9rsWZKUaPbyirIdL1zGmJRkWawr4Q== +markdownlint@~0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.24.0.tgz#224b53f671367a237d40c8be1745c7be9a322671" + integrity sha512-OJIGsGFV/rC9irI5E1FMy6v9hdACSwaa+EN3224Y5KG8zj2EYzdHOw0pOJovIYmjNfEZ9BtxUY4P7uYHTSNnbQ== dependencies: - markdown-it "12.0.4" + markdown-it "12.2.0" marked-terminal@^4.1.1: version "4.1.1" @@ -6828,9 +6826,9 @@ minipass-collect@^1.0.2: minipass "^3.0.0" minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: - version "1.3.4" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.3.4.tgz#63f5af868a38746ca7b33b03393ddf8c291244fe" - integrity sha512-TielGogIzbUEtd1LsjZFs47RWuHHfhl6TiCx1InVxApBAmQ8bL0dL5ilkLGcRvuyW/A9nE+Lvn855Ewz8S0PnQ== + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== dependencies: minipass "^3.1.0" minipass-sized "^1.0.3" @@ -7257,9 +7255,9 @@ npm-user-validate@*: integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw== npm@^7.0.0: - version "7.21.1" - resolved "https://registry.yarnpkg.com/npm/-/npm-7.21.1.tgz#2ab886fc8b5eb044ca5b4e2f7570340fad9934eb" - integrity sha512-k7XQNHGHAp0VowMMUMRMtntxWatNad9hhYrelUKDPvZ++DBxvofA8QTNPiuMKtx8CBOFA8iJ4aizhbx6ZYVfzQ== + version "7.22.0" + resolved "https://registry.yarnpkg.com/npm/-/npm-7.22.0.tgz#11db1860c68c569eb2e3f4d4e97934b005b585bc" + integrity sha512-HJnjTCrGGnacPMCSnrxuHGf2H4VdrY7hwTAK1RwByg0K96KIuTR4QNioFW+bnc/pW0uwpk9lLsDf4BeEQhTv2Q== dependencies: "@npmcli/arborist" "*" "@npmcli/ci-detect" "*" @@ -7331,11 +7329,11 @@ npm@^7.0.0: write-file-atomic "*" npmlog@*: - version "5.0.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.0.tgz#e6a41b556e9b34cb29ea132294676c07acb30efb" - integrity sha512-ftpIiLjerL2tUg3dCqN8pOSoB90gqZlzv/gaZoxHaKjeLClrfJIEQ1Pdxi6qSzflz916Bljdy8dTWQ4J7hAFSQ== + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== dependencies: - are-we-there-yet "^1.1.5" + are-we-there-yet "^2.0.0" console-control-strings "^1.1.0" gauge "^3.0.0" set-blocking "^2.0.0" @@ -8093,9 +8091,9 @@ read-package-json-fast@*, read-package-json-fast@^2.0.1, read-package-json-fast@ npm-normalize-package-bin "^1.0.1" read-package-json@*, read-package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.0.1.tgz#da88a38c410344fecb7d840d35f27635e848ea54" - integrity sha512-czqCcYfkEl6sIFJVOND/5/Goseu7cVw1rcDUATq6ED0jLGjMm9/HOPmFmEZMvRu9yl272YERaMUcOlvcNU9InQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.1.tgz#153be72fce801578c1c86b8ef2b21188df1b9eea" + integrity sha512-P82sbZJ3ldDrWCOSKxJT0r/CXMWR0OR3KRh55SgKo3p91GSIEEC32v3lSHAvO/UcH3/IoL7uqhOFBduAnwdldw== dependencies: glob "^7.1.1" json-parse-even-better-errors "^2.3.0" @@ -8145,7 +8143,7 @@ read@*, read@1, read@^1.0.7, read@~1.0.1: dependencies: mute-stream "~0.0.4" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -8463,10 +8461,10 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -semantic-release@17.4.6: - version "17.4.6" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-17.4.6.tgz#a9e53da3d43ac07250c55b6939857587be2ecaa2" - integrity sha512-0B1OGkW8gzQjLbj3H5G4fJyy73HAWsoDnzWYyfNJHyyyLi1acQd+id4O7U+12wXTk9G83pXCgSFj9oYTvocFMA== +semantic-release@17.4.7: + version "17.4.7" + resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-17.4.7.tgz#88e1dce7294cc43acc54c4e0a83f582264567206" + integrity sha512-3Ghu8mKCJgCG3QzE5xphkYWM19lGE3XjFdOXQIKBM2PBpBvgFQ/lXv31oX0+fuN/UjNFO/dqhNs8ATLBhg6zBg== dependencies: "@semantic-release/commit-analyzer" "^8.0.0" "@semantic-release/error" "^2.2.0" @@ -8638,10 +8636,10 @@ signale@^1.2.1: figures "^2.0.0" pkg-conf "^2.1.0" -simple-git@2.44.0: - version "2.44.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-2.44.0.tgz#94eca4162b7e21707b5a1a40b22e6f29b007d3a8" - integrity sha512-wIjcAmymhzgdaM0Y/a+XxmNGlivvHQTPZDYXVmyHMShVDwdeVqu3+OOyDbYu0DnfVzqLs2EOxRTgMNbC3YquwQ== +simple-git@2.45.0: + version "2.45.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-2.45.0.tgz#4d53b146fc23496099ebfc7af5b0d605d0e3e504" + integrity sha512-wu/Ujs9IXn0HuyYm4HyRvne+EKsjJSWKEMkB3wQa3gNHSMHt7y3oeNX9zRQ3UBPk7bRRMLLHAdIZCZfHT9ehPg== dependencies: "@kwsites/file-exists" "^1.1.1" "@kwsites/promise-deferred" "^1.1.1" @@ -9471,9 +9469,9 @@ type-fest@^0.8.0, type-fest@^0.8.1: integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== typed-rest-client@^1.8.4: - version "1.8.5" - resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.8.5.tgz#3d331f2761c2be0103bda71a7d19ab08533f3b5a" - integrity sha512-952/Aegu3lTqUAI1anbDLbewojnF/gh8at9iy1CIrfS1h/+MtNjB1Y9z6ZF5n2kZd+97em56lZ9uu7Zz3y/pwg== + version "1.8.6" + resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.8.6.tgz#d8facd6abd98cbd8ad14cccf056ca5cc306919d7" + integrity sha512-xcQpTEAJw2DP7GqVNECh4dD+riS+C1qndXLfBCJ3xk0kqprtGN491P5KlmrDbKdtuW8NEcP/5ChxiJI3S9WYTA== dependencies: qs "^6.9.1" tunnel "0.0.6" @@ -9486,10 +9484,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@4.3.5: - version "4.3.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" - integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== +typescript@4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.2.tgz#6d618640d430e3569a1dfb44f7d7e600ced3ee86" + integrity sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6"