diff --git a/package.json b/package.json index 4e17c155..c575b43f 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,8 @@ "@octokit/plugin-retry": "^3.0.9", "@octokit/request-error": "^6.1.7", "@octokit/rest": "^18.10.0", - "@sentry/node": "4.6.3", - "@sentry/typescript": "^5.17.0", + "@sentry/node": "^10.27.0", + "@sentry/typescript": "^5.20.1", "@types/async": "^3.0.1", "@types/aws4": "^1.5.1", "@types/cli-table": "^0.3.0", diff --git a/src/artifact_providers/__tests__/github.test.ts b/src/artifact_providers/__tests__/github.test.ts index fa441eda..8e6bd849 100644 --- a/src/artifact_providers/__tests__/github.test.ts +++ b/src/artifact_providers/__tests__/github.test.ts @@ -1,13 +1,21 @@ jest.mock('../../utils/githubApi.ts'); -import { getGitHubClient} from '../../utils/githubApi'; -import { GitHubArtifactProvider, ArtifactItem, lazyRequest, lazyRequestCallback} from '../github'; +import { getGitHubClient } from '../../utils/githubApi'; +import { + GitHubArtifactProvider, + ArtifactItem, + lazyRequest, + lazyRequestCallback, +} from '../github'; import { sleep } from '../../utils/async'; class TestGitHubArtifactProvider extends GitHubArtifactProvider { public testGetRevisionArtifact(revision: string): Promise { return this.getRevisionArtifact(revision); } - public testSearchForRevisionArtifact(revision: string, getRevisionDate: lazyRequestCallback): Promise { + public testSearchForRevisionArtifact( + revision: string, + getRevisionDate: lazyRequestCallback + ): Promise { return this.searchForRevisionArtifact(revision, getRevisionDate); } } @@ -18,11 +26,11 @@ describe('GitHub Artifact Provider', () => { let githubArtifactProvider: TestGitHubArtifactProvider; let mockClient: { actions: { - listArtifactsForRepo: jest.Mock, - }, + listArtifactsForRepo: jest.Mock; + }; git: { - getCommit: jest.Mock, - }, + getCommit: jest.Mock; + }; }; let mockedSleep; @@ -46,7 +54,7 @@ describe('GitHub Artifact Provider', () => { mockedSleep = sleep as jest.Mock; mockedSleep.mockImplementation(() => { - return new Promise((resolve) => setTimeout(resolve, 10)); + return new Promise(resolve => setTimeout(resolve, 10)); }); }); @@ -89,6 +97,7 @@ describe('GitHub Artifact Provider', () => { }, }); await expect( + // TODO(sentry): Could not automatically migrate - see https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md#deprecate-hub githubArtifactProvider.testGetRevisionArtifact( '1b843f2cbb20fdda99ef749e29e75e43e6e43b38' ) @@ -113,55 +122,58 @@ describe('GitHub Artifact Provider', () => { status: 200, data: { committer: { - date: "2021-05-12T21:45:04Z", + date: '2021-05-12T21:45:04Z', }, }, - }) - mockClient.actions.listArtifactsForRepo.mockResolvedValueOnce({ - status: 200, - data: { - // NOTE: 101 here will force pagination to be handled. - total_count: 101, - artifacts: [ - { - id: 60232691, - node_id: 'MDg6QXJ0aWZhY3Q2MDIzMjY5MQ==', - name: 'e4bcfe450e0460ec5f20b20868664171effef6f9', - size_in_bytes: 6511029, - url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691', - archive_download_url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691/zip', - expired: false, - created_at: '2021-05-12T21:45:04Z', - updated_at: '2021-05-12T21:45:07Z', - expires_at: '2021-08-10T21:45:00Z', - }, - ], - }, - }).mockResolvedValueOnce({ - status: 200, - data: { - total_count: 101, - artifacts: [ - { - id: 60233710, - node_id: 'MDg6QXJ0aWZhY3Q2MDIzMzcxMA==', - name: '1b843f2cbb20fdda99ef749e29e75e43e6e43b38', - size_in_bytes: 6511029, - url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60233710', - archive_download_url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60233710/zip', - expired: false, - created_at: '2021-05-12T21:50:35Z', - updated_at: '2021-05-12T21:50:38Z', - expires_at: '2021-08-10T21:50:31Z', - }, - ], - }, }); + mockClient.actions.listArtifactsForRepo + .mockResolvedValueOnce({ + status: 200, + data: { + // NOTE: 101 here will force pagination to be handled. + total_count: 101, + artifacts: [ + { + id: 60232691, + node_id: 'MDg6QXJ0aWZhY3Q2MDIzMjY5MQ==', + name: 'e4bcfe450e0460ec5f20b20868664171effef6f9', + size_in_bytes: 6511029, + url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691', + archive_download_url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691/zip', + expired: false, + created_at: '2021-05-12T21:45:04Z', + updated_at: '2021-05-12T21:45:07Z', + expires_at: '2021-08-10T21:45:00Z', + }, + ], + }, + }) + .mockResolvedValueOnce({ + status: 200, + data: { + total_count: 101, + artifacts: [ + { + id: 60233710, + node_id: 'MDg6QXJ0aWZhY3Q2MDIzMzcxMA==', + name: '1b843f2cbb20fdda99ef749e29e75e43e6e43b38', + size_in_bytes: 6511029, + url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60233710', + archive_download_url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60233710/zip', + expired: false, + created_at: '2021-05-12T21:50:35Z', + updated_at: '2021-05-12T21:50:38Z', + expires_at: '2021-08-10T21:50:31Z', + }, + ], + }, + }); await expect( + // TODO(sentry): Could not automatically migrate - see https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md#deprecate-hub githubArtifactProvider.testGetRevisionArtifact( '1b843f2cbb20fdda99ef749e29e75e43e6e43b38' ) @@ -220,6 +232,7 @@ describe('GitHub Artifact Provider', () => { }, }); await expect( + // TODO(sentry): Could not automatically migrate - see https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md#deprecate-hub githubArtifactProvider.testGetRevisionArtifact( '1b843f2cbb20fdda99ef749e29e75e43e6e43b38' ) @@ -249,6 +262,7 @@ describe('GitHub Artifact Provider', () => { }); await expect( + // TODO(sentry): Could not automatically migrate - see https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md#deprecate-hub githubArtifactProvider.testGetRevisionArtifact( '1b843f2cbb20fdda99ef749e29e75e43e6e43b38' ) @@ -298,6 +312,7 @@ describe('GitHub Artifact Provider', () => { }, }); await expect( + // TODO(sentry): Could not automatically migrate - see https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md#deprecate-hub githubArtifactProvider.testGetRevisionArtifact( '3c2e87573d3bd16f61cf08fece0638cc47a4fc22' ) @@ -310,54 +325,59 @@ describe('GitHub Artifact Provider', () => { describe('searchForRevisionArtifact', () => { test('it should get the artifact from second page', async () => { - mockClient.actions.listArtifactsForRepo.mockResolvedValueOnce({ - status: 200, - data: { - // NOTE: 101 here will force pagination to be handled. - total_count: 101, - artifacts: [ - { - id: 60232691, - node_id: 'MDg6QXJ0aWZhY3Q2MDIzMjY5MQ==', - name: 'e4bcfe450e0460ec5f20b20868664171effef6f9', - size_in_bytes: 6511029, - url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691', - archive_download_url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691/zip', - expired: false, - created_at: '2021-05-12T21:45:04Z', - updated_at: '2021-05-12T21:45:07Z', - expires_at: '2021-08-10T21:45:00Z', - }, - ], - }, - }).mockResolvedValueOnce({ - status: 200, - data: { - total_count: 101, - artifacts: [ - { - id: 60233710, - node_id: 'MDg6QXJ0aWZhY3Q2MDIzMzcxMA==', - name: '1b843f2cbb20fdda99ef749e29e75e43e6e43b38', - size_in_bytes: 6511029, - url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60233710', - archive_download_url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60233710/zip', - expired: false, - created_at: '2021-05-12T21:50:35Z', - updated_at: '2021-05-12T21:50:38Z', - expires_at: '2021-08-10T21:50:31Z', - }, - ], - }, - }); + mockClient.actions.listArtifactsForRepo + .mockResolvedValueOnce({ + status: 200, + data: { + // NOTE: 101 here will force pagination to be handled. + total_count: 101, + artifacts: [ + { + id: 60232691, + node_id: 'MDg6QXJ0aWZhY3Q2MDIzMjY5MQ==', + name: 'e4bcfe450e0460ec5f20b20868664171effef6f9', + size_in_bytes: 6511029, + url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691', + archive_download_url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691/zip', + expired: false, + created_at: '2021-05-12T21:45:04Z', + updated_at: '2021-05-12T21:45:07Z', + expires_at: '2021-08-10T21:45:00Z', + }, + ], + }, + }) + .mockResolvedValueOnce({ + status: 200, + data: { + total_count: 101, + artifacts: [ + { + id: 60233710, + node_id: 'MDg6QXJ0aWZhY3Q2MDIzMzcxMA==', + name: '1b843f2cbb20fdda99ef749e29e75e43e6e43b38', + size_in_bytes: 6511029, + url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60233710', + archive_download_url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60233710/zip', + expired: false, + created_at: '2021-05-12T21:50:35Z', + updated_at: '2021-05-12T21:50:38Z', + expires_at: '2021-08-10T21:50:31Z', + }, + ], + }, + }); - const getRevisionDateCallback = jest.fn().mockResolvedValueOnce("2020-05-12T21:45:04Z"); + const getRevisionDateCallback = jest + .fn() + .mockResolvedValueOnce('2020-05-12T21:45:04Z'); await expect( + // TODO(sentry): Could not automatically migrate - see https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md#deprecate-hub githubArtifactProvider.testSearchForRevisionArtifact( '1b843f2cbb20fdda99ef749e29e75e43e6e43b38', lazyRequest(() => { @@ -383,75 +403,81 @@ describe('GitHub Artifact Provider', () => { }); test('it should return null if all pages are processed', async () => { - mockClient.actions.listArtifactsForRepo.mockResolvedValueOnce({ - status: 200, - data: { - // NOTE: 201 here will force pagination to be handled. - total_count: 201, - artifacts: [ - { - id: 60232691, - node_id: 'MDg6QXJ0aWZhY3Q2MDIzMjY5MQ==', - name: 'e4bcfe450e0460ec5f20b20868664171effef6f9', - size_in_bytes: 6511029, - url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691', - archive_download_url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691/zip', - expired: false, - created_at: '2021-05-12T21:45:04Z', - updated_at: '2021-05-12T21:45:07Z', - expires_at: '2021-08-10T21:45:00Z', - }, - ], - }, - }).mockResolvedValueOnce({ - status: 200, - data: { - total_count: 201, - artifacts: [ - { - id: 60232691, - node_id: 'MDg6QXJ0aWZhY3Q2MDIzMjY5MQ==', - name: 'e4bcfe450e0460ec5f20b20868664171effef6f9', - size_in_bytes: 6511029, - url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691', - archive_download_url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691/zip', - expired: false, - created_at: '2021-05-12T21:45:04Z', - updated_at: '2021-05-12T21:45:07Z', - expires_at: '2021-08-10T21:45:00Z', - }, - ], - }, - }).mockResolvedValueOnce({ - status: 200, - data: { - total_count: 201, - artifacts: [ - { - id: 60232691, - node_id: 'MDg6QXJ0aWZhY3Q2MDIzMjY5MQ==', - name: 'e4bcfe450e0460ec5f20b20868664171effef6f9', - size_in_bytes: 6511029, - url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691', - archive_download_url: - 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691/zip', - expired: false, - created_at: '2021-05-12T21:45:04Z', - updated_at: '2021-05-12T21:45:07Z', - expires_at: '2021-08-10T21:45:00Z', - }, - ], - }, - }); + mockClient.actions.listArtifactsForRepo + .mockResolvedValueOnce({ + status: 200, + data: { + // NOTE: 201 here will force pagination to be handled. + total_count: 201, + artifacts: [ + { + id: 60232691, + node_id: 'MDg6QXJ0aWZhY3Q2MDIzMjY5MQ==', + name: 'e4bcfe450e0460ec5f20b20868664171effef6f9', + size_in_bytes: 6511029, + url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691', + archive_download_url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691/zip', + expired: false, + created_at: '2021-05-12T21:45:04Z', + updated_at: '2021-05-12T21:45:07Z', + expires_at: '2021-08-10T21:45:00Z', + }, + ], + }, + }) + .mockResolvedValueOnce({ + status: 200, + data: { + total_count: 201, + artifacts: [ + { + id: 60232691, + node_id: 'MDg6QXJ0aWZhY3Q2MDIzMjY5MQ==', + name: 'e4bcfe450e0460ec5f20b20868664171effef6f9', + size_in_bytes: 6511029, + url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691', + archive_download_url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691/zip', + expired: false, + created_at: '2021-05-12T21:45:04Z', + updated_at: '2021-05-12T21:45:07Z', + expires_at: '2021-08-10T21:45:00Z', + }, + ], + }, + }) + .mockResolvedValueOnce({ + status: 200, + data: { + total_count: 201, + artifacts: [ + { + id: 60232691, + node_id: 'MDg6QXJ0aWZhY3Q2MDIzMjY5MQ==', + name: 'e4bcfe450e0460ec5f20b20868664171effef6f9', + size_in_bytes: 6511029, + url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691', + archive_download_url: + 'https://api.github.com/repos/getsentry/craft/actions/artifacts/60232691/zip', + expired: false, + created_at: '2021-05-12T21:45:04Z', + updated_at: '2021-05-12T21:45:07Z', + expires_at: '2021-08-10T21:45:00Z', + }, + ], + }, + }); - const getRevisionDateCallback = jest.fn().mockResolvedValueOnce("2020-05-12T21:45:04Z"); + const getRevisionDateCallback = jest + .fn() + .mockResolvedValueOnce('2020-05-12T21:45:04Z'); await expect( + // TODO(sentry): Could not automatically migrate - see https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md#deprecate-hub githubArtifactProvider.testSearchForRevisionArtifact( '1b843f2cbb20fdda99ef749e29e75e43e6e43b38', lazyRequest(getRevisionDateCallback) @@ -486,9 +512,12 @@ describe('GitHub Artifact Provider', () => { }, }); - const getRevisionDateCallback = jest.fn().mockResolvedValueOnce( "2021-05-12T21:45:04Z"); + const getRevisionDateCallback = jest + .fn() + .mockResolvedValueOnce('2021-05-12T21:45:04Z'); await expect( + // TODO(sentry): Could not automatically migrate - see https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md#deprecate-hub githubArtifactProvider.testSearchForRevisionArtifact( '1b843f2cbb20fdda99ef749e29e75e43e6e43b38', lazyRequest(() => { diff --git a/src/artifact_providers/github.ts b/src/artifact_providers/github.ts index 6765ab55..bfb33d18 100644 --- a/src/artifact_providers/github.ts +++ b/src/artifact_providers/github.ts @@ -8,7 +8,7 @@ import { BaseArtifactProvider, RemoteArtifact, } from '../artifact_providers/base'; -import { getGitHubClient} from '../utils/githubApi'; +import { getGitHubClient } from '../utils/githubApi'; import { detectContentType, scan, @@ -58,7 +58,10 @@ export class GitHubArtifactProvider extends BaseArtifactProvider { * @param revision * @returns The artifact or null. */ - protected async searchForRevisionArtifact(revision: string, getRevisionDate: lazyRequestCallback): Promise { + protected async searchForRevisionArtifact( + revision: string, + getRevisionDate: lazyRequestCallback + ): Promise { const { repoName: repo, repoOwner: owner } = this.config; const per_page = 100; @@ -119,25 +122,30 @@ export class GitHubArtifactProvider extends BaseArtifactProvider { * @param revision * @returns The artifact for the given revision or throws an error */ - protected async getRevisionArtifact( - revision: string - ): Promise { + protected async getRevisionArtifact(revision: string): Promise { const { repoName: repo, repoOwner: owner } = this.config; let artifact; const getRevisionDate = lazyRequest(async () => { - return (await this.github.git.getCommit({ - owner, - repo, - commit_sha: revision, - })).data.committer.date; - }) + return ( + await this.github.git.getCommit({ + owner, + repo, + commit_sha: revision, + }) + ).data.committer.date; + }); for (let tries = 0; tries < MAX_TRIES; tries++) { this.logger.info( - `Fetching GitHub artifacts for ${owner}/${repo}, revision ${revision} (attempt ${tries + 1} of ${MAX_TRIES})` + `Fetching GitHub artifacts for ${owner}/${repo}, revision ${revision} (attempt ${ + tries + 1 + } of ${MAX_TRIES})` ); - artifact = await this.searchForRevisionArtifact(revision, getRevisionDate); + artifact = await this.searchForRevisionArtifact( + revision, + getRevisionDate + ); if (artifact) { return artifact; } @@ -146,7 +154,11 @@ export class GitHubArtifactProvider extends BaseArtifactProvider { // and the GitHub API having the info to return. // Wait before retries to give GitHub a chance to propagate changes. if (tries + 1 < MAX_TRIES) { - this.logger.info(`Waiting ${ARTIFACTS_POLLING_INTERVAL / MILLISECONDS} seconds for artifacts to become available via GitHub API...`); + this.logger.info( + `Waiting ${ + ARTIFACTS_POLLING_INTERVAL / MILLISECONDS + } seconds for artifacts to become available via GitHub API...` + ); await sleep(ARTIFACTS_POLLING_INTERVAL); } } @@ -236,14 +248,16 @@ export class GitHubArtifactProvider extends BaseArtifactProvider { } } -export function lazyRequest(cb: lazyRequestCallback): lazyRequestCallback { +export function lazyRequest( + cb: lazyRequestCallback +): lazyRequestCallback { let data: T; return async () => { if (!data) { data = await cb(); } return data; - } + }; } export interface lazyRequestCallback { diff --git a/src/commands/__tests__/prepare.test.ts b/src/commands/__tests__/prepare.test.ts index 23a4d22c..e5baaad1 100644 --- a/src/commands/__tests__/prepare.test.ts +++ b/src/commands/__tests__/prepare.test.ts @@ -56,32 +56,42 @@ describe('runPreReleaseCommand', () => { describe('checkVersionOrPart', () => { test('return true for valid version', () => { - const validVersions = [ - '2.3.3', - '0.0.1', - ]; + const validVersions = ['2.3.3', '0.0.1']; for (const v of validVersions) { expect( - checkVersionOrPart({ - newVersion: v, - }, null) + checkVersionOrPart( + { + newVersion: v, + }, + null + ) ).toBe(true); } }); test('throw an error for invalid version', () => { const invalidVersions = [ - { v: 'invalid-2.3.3', e: 'Invalid version or version part specified: "invalid-2.3.3"' }, - { v: 'v2.3.3', e: 'Invalid version or version part specified: "v2.3.3". Removing the "v" prefix will likely fix the issue' }, + { + v: 'invalid-2.3.3', + e: 'Invalid version or version part specified: "invalid-2.3.3"', + }, + { + v: 'v2.3.3', + e: + 'Invalid version or version part specified: "v2.3.3". Removing the "v" prefix will likely fix the issue', + }, { v: 'major', e: 'Version part is not supported yet' }, { v: 'minor', e: 'Version part is not supported yet' }, { v: 'patch', e: 'Version part is not supported yet' }, ]; for (const t of invalidVersions) { const fn = () => { - checkVersionOrPart({ - newVersion: t.v, - }, null); + checkVersionOrPart( + { + newVersion: t.v, + }, + null + ); }; expect(fn).toThrow(t.e); } diff --git a/src/logger.ts b/src/logger.ts index 1e01c7c0..5d7bb5de 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -1,4 +1,4 @@ -import { addBreadcrumb, Severity } from '@sentry/node'; +import { addBreadcrumb, SeverityLevel } from '@sentry/node'; import Table from 'cli-table'; import consola, { BasicReporter, @@ -27,7 +27,7 @@ class SentryBreadcrumbReporter extends BasicReporter { public log(logObj: ConsolaReporterLogObject) { const breadcrumb = { message: this.formatLogObj(logObj), - level: logObj.type as Severity, + level: logObj.type as SeverityLevel, }; addBreadcrumb(breadcrumb); } diff --git a/src/targets/__tests__/maven.test.ts b/src/targets/__tests__/maven.test.ts index e1dce99a..2c36fc1d 100644 --- a/src/targets/__tests__/maven.test.ts +++ b/src/targets/__tests__/maven.test.ts @@ -77,7 +77,7 @@ function getFullTargetConfig(): any { rootDistDirRegex: '/root-distDir/', appleDistDirRegex: '/apple-distDir/', klibDistDirRegex: '/klib-distDir/', - }, + }, }; } @@ -106,9 +106,7 @@ function createMavenTarget( return new MavenTarget(mergedConfig, new NoneArtifactProvider()); } -function getRepositoryInfo( - state: NexusRepository['state'], -): NexusRepository { +function getRepositoryInfo(state: NexusRepository['state']): NexusRepository { return { state, repositoryId: 'sentry-java', @@ -308,9 +306,7 @@ describe('transform KMP artifacts', () => { const files: Record = { javadocFile: `${tmpDirName}-javadoc.jar`, sourcesFile: `${tmpDirName}-sources.jar`, - klibFiles: [ - `${tmpDirName}.klib`, - ], + klibFiles: [`${tmpDirName}.klib`], allFile: '', metadataFile: ``, moduleFile: `${tmpDirName}.module`, @@ -323,9 +319,7 @@ describe('transform KMP artifacts', () => { expect(sideArtifacts).toEqual( `${files.javadocFile},${files.sourcesFile},${files.klibFiles},${files.moduleFile}` ); - expect(classifiers).toEqual( - 'javadoc,sources,,' - ); + expect(classifiers).toEqual('javadoc,sources,,'); expect(types).toEqual('jar,jar,klib,module'); }); @@ -412,7 +406,9 @@ describe('upload', () => { .fn() .mockResolvedValueOnce('artifact/download/path'); mvnTarget.isBomFile = jest.fn().mockResolvedValueOnce(false); - mvnTarget.getPomFileInDist = jest.fn().mockResolvedValueOnce('pom-default.xml'); + mvnTarget.getPomFileInDist = jest + .fn() + .mockResolvedValueOnce('pom-default.xml'); await mvnTarget.upload('r3v1s10n'); @@ -462,7 +458,9 @@ describe('upload', () => { .fn() .mockResolvedValueOnce('artifact/download/path'); mvnTarget.isBomFile = jest.fn().mockResolvedValueOnce(false); - mvnTarget.getPomFileInDist = jest.fn().mockResolvedValueOnce('pom-default.xml'); + mvnTarget.getPomFileInDist = jest + .fn() + .mockResolvedValueOnce('pom-default.xml'); mvnTarget.fileExists = jest.fn().mockResolvedValue(true); await mvnTarget.upload('r3v1s10n'); @@ -576,18 +574,20 @@ describe('upload', () => { ); // Override fs.promises.readdir for this test to return klib files - const readdirSpy = jest.spyOn(fs.promises, 'readdir').mockImplementation((dirPath: any) => { - if (dirPath.toString().includes(klibDistDirName)) { - return Promise.resolve([ - `${klibDistDirName}-javadoc.jar`, - `${klibDistDirName}.klib`, - `${klibDistDirName}-sources.jar`, - `${klibDistDirName}.module`, - POM_DEFAULT_FILENAME, - ] as any); - } - return Promise.resolve([] as any); - }); + const readdirSpy = jest + .spyOn(fs.promises, 'readdir') + .mockImplementation((dirPath: any) => { + if (dirPath.toString().includes(klibDistDirName)) { + return Promise.resolve([ + `${klibDistDirName}-javadoc.jar`, + `${klibDistDirName}.klib`, + `${klibDistDirName}-sources.jar`, + `${klibDistDirName}.module`, + POM_DEFAULT_FILENAME, + ] as any); + } + return Promise.resolve([] as any); + }); const mvnTarget = createMavenTarget(getFullTargetConfig()); mvnTarget.getArtifactsForRevision = jest @@ -597,7 +597,9 @@ describe('upload', () => { .fn() .mockResolvedValueOnce('artifact/download/path'); mvnTarget.isBomFile = jest.fn().mockResolvedValueOnce(false); - mvnTarget.getPomFileInDist = jest.fn().mockResolvedValueOnce('pom-default.xml'); + mvnTarget.getPomFileInDist = jest + .fn() + .mockResolvedValueOnce('pom-default.xml'); mvnTarget.fileExists = jest.fn().mockResolvedValue(true); await mvnTarget.upload('r3v1s10n'); @@ -613,7 +615,9 @@ describe('upload', () => { const cmdArgs = callArgs[1] as string[]; expect(cmdArgs).toHaveLength(11); expect(cmdArgs[0]).toBe('gpg:sign-and-deploy-file'); - expect(cmdArgs[1]).toMatch(new RegExp(`-Dfile=${klibDistDir}/${klibDistDirName}`)); + expect(cmdArgs[1]).toMatch( + new RegExp(`-Dfile=${klibDistDir}/${klibDistDirName}`) + ); expect(cmdArgs[2]).toBe( `-Dfiles=${klibDistDir}/${klibDistDirName}-javadoc.jar,${klibDistDir}/${klibDistDirName}-sources.jar,${klibDistDir}/${klibDistDirName}.klib,${klibDistDir}/${klibDistDirName}.module` ); @@ -692,7 +696,9 @@ describe('getRepository', () => { nock(url.origin) .get('/manual/search/repositories') .reply(200, { - repositories: [{key: 'sentry-java', state: 'open', portal_deployment_id: '1234'}], + repositories: [ + { key: 'sentry-java', state: 'open', portal_deployment_id: '1234' }, + ], }); const mvnTarget = createMavenTarget(); @@ -744,7 +750,11 @@ describe('closeRepository', () => { test('should return true if server responds correctly', async () => { nock(url.origin) .post('/service/local/staging/bulk/close', { - data: { stagedRepositoryIds: [repositoryId], description: '', autoDropAfterRelease: true }, + data: { + stagedRepositoryIds: [repositoryId], + description: '', + autoDropAfterRelease: true, + }, }) .reply(200); @@ -759,7 +769,11 @@ describe('closeRepository', () => { test('should throw if server doesnt accept the request', async () => { nock(url.origin) .post('/service/local/staging/bulk/close', { - data: { stagedRepositoryIds: [repositoryId], description: '', autoDropAfterRelease: true }, + data: { + stagedRepositoryIds: [repositoryId], + description: '', + autoDropAfterRelease: true, + }, }) .reply(500); @@ -774,19 +788,19 @@ describe('closeRepository', () => { test('should wait for the status of repository to be changed', async () => { nock(url.origin) .post('/service/local/staging/bulk/close', { - data: { stagedRepositoryIds: [repositoryId], description: '', autoDropAfterRelease: true }, + data: { + stagedRepositoryIds: [repositoryId], + description: '', + autoDropAfterRelease: true, + }, }) .reply(200); const mvnTarget = createMavenTarget(); mvnTarget.getRepository = jest .fn() - .mockImplementationOnce(() => - Promise.resolve(getRepositoryInfo('open')) - ) - .mockImplementationOnce(() => - Promise.resolve(getRepositoryInfo('open')) - ) + .mockImplementationOnce(() => Promise.resolve(getRepositoryInfo('open'))) + .mockImplementationOnce(() => Promise.resolve(getRepositoryInfo('open'))) .mockImplementationOnce(() => Promise.resolve(getRepositoryInfo('closed')) ); @@ -799,7 +813,11 @@ describe('closeRepository', () => { test('should throw when status change deadline is reached', async () => { nock(url.origin) .post('/service/local/staging/bulk/close', { - data: { stagedRepositoryIds: [repositoryId], description: '', autoDropAfterRelease: true }, + data: { + stagedRepositoryIds: [repositoryId], + description: '', + autoDropAfterRelease: true, + }, }) .reply(200); @@ -833,14 +851,18 @@ describe('releaseRepository', () => { test('should return true if server responds correctly', async () => { nock(url.origin) .post('/service/local/staging/bulk/promote', { - data: { stagedRepositoryIds: [repositoryId], description: '', autoDropAfterRelease: true }, + data: { + stagedRepositoryIds: [repositoryId], + description: '', + autoDropAfterRelease: true, + }, }) .reply(200); nock(centralUrl.origin) .post(`${centralUrl.pathname}/publisher/status?id=${deploymentId}`) .reply(200, { - deploymentState: 'PUBLISHED' + deploymentState: 'PUBLISHED', }); const mvnTarget = createMavenTarget(); @@ -853,7 +875,11 @@ describe('releaseRepository', () => { test('should throw if server doesnt accept the request', async () => { nock(url.origin) .post('/service/local/staging/bulk/promote', { - data: { stagedRepositoryIds: [repositoryId], description: '', autoDropAfterRelease: true }, + data: { + stagedRepositoryIds: [repositoryId], + description: '', + autoDropAfterRelease: true, + }, }) .reply(500); @@ -871,7 +897,11 @@ describe('releaseRepository', () => { test('should wait for the status of deployment to be changed', async () => { nock(url.origin) .post('/service/local/staging/bulk/promote', { - data: { stagedRepositoryIds: [repositoryId], description: '', autoDropAfterRelease: true }, + data: { + stagedRepositoryIds: [repositoryId], + description: '', + autoDropAfterRelease: true, + }, }) .reply(200); @@ -883,15 +913,15 @@ describe('releaseRepository', () => { nock(centralUrl.origin) .post(`${centralUrl.pathname}/publisher/status?id=${deploymentId}`) .reply(200, { - deploymentState: 'VALIDATED' + deploymentState: 'VALIDATED', }) .post(`${centralUrl.pathname}/publisher/status?id=${deploymentId}`) .reply(200, { - deploymentState: 'PUBLISHING' + deploymentState: 'PUBLISHING', }) .post(`${centralUrl.pathname}/publisher/status?id=${deploymentId}`) .reply(200, { - deploymentState: 'PUBLISHED' + deploymentState: 'PUBLISHED', }); await expect(mvnTarget.releaseRepository(repositoryId)).resolves.toBe(true); @@ -900,7 +930,11 @@ describe('releaseRepository', () => { test('should throw if deadline is reached', async () => { nock(url.origin) .post('/service/local/staging/bulk/promote', { - data: { stagedRepositoryIds: [repositoryId], description: '', autoDropAfterRelease: true }, + data: { + stagedRepositoryIds: [repositoryId], + description: '', + autoDropAfterRelease: true, + }, }) .reply(200); @@ -910,12 +944,12 @@ describe('releaseRepository', () => { ); nock(centralUrl.origin) - .post(`${centralUrl.pathname}/publisher/status?id=${deploymentId}`) - .reply(200, { - deploymentState: 'PUBLISHING' - }) + .post(`${centralUrl.pathname}/publisher/status?id=${deploymentId}`) + .reply(200, { + deploymentState: 'PUBLISHING', + }); - // Deadline is 2h, so we fake pooling start time and initial read to 1min + // Deadline is 2h, so we fake pooling start time and initial read to 1min // and second iteration to something over 2h jest .spyOn(Date, 'now') diff --git a/src/targets/__tests__/mavenDiskIo.test.ts b/src/targets/__tests__/mavenDiskIo.test.ts index b5d9f082..7afb8c48 100644 --- a/src/targets/__tests__/mavenDiskIo.test.ts +++ b/src/targets/__tests__/mavenDiskIo.test.ts @@ -1,7 +1,5 @@ import { NoneArtifactProvider } from '../../artifact_providers/none'; -import { - MavenTarget -} from '../maven'; +import { MavenTarget } from '../maven'; import { withTempDir } from '../../utils/files'; import { promises as fsPromises } from 'fs'; import { join } from 'path'; @@ -43,66 +41,71 @@ function createMavenTarget( describe('maven disk io', () => { test('fileExists', async () => { - await withTempDir(async (tmpDir): Promise => { - const target = createMavenTarget(); + await withTempDir( + async (tmpDir): Promise => { + const target = createMavenTarget(); - expect(await target.fileExists('a/random/path')).toBe(false); + expect(await target.fileExists('a/random/path')).toBe(false); - // a folder should return false - expect(await target.fileExists(tmpDir)).toBe(false); + // a folder should return false + expect(await target.fileExists(tmpDir)).toBe(false); - const file = join(tmpDir, 'module.json'); + const file = join(tmpDir, 'module.json'); - // when the file doesn't exist it should return false - expect(await target.fileExists(file)).toBe(false); - await fsPromises.writeFile(file, 'abc'); + // when the file doesn't exist it should return false + expect(await target.fileExists(file)).toBe(false); + await fsPromises.writeFile(file, 'abc'); - // once the file is written, it should exist - expect(await target.fileExists(file)).toBe(true); - - }); + // once the file is written, it should exist + expect(await target.fileExists(file)).toBe(true); + } + ); }); test('fixModuleFileName', async () => { - await withTempDir(async (tmpDir): Promise => { - const target = createMavenTarget(); - - const file = join(tmpDir, 'module.json'); - await fsPromises.writeFile(file, 'abc'); - - const moduleFile = join(tmpDir, 'sentry-java-1.0.0.module'); - // when fix module is called with proper file names - await target.fixModuleFileName(tmpDir, moduleFile); - - // it should rename the file - expect(await target.fileExists(file)).toBe(false); - expect(await target.fileExists(moduleFile)).toBe(true); - - }); + await withTempDir( + async (tmpDir): Promise => { + const target = createMavenTarget(); + + const file = join(tmpDir, 'module.json'); + await fsPromises.writeFile(file, 'abc'); + + const moduleFile = join(tmpDir, 'sentry-java-1.0.0.module'); + // when fix module is called with proper file names + await target.fixModuleFileName(tmpDir, moduleFile); + + // it should rename the file + expect(await target.fileExists(file)).toBe(false); + expect(await target.fileExists(moduleFile)).toBe(true); + } + ); }); test('fixModuleFileName no-op', async () => { - await withTempDir(async (tmpDir): Promise => { - const target = createMavenTarget(); - - const file = join(tmpDir, 'sentry-java-1.0.0.module'); - await fsPromises.writeFile(file, 'abc'); + await withTempDir( + async (tmpDir): Promise => { + const target = createMavenTarget(); - // when fix module is called, but the proper file already exists - await target.fixModuleFileName(tmpDir, file); + const file = join(tmpDir, 'sentry-java-1.0.0.module'); + await fsPromises.writeFile(file, 'abc'); - // it should still exist after calling fixModuleFileName - expect(await target.fileExists(file)).toBe(true); + // when fix module is called, but the proper file already exists + await target.fixModuleFileName(tmpDir, file); - }); + // it should still exist after calling fixModuleFileName + expect(await target.fileExists(file)).toBe(true); + } + ); }); test('fixModuleFileName non-existant-files', async () => { - await withTempDir(async (tmpDir): Promise => { - const target = createMavenTarget(); - - const file = join(tmpDir, 'sentry-java-1.0.0.module'); - await target.fixModuleFileName(tmpDir, file); - }); + await withTempDir( + async (tmpDir): Promise => { + const target = createMavenTarget(); + + const file = join(tmpDir, 'sentry-java-1.0.0.module'); + await target.fixModuleFileName(tmpDir, file); + } + ); }); }); diff --git a/src/targets/__tests__/powershell.test.ts b/src/targets/__tests__/powershell.test.ts index 4ffa4676..363b60c6 100644 --- a/src/targets/__tests__/powershell.test.ts +++ b/src/targets/__tests__/powershell.test.ts @@ -71,25 +71,27 @@ describe('config', () => { } catch (error) { expect(error).toBeInstanceOf(ConfigurationError); expect(error.message).toBe( - 'Missing project configuration parameter(s): apiKey,repository,module'); + 'Missing project configuration parameter(s): apiKey,repository,module' + ); } }); }); describe('publish', () => { const mockedSpawnProcess = spawnProcess as jest.Mock; - const spawnOptions = { enableInDryRunMode: true, showStdout: true } + const spawnOptions = { enableInDryRunMode: true, showStdout: true }; beforeEach(() => { setPwshEnvironmentVariables(); jest.clearAllMocks(); }); - test('error on missing artifact', async () => { const target = getPwshTarget(); - target.getArtifactsForRevision = jest.fn() - .mockImplementation(() => []).bind(PowerShellTarget); + target.getArtifactsForRevision = jest + .fn() + .mockImplementation(() => []) + .bind(PowerShellTarget); // `publish` should report an error. When it's not dry run, the error is // thrown; when it's on dry run, the error is logged and `undefined` is @@ -105,8 +107,10 @@ describe('publish', () => { test('error on having too many artifacts', async () => { const target = getPwshTarget(); - target.getArtifactsForRevision = jest.fn() - .mockImplementation(() => ['file1', 'file2']).bind(PowerShellTarget); + target.getArtifactsForRevision = jest + .fn() + .mockImplementation(() => ['file1', 'file2']) + .bind(PowerShellTarget); // `publish` should report an error. When it's not dry run, the error is // thrown; when it's on dry run, the error is logged and `undefined` is @@ -127,8 +131,14 @@ describe('publish', () => { expect(error).toBeInstanceOf(Error); expect(error.message).toMatch(/there are no matching artifact/); } - expect(mockedSpawnProcess).toBeCalledWith('pwsh', ['--version'], {}, spawnOptions); - expect(mockedSpawnProcess).toBeCalledWith('pwsh', + expect(mockedSpawnProcess).toBeCalledWith( + 'pwsh', + ['--version'], + {}, + spawnOptions + ); + expect(mockedSpawnProcess).toBeCalledWith( + 'pwsh', [ '-Command', `$ErrorActionPreference = 'Stop' @@ -137,14 +147,18 @@ describe('publish', () => { "Module name: $($info.ModuleName)" "Module version: $($info.Module.Version)" "Module path: $($info.Module.Path)" - ` - ], {}, spawnOptions); + `, + ], + {}, + spawnOptions + ); }); test('publish-module runs with expected args', async () => { const target = getPwshTarget(); await target.publishModule('/path/to/module'); - expect(mockedSpawnProcess).toBeCalledWith('pwsh', + expect(mockedSpawnProcess).toBeCalledWith( + 'pwsh', [ '-Command', `$ErrorActionPreference = 'Stop' @@ -153,7 +167,10 @@ describe('publish', () => { -Repository 'repositoryName' \` -NuGetApiKey 'test access key' \` -WhatIf:$false - ` - ], {}, spawnOptions); + `, + ], + {}, + spawnOptions + ); }); }); diff --git a/src/targets/__tests__/pubDev.test.ts b/src/targets/__tests__/pubDev.test.ts index 03813e8b..82058dd0 100644 --- a/src/targets/__tests__/pubDev.test.ts +++ b/src/targets/__tests__/pubDev.test.ts @@ -115,7 +115,7 @@ describe('PubDev target configuration', () => { dos: undefined, tres: undefined, }, - skipValidation: true + skipValidation: true, }); expect(target.pubDevConfig).toStrictEqual({ diff --git a/src/targets/__tests__/pypi.test.ts b/src/targets/__tests__/pypi.test.ts index 92183ab0..2bb6deab 100644 --- a/src/targets/__tests__/pypi.test.ts +++ b/src/targets/__tests__/pypi.test.ts @@ -20,7 +20,7 @@ describe('pypi', () => { }); test('it uploads all artifacts in a single twine call', async () => { - const target = new PypiTarget({name: 'pypi'}, new NoneArtifactProvider()); + const target = new PypiTarget({ name: 'pypi' }, new NoneArtifactProvider()); target.getArtifactsForRevision = jest .fn() .mockResolvedValueOnce([ @@ -29,7 +29,10 @@ describe('pypi', () => { { filename: 'pkg-1.tar.gz' }, ]); target.artifactProvider.downloadArtifact = jest.fn( - async (artifact: RemoteArtifact, _downloadDirectory?: string | undefined) => `downloaded/path/${artifact.filename}` + async ( + artifact: RemoteArtifact, + _downloadDirectory?: string | undefined + ) => `downloaded/path/${artifact.filename}` ); const upload = jest.fn(); target.uploadAssets = upload; diff --git a/src/targets/crates.ts b/src/targets/crates.ts index a9a10f94..d926a29b 100644 --- a/src/targets/crates.ts +++ b/src/targets/crates.ts @@ -281,7 +281,9 @@ export class CratesTarget extends BaseTarget { await spawnProcess(CARGO_BIN, args, { env }); } catch (err) { if (err instanceof Error && err.message.includes(REPUBLISH_ERROR)) { - this.logger.info(`Skipping ${crate.name}, version ${crate.version} already published`); + this.logger.info( + `Skipping ${crate.name}, version ${crate.version} already published` + ); } else { throw err; } diff --git a/src/targets/hex.ts b/src/targets/hex.ts index f81762e5..f0574806 100644 --- a/src/targets/hex.ts +++ b/src/targets/hex.ts @@ -81,10 +81,30 @@ export class HexTarget extends BaseTarget { const spawnOptions = { cwd: directory }; const spawnProcessOptions = { showStdout: true }; - await spawnProcess(MIX_BIN, ['local.hex', '--force'], spawnOptions, spawnProcessOptions); - await spawnProcess(MIX_BIN, ['local.rebar', '--force'], spawnOptions, spawnProcessOptions); - await spawnProcess(MIX_BIN, ['deps.get'], spawnOptions, spawnProcessOptions); - await spawnProcess(MIX_BIN, ['hex.publish', '--yes'], spawnOptions, spawnProcessOptions); + await spawnProcess( + MIX_BIN, + ['local.hex', '--force'], + spawnOptions, + spawnProcessOptions + ); + await spawnProcess( + MIX_BIN, + ['local.rebar', '--force'], + spawnOptions, + spawnProcessOptions + ); + await spawnProcess( + MIX_BIN, + ['deps.get'], + spawnOptions, + spawnProcessOptions + ); + await spawnProcess( + MIX_BIN, + ['hex.publish', '--yes'], + spawnOptions, + spawnProcessOptions + ); }, true, 'craft-hex-' diff --git a/src/targets/maven.ts b/src/targets/maven.ts index 1c20833c..656d9ccb 100644 --- a/src/targets/maven.ts +++ b/src/targets/maven.ts @@ -306,7 +306,9 @@ export class MavenTarget extends BaseTarget { this.logger.debug('Found POM: ', pomFile); await this.uploadPomDistribution(distDir); } else { - this.logger.warn(`No BOM/POM file found in: ${distDir}, skipping directory`); + this.logger.warn( + `No BOM/POM file found in: ${distDir}, skipping directory` + ); } } @@ -355,7 +357,7 @@ export class MavenTarget extends BaseTarget { } catch (error) { this.logger.warn( `Could not determine if path corresponds to a BOM file: ${pomFilepath}\n` + - 'Error:\n', + 'Error:\n', error ); return false; @@ -393,7 +395,12 @@ export class MavenTarget extends BaseTarget { sideArtifacts, classifiers, types, - } = this.transformKmpSideArtifacts(isRootDistDir, isAppleDistDir, isKlibDistDir, files); + } = this.transformKmpSideArtifacts( + isRootDistDir, + isAppleDistDir, + isKlibDistDir, + files + ); await retrySpawnProcess(this.mavenConfig.mavenCliPath, [ 'gpg:sign-and-deploy-file', @@ -547,9 +554,15 @@ export class MavenTarget extends BaseTarget { * this function renames module.json to dist.module, * making it fit for mvn publishing. */ - public async fixModuleFileName(distDir: string, moduleFile: string): Promise { + public async fixModuleFileName( + distDir: string, + moduleFile: string + ): Promise { const fallbackFile = join(distDir, 'module.json'); - if (!await this.fileExists(moduleFile) && await this.fileExists(fallbackFile)) { + if ( + !(await this.fileExists(moduleFile)) && + (await this.fileExists(fallbackFile)) + ) { await fsPromises.rename(fallbackFile, moduleFile); } } @@ -573,7 +586,9 @@ export class MavenTarget extends BaseTarget { await retrySpawnProcess(this.mavenConfig.mavenCliPath, [ 'gpg:sign-and-deploy-file', `-Dfile=${targetFile}`, - `-Dfiles=${javadocFile},${sourcesFile}${hasModule ? ',' + moduleFile : ''}`, + `-Dfiles=${javadocFile},${sourcesFile}${ + hasModule ? ',' + moduleFile : '' + }`, `-Dclassifiers=javadoc,sources${hasModule ? ',' : ''}`, `-Dtypes=jar,jar${hasModule ? ',module' : ''}`, `-DpomFile=${pomFile}`, @@ -600,7 +615,7 @@ export class MavenTarget extends BaseTarget { javadocFile: join(distDir, `${moduleName}-javadoc.jar`), sourcesFile: join(distDir, `${moduleName}-sources.jar`), pomFile: join(distDir, 'pom-default.xml'), - moduleFile: join(distDir, `${moduleName}.module`) + moduleFile: join(distDir, `${moduleName}.module`), }; } @@ -622,7 +637,11 @@ export class MavenTarget extends BaseTarget { const moduleName = parse(distDir).base; if (this.mavenConfig.kmp !== false) { - const { klibDistDirRegex, appleDistDirRegex, rootDistDirRegex } = this.mavenConfig.kmp; + const { + klibDistDirRegex, + appleDistDirRegex, + rootDistDirRegex, + } = this.mavenConfig.kmp; const isRootDistDir = rootDistDirRegex.test(moduleName); const isAppleDistDir = appleDistDirRegex.test(moduleName); @@ -679,7 +698,10 @@ export class MavenTarget extends BaseTarget { if (this.mavenConfig.kmp !== false) { const { klibDistDirRegex, appleDistDirRegex } = this.mavenConfig.kmp; - if (klibDistDirRegex.test(moduleName) || appleDistDirRegex.test(moduleName)) { + if ( + klibDistDirRegex.test(moduleName) || + appleDistDirRegex.test(moduleName) + ) { return `${moduleName}.klib`; } } @@ -704,9 +726,12 @@ export class MavenTarget extends BaseTarget { } public async getRepository(): Promise { - const response = await fetch(`${NEXUS_API_BASE_URL}/manual/search/repositories`, { - headers: this.getNexusRequestHeaders(), - }); + const response = await fetch( + `${NEXUS_API_BASE_URL}/manual/search/repositories`, + { + headers: this.getNexusRequestHeaders(), + } + ); if (!response.ok) { throw new Error( @@ -734,18 +759,29 @@ export class MavenTarget extends BaseTarget { const parts = repoId.split('/'); repoId = parts[parts.length - 1] || repoId; } - return { repositoryId: repoId, state: repo.state, deploymentId: repo.portal_deployment_id }; + return { + repositoryId: repoId, + state: repo.state, + deploymentId: repo.portal_deployment_id, + }; } public async closeRepository(repositoryId: string): Promise { // closing means uploading the repository to portal - const response = await fetch(`${NEXUS_API_BASE_URL}/service/local/staging/bulk/close`, { - headers: this.getNexusRequestHeaders(), - method: 'POST', - body: JSON.stringify({ - data: { stagedRepositoryIds: [repositoryId], "description": "", "autoDropAfterRelease": true }, - }), - }); + const response = await fetch( + `${NEXUS_API_BASE_URL}/service/local/staging/bulk/close`, + { + headers: this.getNexusRequestHeaders(), + method: 'POST', + body: JSON.stringify({ + data: { + stagedRepositoryIds: [repositoryId], + description: '', + autoDropAfterRelease: true, + }, + }), + } + ); if (!response.ok) { throw new Error( @@ -770,7 +806,8 @@ export class MavenTarget extends BaseTarget { } this.logger.info( - `Nexus repository still not closed. Waiting for ${NEXUS_RETRY_DELAY / 1000 + `Nexus repository still not closed. Waiting for ${ + NEXUS_RETRY_DELAY / 1000 }s to try again.` ); } @@ -781,13 +818,20 @@ export class MavenTarget extends BaseTarget { const { deploymentId } = await this.getRepository(); // then we need to promote the repository (=publish it) - const response = await fetch(`${NEXUS_API_BASE_URL}/service/local/staging/bulk/promote`, { - headers: this.getNexusRequestHeaders(), - method: 'POST', - body: JSON.stringify({ - data: { stagedRepositoryIds: [repositoryId], "description": "", "autoDropAfterRelease": true }, - }), - }); + const response = await fetch( + `${NEXUS_API_BASE_URL}/service/local/staging/bulk/promote`, + { + headers: this.getNexusRequestHeaders(), + method: 'POST', + body: JSON.stringify({ + data: { + stagedRepositoryIds: [repositoryId], + description: '', + autoDropAfterRelease: true, + }, + }), + } + ); if (!response.ok) { throw new Error( @@ -799,24 +843,33 @@ export class MavenTarget extends BaseTarget { while (true) { if (Date.now() - poolingStartTime > SONATYPE_RETRY_DEADLINE) { - throw new Error('Deadline for Central repository status change reached.'); + throw new Error( + 'Deadline for Central repository status change reached.' + ); } await sleep(CENTRAL_RETRY_DELAY); // then we need to check if the repository is published with the deployment id - const response = await fetch(`${CENTRAL_API_BASE_URL}/publisher/status?id=${deploymentId}`, { - method: 'POST', - headers: this.getNexusRequestHeaders(), - }); + const response = await fetch( + `${CENTRAL_API_BASE_URL}/publisher/status?id=${deploymentId}`, + { + method: 'POST', + headers: this.getNexusRequestHeaders(), + } + ); - if (response.ok && (await response.json()).deploymentState === 'PUBLISHED') { + if ( + response.ok && + (await response.json()).deploymentState === 'PUBLISHED' + ) { this.logger.info(`Central repository published correctly.`); return true; } this.logger.info( - `Central repository still not published. Waiting for ${CENTRAL_RETRY_DELAY / 1000 + `Central repository still not published. Waiting for ${ + CENTRAL_RETRY_DELAY / 1000 }s to try again.` ); } diff --git a/src/targets/nuget.ts b/src/targets/nuget.ts index 4ed693ee..aba0a5eb 100644 --- a/src/targets/nuget.ts +++ b/src/targets/nuget.ts @@ -118,7 +118,11 @@ export class NugetTarget extends BaseTarget { // Also emit the nuget version, which is informative and works around a bug. // See https://github.com/NuGet/Home/issues/12159#issuecomment-1278360511 this.logger.info('Nuget Version:'); - await spawnProcess(NUGET_DOTNET_BIN, ['nuget', '--version'], DOTNET_SPAWN_OPTIONS); + await spawnProcess( + NUGET_DOTNET_BIN, + ['nuget', '--version'], + DOTNET_SPAWN_OPTIONS + ); await Promise.all( packageFiles.map(async (file: RemoteArtifact) => { @@ -140,7 +144,9 @@ export class NugetTarget extends BaseTarget { this.logger.info( `Uploading file "${file.filename}" via "dotnet nuget"` + - (symbolFile ? `, including symbol file "${symbolFile.filename}"` : '') + (symbolFile + ? `, including symbol file "${symbolFile.filename}"` + : '') ); return this.uploadAsset(path); }) diff --git a/src/targets/powershell.ts b/src/targets/powershell.ts index c7606bf8..0b7b346a 100644 --- a/src/targets/powershell.ts +++ b/src/targets/powershell.ts @@ -4,7 +4,12 @@ import { TargetConfig } from '../schemas/project_config'; import { ConfigurationError, reportError } from '../utils/errors'; import { withTempDir } from '../utils/files'; import { isDryRun } from '../utils/helpers'; -import { SpawnProcessOptions, checkExecutableIsPresent, extractZipArchive, spawnProcess } from '../utils/system'; +import { + SpawnProcessOptions, + checkExecutableIsPresent, + extractZipArchive, + spawnProcess, +} from '../utils/system'; import { BaseTarget } from './base'; /** Command to launch PowerShell */ @@ -31,7 +36,10 @@ export class PowerShellTarget extends BaseTarget { public readonly name: string = 'powershell'; /** Target options */ public readonly psConfig: PowerShellTargetOptions; - private readonly defaultSpawnOptions = { enableInDryRunMode: true, showStdout: true } + private readonly defaultSpawnOptions = { + enableInDryRunMode: true, + showStdout: true, + }; public constructor( config: TargetConfig, @@ -47,15 +55,20 @@ export class PowerShellTarget extends BaseTarget { } /** - * Executes a PowerShell command. - */ + * Executes a PowerShell command. + */ private async spawnPwsh( command: string, spawnProcessOptions: SpawnProcessOptions = this.defaultSpawnOptions ): Promise { command = `$ErrorActionPreference = 'Stop'\n` + command; - this.logger.trace("Executing PowerShell command:", command); - return spawnProcess(POWERSHELL_BIN, ['-Command', command], {}, spawnProcessOptions); + this.logger.trace('Executing PowerShell command:', command); + return spawnProcess( + POWERSHELL_BIN, + ['-Command', command], + {}, + spawnProcessOptions + ); } /** @@ -91,7 +104,12 @@ export class PowerShellTarget extends BaseTarget { // Emit the PowerShell executable for informational purposes. this.logger.info(`PowerShell (${POWERSHELL_BIN}) info:`); - await spawnProcess(POWERSHELL_BIN, ['--version'], {}, this.defaultSpawnOptions); + await spawnProcess( + POWERSHELL_BIN, + ['--version'], + {}, + this.defaultSpawnOptions + ); // Also check the command and its its module version in case there are issues: this.logger.info('Publish-Module command info:'); @@ -103,8 +121,11 @@ export class PowerShellTarget extends BaseTarget { `); // Escape the given module artifact name to avoid regex issues. - let moduleArtifactRegex = `${this.psConfig.module}`.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&'); - moduleArtifactRegex = `/^${moduleArtifactRegex}\\.zip$/` + let moduleArtifactRegex = `${this.psConfig.module}`.replace( + /[/\-\\^$*+?.()|[\]{}]/g, + '\\$&' + ); + moduleArtifactRegex = `/^${moduleArtifactRegex}\\.zip$/`; this.logger.debug(`Looking for artifact matching ${moduleArtifactRegex}`); const packageFiles = await this.getArtifactsForRevision(revision, { @@ -122,7 +143,7 @@ export class PowerShellTarget extends BaseTarget { const artifact = packageFiles[0]; const zipPath = await this.artifactProvider.downloadArtifact(artifact); - this.logger.info(`Extracting artifact "${artifact.filename}"`) + this.logger.info(`Extracting artifact "${artifact.filename}"`); await withTempDir(async dir => { const moduleDir = join(dir, this.psConfig.module); await extractZipArchive(zipPath, moduleDir); @@ -133,7 +154,9 @@ export class PowerShellTarget extends BaseTarget { } public async publishModule(moduleDir: string): Promise { - this.logger.info(`Publishing PowerShell module "${this.psConfig.module}" to ${this.psConfig.repository}`) + this.logger.info( + `Publishing PowerShell module "${this.psConfig.module}" to ${this.psConfig.repository}` + ); await this.spawnPwsh(` Publish-Module -Path '${moduleDir}' \` -Repository '${this.psConfig.repository}' \` diff --git a/src/targets/upm.ts b/src/targets/upm.ts index be9d8761..927eda6e 100644 --- a/src/targets/upm.ts +++ b/src/targets/upm.ts @@ -147,8 +147,9 @@ export class UpmTarget extends BaseTarget { targetRevision, changes ); - await this.githubTarget.publishRelease(draftRelease, - { makeLatest: !isPrerelease }); + await this.githubTarget.publishRelease(draftRelease, { + makeLatest: !isPrerelease, + }); } }, true, diff --git a/src/utils/__tests__/gcsAPI.test.ts b/src/utils/__tests__/gcsAPI.test.ts index 2cdd87b0..3435aa85 100644 --- a/src/utils/__tests__/gcsAPI.test.ts +++ b/src/utils/__tests__/gcsAPI.test.ts @@ -113,10 +113,12 @@ describe('gcsApi module', () => { it('returns null if neither JSON creds nor creds filepath provided', () => { // skip defining variables - expect(getGCSCredsFromEnv( - { name: 'DOG_CREDS_JSON' }, - { name: 'DOG_CREDS_PATH' } - )).toBeNull(); + expect( + getGCSCredsFromEnv( + { name: 'DOG_CREDS_JSON' }, + { name: 'DOG_CREDS_PATH' } + ) + ).toBeNull(); }); it('errors if given bogus JSON', () => { diff --git a/src/utils/__tests__/system.test.ts b/src/utils/__tests__/system.test.ts index ed6ce334..f1b9151e 100644 --- a/src/utils/__tests__/system.test.ts +++ b/src/utils/__tests__/system.test.ts @@ -177,24 +177,194 @@ describe('isExecutableInPath', () => { }); describe('extractZipArchive', () => { - // zip with `t.txt` and `5000` iterations of `f'{string.ascii_letters}\n'}` - test('it can extract a larger zip', async () => { - await withTempDir(async tmpdir => { - const zip = `${tmpdir}/out.zip`; - - const zipf = await fs.promises.open(zip, 'w'); - await zipf.writeFile(Buffer.from([80, 75, 3, 4, 10, 0, 0, 0, 0, 0, 99, 150, 109, 88, 220, 199, 60, 159, 40, 11, 4, 0, 40, 11, 4, 0, 5, 0, 28, 0, 116, 46, 116, 120, 116, 85, 84, 9, 0, 3, 153, 245, 241, 101, 140, 245, 241, 101, 117, 120, 11, 0, 1, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0])); - for (let i = 0; i < 5000; i += 1) { - await zipf.writeFile('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n'); - } - await zipf.writeFile(Buffer.from([80, 75, 1, 2, 30, 3, 10, 0, 0, 0, 0, 0, 99, 150, 109, 88, 220, 199, 60, 159, 40, 11, 4, 0, 40, 11, 4, 0, 5, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 0, 0, 0, 0, 116, 46, 116, 120, 116, 85, 84, 5, 0, 3, 153, 245, 241, 101, 117, 120, 11, 0, 1, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 80, 75, 5, 6, 0, 0, 0, 0, 1, 0, 1, 0, 75, 0, 0, 0, 103, 11, 4, 0, 0, 0])); - await zipf.close(); - - await extractZipArchive(zip, `${tmpdir}/out`); - - // should not have corrupted our file - const checksum = await calculateChecksum(`${tmpdir}/out/t.txt`); - expect(checksum).toBe('7687e11d941faf48d4cf1692c2473a599ad0d7030e1e5c639a31b2f59cd646ba'); - }); + // zip with `t.txt` and `5000` iterations of `f'{string.ascii_letters}\n'}` + test('it can extract a larger zip', async () => { + await withTempDir(async tmpdir => { + const zip = `${tmpdir}/out.zip`; + + const zipf = await fs.promises.open(zip, 'w'); + await zipf.writeFile( + Buffer.from([ + 80, + 75, + 3, + 4, + 10, + 0, + 0, + 0, + 0, + 0, + 99, + 150, + 109, + 88, + 220, + 199, + 60, + 159, + 40, + 11, + 4, + 0, + 40, + 11, + 4, + 0, + 5, + 0, + 28, + 0, + 116, + 46, + 116, + 120, + 116, + 85, + 84, + 9, + 0, + 3, + 153, + 245, + 241, + 101, + 140, + 245, + 241, + 101, + 117, + 120, + 11, + 0, + 1, + 4, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + ]) + ); + for (let i = 0; i < 5000; i += 1) { + await zipf.writeFile( + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n' + ); + } + await zipf.writeFile( + Buffer.from([ + 80, + 75, + 1, + 2, + 30, + 3, + 10, + 0, + 0, + 0, + 0, + 0, + 99, + 150, + 109, + 88, + 220, + 199, + 60, + 159, + 40, + 11, + 4, + 0, + 40, + 11, + 4, + 0, + 5, + 0, + 24, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 164, + 129, + 0, + 0, + 0, + 0, + 116, + 46, + 116, + 120, + 116, + 85, + 84, + 5, + 0, + 3, + 153, + 245, + 241, + 101, + 117, + 120, + 11, + 0, + 1, + 4, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 80, + 75, + 5, + 6, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 75, + 0, + 0, + 0, + 103, + 11, + 4, + 0, + 0, + 0, + ]) + ); + await zipf.close(); + + await extractZipArchive(zip, `${tmpdir}/out`); + + // should not have corrupted our file + const checksum = await calculateChecksum(`${tmpdir}/out/t.txt`); + expect(checksum).toBe( + '7687e11d941faf48d4cf1692c2473a599ad0d7030e1e5c639a31b2f59cd646ba' + ); }); + }); }); diff --git a/src/utils/gcsApi.ts b/src/utils/gcsApi.ts index 8807ebcd..686f1a18 100644 --- a/src/utils/gcsApi.ts +++ b/src/utils/gcsApi.ts @@ -79,7 +79,9 @@ export function getGCSCredsFromEnv( // If no credentials are provided, return null to indicate ADC should be used if (!gcsCredsJson && !gcsCredsPath) { - logger.debug('No GCS credentials provided, will use Application Default Credentials'); + logger.debug( + 'No GCS credentials provided, will use Application Default Credentials' + ); return null; } @@ -112,7 +114,7 @@ export function getGCSCredsFromEnv( const { project_id, client_email, private_key } = parsedCofig; return { project_id, - credentials: { client_email, private_key } + credentials: { client_email, private_key }, }; } diff --git a/src/utils/githubApi.ts b/src/utils/githubApi.ts index fa3a41d9..941d1af4 100644 --- a/src/utils/githubApi.ts +++ b/src/utils/githubApi.ts @@ -23,11 +23,7 @@ export class GitHubRemote { /** Url in the form of /OWNER/REPO/ */ protected readonly url: string; - public constructor( - owner: string, - repo: string, - apiToken?: string - ) { + public constructor(owner: string, repo: string, apiToken?: string) { this.owner = owner; this.repo = repo; if (apiToken) { diff --git a/src/utils/sentry.ts b/src/utils/sentry.ts index 3d9a0a38..652b4673 100644 --- a/src/utils/sentry.ts +++ b/src/utils/sentry.ts @@ -21,7 +21,8 @@ export function initSentrySdk(): void { logger.debug('Sentry DSN found in the environment, initializing the SDK'); Sentry.init({ dsn: sentryDsn }); - Sentry.configureScope(scope => { + { + const scope = Sentry.getCurrentScope(); scope.setTag('os-username', userInfo().username); scope.setTag('os-hostname', hostname()); scope.setTag('os-platform', platform()); @@ -31,5 +32,5 @@ export function initSentrySdk(): void { scope.setExtra('argv', process.argv); scope.setExtra('craft-version', getPackageVersion()); scope.setExtra('working-directory', process.cwd()); - }); + } } diff --git a/src/utils/system.ts b/src/utils/system.ts index ca28ec74..9c443c77 100644 --- a/src/utils/system.ts +++ b/src/utils/system.ts @@ -344,7 +344,7 @@ export async function extractZipArchive( filePath: string, dir: string ): Promise { - await extract(filePath, {dir: dir}); + await extract(filePath, { dir: dir }); } /** diff --git a/src/utils/version.ts b/src/utils/version.ts index 5ab3581a..37b3372c 100644 --- a/src/utils/version.ts +++ b/src/utils/version.ts @@ -89,7 +89,13 @@ export function versionGreaterOrEqualThan(v1: SemVer, v2: SemVer): boolean { return true; } else if (v1.pre && !v2.pre) { return false; - } else if (v1.pre && v2.pre && v1.pre !== v2.pre && /^\d+$/.test(v1.pre) && /^\d+$/.test(v2.pre)) { + } else if ( + v1.pre && + v2.pre && + v1.pre !== v2.pre && + /^\d+$/.test(v1.pre) && + /^\d+$/.test(v2.pre) + ) { return v1.pre > v2.pre; } else if (v1.build || v2.build || v1.pre || v2.pre) { throw new Error( diff --git a/yarn.lock b/yarn.lock index 6dae6a1d..a74edf75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,6 +10,20 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@apm-js-collab/code-transformer@^0.8.0": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@apm-js-collab/code-transformer/-/code-transformer-0.8.2.tgz#a3160f16d1c4df9cb81303527287ad18d00994d1" + integrity sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA== + +"@apm-js-collab/tracing-hooks@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@apm-js-collab/tracing-hooks/-/tracing-hooks-0.3.1.tgz#414d3a93c3a15d8be543a3fac561f7c602b6a588" + integrity sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw== + dependencies: + "@apm-js-collab/code-transformer" "^0.8.0" + debug "^4.4.1" + module-details-from-path "^1.0.4" + "@aws-crypto/ie11-detection@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz#d3a6af29ba7f15458f79c41d1cd8cac3925e726a" @@ -1507,58 +1521,329 @@ dependencies: "@octokit/openapi-types" "^10.2.2" -"@sentry/core@4.6.3": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-4.6.3.tgz#5c120dea76d0b19757296e9c244f8c3939de744e" - integrity sha512-FZ+P7+Z1efDAA4OPgLpTNZM0uRmvvSSZAdfKhmDXNO+Xq3gD8RsdirxGjJHhH2lXgcVLCX8g2+0RVjBKVzuKxw== - dependencies: - "@sentry/hub" "4.6.3" - "@sentry/minimal" "4.6.3" - "@sentry/types" "4.5.3" - "@sentry/utils" "4.6.3" - tslib "^1.9.3" - -"@sentry/hub@4.6.3": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-4.6.3.tgz#522c4fa5ac1434dcfbaa326ab279b81d595ec739" - integrity sha512-WLs5XVErDW831o/Gpj2T8Ga+7ca7nHxZmHn08JRqHQz5TkJ7U74/KUAHYsifViaI7hAHKIywWbZpIwIh3X7+Lw== - dependencies: - "@sentry/types" "4.5.3" - "@sentry/utils" "4.6.3" - tslib "^1.9.3" - -"@sentry/minimal@4.6.3": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-4.6.3.tgz#5ff78eefaa15cda6508b181d4f4e757ec1385828" - integrity sha512-8+K6Txme/XBlcLkLY6CjJYyEpvGVxPm/Vpxw/kerI6bYTc0uCps7e7G2lX3TxYz1O+iYPs685uN8o/v8D7+bDg== - dependencies: - "@sentry/hub" "4.6.3" - "@sentry/types" "4.5.3" - tslib "^1.9.3" - -"@sentry/node@4.6.3": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-4.6.3.tgz#ffdb410d78ddec4f5b345d579ef98a6b4ae79d46" - integrity sha512-3dEPeUdWO4GX0XQkp9iGLEnBPSKweU9D1HxL8kf9L4XRiQA6VsjzsoZwTanlcSwIDgM0ldqPhIkLyQ7PHgpzxA== - dependencies: - "@sentry/core" "4.6.3" - "@sentry/hub" "4.6.3" - "@sentry/types" "4.5.3" - "@sentry/utils" "4.6.3" - "@types/stack-trace" "0.0.29" - cookie "0.3.1" - https-proxy-agent "2.2.1" - lru_map "0.3.3" - lsmod "1.0.0" - stack-trace "0.0.10" - tslib "^1.9.3" - -"@sentry/types@4.5.3": - version "4.5.3" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-4.5.3.tgz#3350dce2b7f9b936a8c327891c12e3aef7bd8852" - integrity sha512-7ll1PAFNjrBNX9rzy3P2qAQrpQwHaDO3uKj735qsnGw34OtAS8Xr8WYrjI14f9fMPa/XIeWvMPb4GMic28V/ag== - -"@sentry/typescript@^5.17.0": +"@opentelemetry/api-logs@0.208.0": + version "0.208.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz#56d3891010a1fa1cf600ba8899ed61b43ace511c" + integrity sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg== + dependencies: + "@opentelemetry/api" "^1.3.0" + +"@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" + integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== + +"@opentelemetry/context-async-hooks@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-2.2.0.tgz#5465f6fad6350f52cf9d95a92907a3a464d50644" + integrity sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ== + +"@opentelemetry/core@2.2.0", "@opentelemetry/core@^2.0.0", "@opentelemetry/core@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-2.2.0.tgz#2f857d7790ff160a97db3820889b5f4cade6eaee" + integrity sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw== + dependencies: + "@opentelemetry/semantic-conventions" "^1.29.0" + +"@opentelemetry/instrumentation-amqplib@0.55.0": + version "0.55.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.55.0.tgz#4d1afc47e7690693efa690ed06fbda3acc585a2f" + integrity sha512-5ULoU8p+tWcQw5PDYZn8rySptGSLZHNX/7srqo2TioPnAAcvTy6sQFQXsNPrAnyRRtYGMetXVyZUy5OaX1+IfA== + dependencies: + "@opentelemetry/core" "^2.0.0" + "@opentelemetry/instrumentation" "^0.208.0" + +"@opentelemetry/instrumentation-connect@0.52.0": + version "0.52.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.52.0.tgz#60cde91c548e9da4528ae47fe69af41d05eeb485" + integrity sha512-GXPxfNB5szMbV3I9b7kNWSmQBoBzw7MT0ui6iU/p+NIzVx3a06Ri2cdQO7tG9EKb4aKSLmfX9Cw5cKxXqX6Ohg== + dependencies: + "@opentelemetry/core" "^2.0.0" + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/semantic-conventions" "^1.27.0" + "@types/connect" "3.4.38" + +"@opentelemetry/instrumentation-dataloader@0.26.0": + version "0.26.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.26.0.tgz#d10d22854ee8eac4471c82b8862b177a40f3bf8e" + integrity sha512-P2BgnFfTOarZ5OKPmYfbXfDFjQ4P9WkQ1Jji7yH5/WwB6Wm/knynAoA1rxbjWcDlYupFkyT0M1j6XLzDzy0aCA== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + +"@opentelemetry/instrumentation-express@0.57.0": + version "0.57.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-express/-/instrumentation-express-0.57.0.tgz#7a2a7e90a84ad6c109f42c15acabdc7f6646a412" + integrity sha512-HAdx/o58+8tSR5iW+ru4PHnEejyKrAy9fYFhlEI81o10nYxrGahnMAHWiSjhDC7UQSY3I4gjcPgSKQz4rm/asg== + dependencies: + "@opentelemetry/core" "^2.0.0" + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/semantic-conventions" "^1.27.0" + +"@opentelemetry/instrumentation-fs@0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.28.0.tgz#6387fb7c19213afa31a2eb1b646d6356b95176bf" + integrity sha512-FFvg8fq53RRXVBRHZViP+EMxMR03tqzEGpuq55lHNbVPyFklSVfQBN50syPhK5UYYwaStx0eyCtHtbRreusc5g== + dependencies: + "@opentelemetry/core" "^2.0.0" + "@opentelemetry/instrumentation" "^0.208.0" + +"@opentelemetry/instrumentation-generic-pool@0.52.0": + version "0.52.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.52.0.tgz#12b57774ca3664edb9649687674320955e025906" + integrity sha512-ISkNcv5CM2IwvsMVL31Tl61/p2Zm2I2NAsYq5SSBgOsOndT0TjnptjufYVScCnD5ZLD1tpl4T3GEYULLYOdIdQ== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + +"@opentelemetry/instrumentation-graphql@0.56.0": + version "0.56.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.56.0.tgz#77464dec65efe5aa53d8787d0760534cf2e2a88f" + integrity sha512-IPvNk8AFoVzTAM0Z399t34VDmGDgwT6rIqCUug8P9oAGerl2/PEIYMPOl/rerPGu+q8gSWdmbFSjgg7PDVRd3Q== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + +"@opentelemetry/instrumentation-hapi@0.55.0": + version "0.55.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.55.0.tgz#a687b9bddfcc484f2cc85f022c123f83c19883a4" + integrity sha512-prqAkRf9e4eEpy4G3UcR32prKE8NLNlA90TdEU1UsghOTg0jUvs40Jz8LQWFEs5NbLbXHYGzB4CYVkCI8eWEVQ== + dependencies: + "@opentelemetry/core" "^2.0.0" + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/semantic-conventions" "^1.27.0" + +"@opentelemetry/instrumentation-http@0.208.0": + version "0.208.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-http/-/instrumentation-http-0.208.0.tgz#64fcc02bfbc80eb3bbb91cd3c7e0e24c695f2bef" + integrity sha512-rhmK46DRWEbQQB77RxmVXGyjs6783crXCnFjYQj+4tDH/Kpv9Rbg3h2kaNyp5Vz2emF1f9HOQQvZoHzwMWOFZQ== + dependencies: + "@opentelemetry/core" "2.2.0" + "@opentelemetry/instrumentation" "0.208.0" + "@opentelemetry/semantic-conventions" "^1.29.0" + forwarded-parse "2.1.2" + +"@opentelemetry/instrumentation-ioredis@0.56.0": + version "0.56.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.56.0.tgz#9b89cca6c3e440ae9e896f81dc6d2ab1dfee2581" + integrity sha512-XSWeqsd3rKSsT3WBz/JKJDcZD4QYElZEa0xVdX8f9dh4h4QgXhKRLorVsVkK3uXFbC2sZKAS2Ds+YolGwD83Dg== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/redis-common" "^0.38.2" + +"@opentelemetry/instrumentation-kafkajs@0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.18.0.tgz#b836e6883afb7ca6df9fd3b6e024408dcc5e584b" + integrity sha512-KCL/1HnZN5zkUMgPyOxfGjLjbXjpd4odDToy+7c+UsthIzVLFf99LnfIBE8YSSrYE4+uS7OwJMhvhg3tWjqMBg== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/semantic-conventions" "^1.30.0" + +"@opentelemetry/instrumentation-knex@0.53.0": + version "0.53.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.53.0.tgz#c2158c9259ff6789f6c2849bfd3c319edc0fcdf6" + integrity sha512-xngn5cH2mVXFmiT1XfQ1aHqq1m4xb5wvU6j9lSgLlihJ1bXzsO543cpDwjrZm2nMrlpddBf55w8+bfS4qDh60g== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/semantic-conventions" "^1.33.1" + +"@opentelemetry/instrumentation-koa@0.57.0": + version "0.57.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.57.0.tgz#9a9edcde7de472f7f03904c00d31d87c6ee0ee42" + integrity sha512-3JS8PU/D5E3q295mwloU2v7c7/m+DyCqdu62BIzWt+3u9utjxC9QS7v6WmUNuoDN3RM+Q+D1Gpj13ERo+m7CGg== + dependencies: + "@opentelemetry/core" "^2.0.0" + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/semantic-conventions" "^1.36.0" + +"@opentelemetry/instrumentation-lru-memoizer@0.53.0": + version "0.53.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.53.0.tgz#936c05263b719ee66999a9240b82fded044ebd2c" + integrity sha512-LDwWz5cPkWWr0HBIuZUjslyvijljTwmwiItpMTHujaULZCxcYE9eU44Qf/pbVC8TulT0IhZi+RoGvHKXvNhysw== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + +"@opentelemetry/instrumentation-mongodb@0.61.0": + version "0.61.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.61.0.tgz#4db130d537d630c3089115d2d214d29bcfb49f41" + integrity sha512-OV3i2DSoY5M/pmLk+68xr5RvkHU8DRB3DKMzYJdwDdcxeLs62tLbkmRyqJZsYf3Ht7j11rq35pHOWLuLzXL7pQ== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + +"@opentelemetry/instrumentation-mongoose@0.55.0": + version "0.55.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.55.0.tgz#e6851aba996b23b9709143c2b640084e92313dea" + integrity sha512-5afj0HfF6aM6Nlqgu6/PPHFk8QBfIe3+zF9FGpX76jWPS0/dujoEYn82/XcLSaW5LPUDW8sni+YeK0vTBNri+w== + dependencies: + "@opentelemetry/core" "^2.0.0" + "@opentelemetry/instrumentation" "^0.208.0" + +"@opentelemetry/instrumentation-mysql2@0.55.0": + version "0.55.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.55.0.tgz#a0957590aa8d402d1debd10e42d7b5da359164ec" + integrity sha512-0cs8whQG55aIi20gnK8B7cco6OK6N+enNhW0p5284MvqJ5EPi+I1YlWsWXgzv/V2HFirEejkvKiI4Iw21OqDWg== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/semantic-conventions" "^1.33.0" + "@opentelemetry/sql-common" "^0.41.2" + +"@opentelemetry/instrumentation-mysql@0.54.0": + version "0.54.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.54.0.tgz#6181ae097a2b5501049c518fe90393e1f136341d" + integrity sha512-bqC1YhnwAeWmRzy1/Xf9cDqxNG2d/JDkaxnqF5N6iJKN1eVWI+vg7NfDkf52/Nggp3tl1jcC++ptC61BD6738A== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + "@types/mysql" "2.15.27" + +"@opentelemetry/instrumentation-pg@0.61.0": + version "0.61.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.61.0.tgz#c755d00dba640e229fe50f817423dcf3376957ab" + integrity sha512-UeV7KeTnRSM7ECHa3YscoklhUtTQPs6V6qYpG283AB7xpnPGCUCUfECFT9jFg6/iZOQTt3FHkB1wGTJCNZEvPw== + dependencies: + "@opentelemetry/core" "^2.0.0" + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/semantic-conventions" "^1.34.0" + "@opentelemetry/sql-common" "^0.41.2" + "@types/pg" "8.15.6" + "@types/pg-pool" "2.0.6" + +"@opentelemetry/instrumentation-redis@0.57.0": + version "0.57.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.57.0.tgz#c6996eb8ace9cb16cf5be3db3a6b0fb599f47fab" + integrity sha512-bCxTHQFXzrU3eU1LZnOZQ3s5LURxQPDlU3/upBzlWY77qOI1GZuGofazj3jtzjctMJeBEJhNwIFEgRPBX1kp/Q== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/redis-common" "^0.38.2" + "@opentelemetry/semantic-conventions" "^1.27.0" + +"@opentelemetry/instrumentation-tedious@0.27.0": + version "0.27.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.27.0.tgz#f4ba662fd17edde80f1b14d0dc4c42c7fa4a3139" + integrity sha512-jRtyUJNZppPBjPae4ZjIQ2eqJbcRaRfJkr0lQLHFmOU/no5A6e9s1OHLd5XZyZoBJ/ymngZitanyRRA5cniseA== + dependencies: + "@opentelemetry/instrumentation" "^0.208.0" + "@types/tedious" "^4.0.14" + +"@opentelemetry/instrumentation-undici@0.19.0": + version "0.19.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.19.0.tgz#a9db59a7630261269239d17d2990d406e2ecddf8" + integrity sha512-Pst/RhR61A2OoZQZkn6OLpdVpXp6qn3Y92wXa6umfJe9rV640r4bc6SWvw4pPN6DiQqPu2c8gnSSZPDtC6JlpQ== + dependencies: + "@opentelemetry/core" "^2.0.0" + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/semantic-conventions" "^1.24.0" + +"@opentelemetry/instrumentation@0.208.0", "@opentelemetry/instrumentation@>=0.52.0 <1", "@opentelemetry/instrumentation@^0.208.0": + version "0.208.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.208.0.tgz#d764f8e4329dad50804e2e98f010170c14c4ce8f" + integrity sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA== + dependencies: + "@opentelemetry/api-logs" "0.208.0" + import-in-the-middle "^2.0.0" + require-in-the-middle "^8.0.0" + +"@opentelemetry/redis-common@^0.38.2": + version "0.38.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/redis-common/-/redis-common-0.38.2.tgz#cefa4f3e79db1cd54f19e233b7dfb56621143955" + integrity sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA== + +"@opentelemetry/resources@2.2.0", "@opentelemetry/resources@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-2.2.0.tgz#b90a950ad98551295b76ea8a0e7efe45a179badf" + integrity sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A== + dependencies: + "@opentelemetry/core" "2.2.0" + "@opentelemetry/semantic-conventions" "^1.29.0" + +"@opentelemetry/sdk-trace-base@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz#ddef9a0afd01a623d8625a3529f2137b05e67d0b" + integrity sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw== + dependencies: + "@opentelemetry/core" "2.2.0" + "@opentelemetry/resources" "2.2.0" + "@opentelemetry/semantic-conventions" "^1.29.0" + +"@opentelemetry/semantic-conventions@^1.24.0", "@opentelemetry/semantic-conventions@^1.27.0", "@opentelemetry/semantic-conventions@^1.29.0", "@opentelemetry/semantic-conventions@^1.30.0", "@opentelemetry/semantic-conventions@^1.33.0", "@opentelemetry/semantic-conventions@^1.33.1", "@opentelemetry/semantic-conventions@^1.34.0", "@opentelemetry/semantic-conventions@^1.36.0", "@opentelemetry/semantic-conventions@^1.37.0": + version "1.38.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz#8b5f415395a7ddb7c8e0c7932171deb9278df1a3" + integrity sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg== + +"@opentelemetry/sql-common@^0.41.2": + version "0.41.2" + resolved "https://registry.yarnpkg.com/@opentelemetry/sql-common/-/sql-common-0.41.2.tgz#7f4a14166cfd6c9ffe89096db1cc75eaf6443b19" + integrity sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ== + dependencies: + "@opentelemetry/core" "^2.0.0" + +"@prisma/instrumentation@6.19.0": + version "6.19.0" + resolved "https://registry.yarnpkg.com/@prisma/instrumentation/-/instrumentation-6.19.0.tgz#46d15adc8bc4a5a3167032eea6d0a7aa64fb7d93" + integrity sha512-QcuYy25pkXM8BJ37wVFBO7Zh34nyRV1GOb2n3lPkkbRYfl4hWl3PTcImP41P0KrzVXfa/45p6eVCos27x3exIg== + dependencies: + "@opentelemetry/instrumentation" ">=0.52.0 <1" + +"@sentry/core@10.27.0": + version "10.27.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-10.27.0.tgz#47e457ffc113f62f49f3a759e7e7da56b1268609" + integrity sha512-Zc68kdH7tWTDtDbV1zWIbo3Jv0fHAU2NsF5aD2qamypKgfSIMSbWVxd22qZyDBkaX8gWIPm/0Sgx6aRXRBXrYQ== + +"@sentry/node-core@10.27.0": + version "10.27.0" + resolved "https://registry.yarnpkg.com/@sentry/node-core/-/node-core-10.27.0.tgz#b6ef1548ffccbb3e7a973cef7c1a4930dedbef44" + integrity sha512-Dzo1I64Psb7AkpyKVUlR9KYbl4wcN84W4Wet3xjLmVKMgrCo2uAT70V4xIacmoMH5QLZAx0nGfRy9yRCd4nzBg== + dependencies: + "@apm-js-collab/tracing-hooks" "^0.3.1" + "@sentry/core" "10.27.0" + "@sentry/opentelemetry" "10.27.0" + import-in-the-middle "^2" + +"@sentry/node@^10.27.0": + version "10.27.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-10.27.0.tgz#2c82380913e808567613030157afad5abb6bd209" + integrity sha512-1cQZ4+QqV9juW64Jku1SMSz+PoZV+J59lotz4oYFvCNYzex8hRAnDKvNiKW1IVg5mEEkz98mg1fvcUtiw7GTiQ== + dependencies: + "@opentelemetry/api" "^1.9.0" + "@opentelemetry/context-async-hooks" "^2.2.0" + "@opentelemetry/core" "^2.2.0" + "@opentelemetry/instrumentation" "^0.208.0" + "@opentelemetry/instrumentation-amqplib" "0.55.0" + "@opentelemetry/instrumentation-connect" "0.52.0" + "@opentelemetry/instrumentation-dataloader" "0.26.0" + "@opentelemetry/instrumentation-express" "0.57.0" + "@opentelemetry/instrumentation-fs" "0.28.0" + "@opentelemetry/instrumentation-generic-pool" "0.52.0" + "@opentelemetry/instrumentation-graphql" "0.56.0" + "@opentelemetry/instrumentation-hapi" "0.55.0" + "@opentelemetry/instrumentation-http" "0.208.0" + "@opentelemetry/instrumentation-ioredis" "0.56.0" + "@opentelemetry/instrumentation-kafkajs" "0.18.0" + "@opentelemetry/instrumentation-knex" "0.53.0" + "@opentelemetry/instrumentation-koa" "0.57.0" + "@opentelemetry/instrumentation-lru-memoizer" "0.53.0" + "@opentelemetry/instrumentation-mongodb" "0.61.0" + "@opentelemetry/instrumentation-mongoose" "0.55.0" + "@opentelemetry/instrumentation-mysql" "0.54.0" + "@opentelemetry/instrumentation-mysql2" "0.55.0" + "@opentelemetry/instrumentation-pg" "0.61.0" + "@opentelemetry/instrumentation-redis" "0.57.0" + "@opentelemetry/instrumentation-tedious" "0.27.0" + "@opentelemetry/instrumentation-undici" "0.19.0" + "@opentelemetry/resources" "^2.2.0" + "@opentelemetry/sdk-trace-base" "^2.2.0" + "@opentelemetry/semantic-conventions" "^1.37.0" + "@prisma/instrumentation" "6.19.0" + "@sentry/core" "10.27.0" + "@sentry/node-core" "10.27.0" + "@sentry/opentelemetry" "10.27.0" + import-in-the-middle "^2" + minimatch "^9.0.0" + +"@sentry/opentelemetry@10.27.0": + version "10.27.0" + resolved "https://registry.yarnpkg.com/@sentry/opentelemetry/-/opentelemetry-10.27.0.tgz#b95f33b2494980627bb7683f2bb039d09fafd63b" + integrity sha512-z2vXoicuGiqlRlgL9HaYJgkin89ncMpNQy0Kje6RWyhpzLe8BRgUXlgjux7WrSrcbopDdC1OttSpZsJ/Wjk7fg== + dependencies: + "@sentry/core" "10.27.0" + +"@sentry/typescript@^5.20.1": version "5.20.1" resolved "https://registry.yarnpkg.com/@sentry/typescript/-/typescript-5.20.1.tgz#84133b3b8152367c936dbd573afe9e7a80c5f442" integrity sha512-RX3552k9LTANNXs9TeE1KhKOD+jfmVGpq81LT568cYmzv+fVVK/m2pynuh7SoAGqrJHirurA/IVLpt3bpnA4pw== @@ -1566,14 +1851,6 @@ tslint-config-prettier "^1.18.0" tslint-consistent-codestyle "^1.15.1" -"@sentry/utils@4.6.3": - version "4.6.3" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-4.6.3.tgz#0dc4748ef4ead089ceb2c4a3670339df8be71679" - integrity sha512-GNZjIErN99gqJfLMC1L4X4lzu3x1l562UGpuiv3iMQXoNCy8mpNeKtjizoocCGTLHmWB91m6wd2WTHH7P0POjA== - dependencies: - "@sentry/types" "4.5.3" - tslib "^1.9.3" - "@sinclair/typebox@^0.25.16": version "0.25.24" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" @@ -1663,6 +1940,13 @@ resolved "https://registry.yarnpkg.com/@types/cli-table/-/cli-table-0.3.0.tgz#f1857156bf5fd115c6a2db260ba0be1f8fc5671c" integrity sha512-QnZUISJJXyhyD6L1e5QwXDV/A5i2W1/gl6D6YMc8u0ncPepbv/B4w3S+izVvtAg60m6h+JP09+Y/0zF2mojlFQ== +"@types/connect@3.4.38": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + "@types/extract-zip@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/extract-zip/-/extract-zip-2.0.1.tgz#50a44968d8cfd683da47aeafd83899f252c9099b" @@ -1763,6 +2047,13 @@ dependencies: "@types/node" "*" +"@types/mysql@2.15.27": + version "2.15.27" + resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.27.tgz#fb13b0e8614d39d42f40f381217ec3215915f1e9" + integrity sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA== + dependencies: + "@types/node" "*" + "@types/mz@0.0.32": version "0.0.32" resolved "https://registry.yarnpkg.com/@types/mz/-/mz-0.0.32.tgz#e8248b4e41424c052edc1725dd33650c313a3659" @@ -1802,6 +2093,22 @@ dependencies: "@types/node" "*" +"@types/pg-pool@2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/pg-pool/-/pg-pool-2.0.6.tgz#1376d9dc5aec4bb2ec67ce28d7e9858227403c77" + integrity sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ== + dependencies: + "@types/pg" "*" + +"@types/pg@*", "@types/pg@8.15.6": + version "8.15.6" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.15.6.tgz#4df7590b9ac557cbe5479e0074ec1540cbddad9b" + integrity sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^2.2.0" + "@types/prettier@^1.13.2": version "1.19.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" @@ -1832,11 +2139,6 @@ resolved "https://registry.yarnpkg.com/@types/shell-quote/-/shell-quote-1.7.0.tgz#0b6b930de00ad35128239b182c1fec8b8c40e876" integrity sha512-0CJaSSayMigMKu/Egx1eVcFjgGYkP6T4dyPRs462BFrMB/OK2FAJFV/24+6R4cGIXw6ZQpZK8XEd2UCVKfkZRw== -"@types/stack-trace@0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/stack-trace/-/stack-trace-0.0.29.tgz#eb7a7c60098edb35630ed900742a5ecb20cfcb4d" - integrity sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g== - "@types/stack-utils@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" @@ -1850,6 +2152,13 @@ "@types/minipass" "*" "@types/node" "*" +"@types/tedious@^4.0.14": + version "4.0.14" + resolved "https://registry.yarnpkg.com/@types/tedious/-/tedious-4.0.14.tgz#868118e7a67808258c05158e9cad89ca58a2aec1" + integrity sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw== + dependencies: + "@types/node" "*" + "@types/tmp@^0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" @@ -1968,6 +2277,11 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== + acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" @@ -1978,6 +2292,11 @@ acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.14.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -2208,6 +2527,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -2346,6 +2672,11 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== +cjs-module-lexer@^1.2.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" + integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== + cli-color@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f" @@ -2487,11 +2818,6 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= - cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.5.tgz#910aac880ff5243da96b728bc6521a5f6c2f2f82" @@ -2533,6 +2859,13 @@ debug@^3.1.0: dependencies: ms "^2.1.1" +debug@^4.3.5, debug@^4.4.1: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3129,6 +3462,11 @@ format-util@^1.0.3: resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== +forwarded-parse@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/forwarded-parse/-/forwarded-parse-2.1.2.tgz#08511eddaaa2ddfd56ba11138eee7df117a09325" + integrity sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw== + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -3416,7 +3754,7 @@ http-proxy-agent@^4.0.0: agent-base "6" debug "4" -https-proxy-agent@2.2.1, https-proxy-agent@>=2.2.3, https-proxy-agent@^5.0.0: +https-proxy-agent@>=2.2.3, https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -3452,6 +3790,16 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-in-the-middle@^2, import-in-the-middle@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-2.0.0.tgz#295948cee94d0565314824c6bd75379d13e5b1a5" + integrity sha512-yNZhyQYqXpkT0AKq3F3KLasUSK4fHvebNH5hOsKQw2dhGSALvQ4U0BqUc5suziKvydO5u5hgN2hy1RJaho8U5A== + dependencies: + acorn "^8.14.0" + acorn-import-attributes "^1.9.5" + cjs-module-lexer "^1.2.2" + module-details-from-path "^1.0.3" + import-local@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" @@ -4245,16 +4593,6 @@ lru-queue@^0.1.0: dependencies: es5-ext "~0.10.2" -lru_map@0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= - -lsmod@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lsmod/-/lsmod-1.0.0.tgz#9a00f76dca36eb23fa05350afe1b585d4299e64b" - integrity sha1-mgD3bco26yP6BTUK/htYXUKZ5ks= - make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -4352,6 +4690,13 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.0: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" @@ -4382,11 +4727,21 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +module-details-from-path@^1.0.3, module-details-from-path@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.4.tgz#b662fdcd93f6c83d3f25289da0ce81c8d9685b94" + integrity sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w== + ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mustache@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.0.1.tgz#873855f23aa8a95b150fb96d9836edbc5a1d248a" @@ -4599,6 +4954,27 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-protocol@*: + version "1.10.3" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.3.tgz#ac9e4778ad3f84d0c5670583bab976ea0a34f69f" + integrity sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ== + +pg-types@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -4621,6 +4997,28 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4760,6 +5158,14 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-in-the-middle@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz#dbde2587f669398626d56b20c868ab87bf01cce4" + integrity sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ== + dependencies: + debug "^4.3.5" + module-details-from-path "^1.0.3" + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -4960,11 +5366,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -stack-trace@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= - stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -5219,7 +5620,7 @@ ts-jest@^29.1.1: semver "^7.5.3" yargs-parser "^21.0.1" -tslib@^1.11.1, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.3: +tslib@^1.11.1, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -5470,6 +5871,11 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + y18n@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4"