This commit is contained in:
Elizabeth Craig 2024-11-06 14:54:15 -08:00 коммит произвёл GitHub
Родитель d429bab917
Коммит e388076789
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
13 изменённых файлов: 424 добавлений и 137 удалений

4
.husky/pre-commit Executable file
Просмотреть файл

@ -0,0 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
yarn lint-staged

Просмотреть файл

@ -3,14 +3,15 @@
*.styl
*.svg
.*ignore
.husky/
.DS_Store
.nojekyll
.nvmrc
docs/.vuepress/dist
docs/.vuepress/dist/
/change/
/CHANGELOG.*
/lib/
LICENSE
node_modules
node_modules/
SECURITY.md
yarn.lock

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "none",
"comment": "Update formatting",
"packageName": "beachball",
"email": "elcraig@microsoft.com",
"dependentChangeType": "none"
}

Просмотреть файл

@ -28,6 +28,7 @@
"docs": "vuepress dev docs --host localhost",
"docs:build": "vuepress build docs",
"format": "prettier --write '**/*'",
"prepare": "husky install",
"pub": "node ./lib/cli.js publish",
"release": "node ./lib/cli.js publish -y",
"release:docs": "yarn docs:build && yarn gh-pages -d docs/.vuepress/dist --dotfiles",
@ -40,17 +41,22 @@
"test:watch": "jest --watch",
"update-snapshots": "yarn test:unit -u && yarn test:func -u && yarn test:e2e -u"
},
"lint-staged": {
"*": [
"prettier --write"
]
},
"dependencies": {
"cosmiconfig": "^8.3.6",
"execa": "^5.0.0",
"fs-extra": "^11.1.1",
"lodash": "^4.17.15",
"minimatch": "^3.0.4",
"p-graph": "^1.1.2",
"p-limit": "^3.0.2",
"prompts": "^2.4.2",
"semver": "^7.0.0",
"toposort": "^2.0.2",
"p-graph": "^1.1.2",
"workspace-tools": "^0.38.0",
"yargs-parser": "^21.0.0"
},
@ -67,8 +73,10 @@
"@types/yargs-parser": "^21.0.0",
"find-free-port": "^2.0.0",
"gh-pages": "^5.0.0",
"husky": "^8.0.0",
"jest": "^29.0.0",
"jest-mock": "^29.0.0",
"lint-staged": "^12.0.0",
"normalized-tmpdir": "^1.0.1",
"prettier": "~2.8.4",
"strip-ansi": "^6.0.1",

Просмотреть файл

@ -22,14 +22,14 @@ import os from 'os';
jest.mock('../packageManager/npm');
describe('publish command (e2e)', () => {
const concurrencyValues = [[1],[os.cpus().length]];
const concurrencyValues = [[1], [os.cpus().length]];
const npmMock = initNpmMock();
let repositoryFactory: RepositoryFactory | undefined;
let repo: Repository | undefined;
// show error logs for these tests
initMockLogs({ alsoLog: ['error'] });
const logs = initMockLogs({ alsoLog: ['error'] });
function getOptions(overrides?: Partial<BeachballOptions>): BeachballOptions {
return {
@ -101,94 +101,100 @@ describe('publish command (e2e)', () => {
});
});
it.each(concurrencyValues)('can perform a successful npm publish from a race condition, concurrency: %s', async (concurrency: number) => {
repositoryFactory = new RepositoryFactory('single');
repo = repositoryFactory.cloneRepository();
it.each(concurrencyValues)(
'can perform a successful npm publish from a race condition, concurrency: %s',
async (concurrency: number) => {
repositoryFactory = new RepositoryFactory('single');
repo = repositoryFactory.cloneRepository();
const options = getOptions({ concurrency: concurrency });
const options = getOptions({ concurrency: concurrency });
generateChangeFiles(['foo'], options);
repo.push();
generateChangeFiles(['foo'], options);
repo.push();
// Adds a step that injects a race condition
let fetchCount = 0;
// Adds a step that injects a race condition
let fetchCount = 0;
addGitObserver((args, output) => {
if (args[0] === 'fetch') {
if (fetchCount === 0) {
const anotherRepo = repositoryFactory!.cloneRepository();
// inject a checkin
anotherRepo.updateJsonFile('package.json', { version: '1.0.2' });
anotherRepo.push();
addGitObserver((args, output) => {
if (args[0] === 'fetch') {
if (fetchCount === 0) {
const anotherRepo = repositoryFactory!.cloneRepository();
// inject a checkin
anotherRepo.updateJsonFile('package.json', { version: '1.0.2' });
anotherRepo.push();
}
fetchCount++;
}
});
fetchCount++;
}
});
await publish(options);
await publish(options);
expect(await npmShow('foo')).toMatchObject({
name: 'foo',
versions: ['1.1.0'],
'dist-tags': { latest: '1.1.0' },
});
expect(await npmShow('foo')).toMatchObject({
name: 'foo',
versions: ['1.1.0'],
'dist-tags': { latest: '1.1.0' },
});
repo.checkout(defaultBranchName);
repo.pull();
expect(repo.getCurrentTags()).toEqual(['foo_v1.1.0']);
repo.checkout(defaultBranchName);
repo.pull();
expect(repo.getCurrentTags()).toEqual(['foo_v1.1.0']);
// this indicates 2 tries
expect(fetchCount).toBe(2);
}
);
// this indicates 2 tries
expect(fetchCount).toBe(2);
});
it.each(concurrencyValues)(
'can perform a successful npm publish from a race condition in the dependencies, concurrency: %s',
async (concurrency: number) => {
repositoryFactory = new RepositoryFactory('single');
repo = repositoryFactory.cloneRepository();
it.each(concurrencyValues)('can perform a successful npm publish from a race condition in the dependencies, concurrency: %s', async (concurrency: number) => {
repositoryFactory = new RepositoryFactory('single');
repo = repositoryFactory.cloneRepository();
const options = getOptions({ concurrency: concurrency });
const options = getOptions({ concurrency: concurrency });
generateChangeFiles(['foo'], options);
repo.push();
generateChangeFiles(['foo'], options);
repo.push();
// Adds a step that injects a race condition
let fetchCount = 0;
// Adds a step that injects a race condition
let fetchCount = 0;
addGitObserver((args, output) => {
if (args[0] === 'fetch') {
if (fetchCount === 0) {
const anotherRepo = repositoryFactory!.cloneRepository();
// inject a checkin
const packageJsonFile = anotherRepo.pathTo('package.json');
const contents = fs.readJSONSync(packageJsonFile, 'utf-8');
delete contents.dependencies.baz;
anotherRepo.commitChange('package.json', JSON.stringify(contents, null, 2));
anotherRepo.push();
}
addGitObserver((args, output) => {
if (args[0] === 'fetch') {
if (fetchCount === 0) {
const anotherRepo = repositoryFactory!.cloneRepository();
// inject a checkin
const packageJsonFile = anotherRepo.pathTo('package.json');
const contents = fs.readJSONSync(packageJsonFile, 'utf-8');
delete contents.dependencies.baz;
anotherRepo.commitChange('package.json', JSON.stringify(contents, null, 2));
anotherRepo.push();
fetchCount++;
}
});
fetchCount++;
}
});
await publish(options);
await publish(options);
expect(await npmShow('foo')).toMatchObject({
name: 'foo',
versions: ['1.1.0'],
'dist-tags': { latest: '1.1.0' },
});
expect(await npmShow('foo')).toMatchObject({
name: 'foo',
versions: ['1.1.0'],
'dist-tags': { latest: '1.1.0' },
});
repo.checkout(defaultBranchName);
repo.pull();
expect(repo.getCurrentTags()).toEqual(['foo_v1.1.0']);
repo.checkout(defaultBranchName);
repo.pull();
expect(repo.getCurrentTags()).toEqual(['foo_v1.1.0']);
// this indicates 2 tries
expect(fetchCount).toBe(2);
// this indicates 2 tries
expect(fetchCount).toBe(2);
const packageJsonFile = repo.pathTo('package.json');
const contents = JSON.parse(fs.readFileSync(packageJsonFile, 'utf-8'));
expect(contents.dependencies.baz).toBeUndefined();
});
const packageJsonFile = repo.pathTo('package.json');
const contents = JSON.parse(fs.readFileSync(packageJsonFile, 'utf-8'));
expect(contents.dependencies.baz).toBeUndefined();
}
);
it('can perform a successful npm publish without bump', async () => {
repositoryFactory = new RepositoryFactory('single');
@ -302,35 +308,38 @@ describe('publish command (e2e)', () => {
expect(repo.getCurrentTags()).toEqual(['bar_v1.3.4', 'foo_v1.1.0']);
});
it.each(concurrencyValues)('should not perform npm publish on out-of-scope package, concurrency: %s', async (concurrency: number) => {
repositoryFactory = new RepositoryFactory('monorepo');
repo = repositoryFactory.cloneRepository();
it.each(concurrencyValues)(
'should not perform npm publish on out-of-scope package, concurrency: %s',
async (concurrency: number) => {
repositoryFactory = new RepositoryFactory('monorepo');
repo = repositoryFactory.cloneRepository();
const options = getOptions({
scope: ['!packages/foo'],
concurrency: concurrency,
});
const options = getOptions({
scope: ['!packages/foo'],
concurrency: concurrency,
});
generateChangeFiles(['foo'], options);
generateChangeFiles(['bar'], options);
repo.push();
generateChangeFiles(['foo'], options);
generateChangeFiles(['bar'], options);
repo.push();
await publish(options);
await publish(options);
await npmShow('foo', { shouldFail: true });
await npmShow('foo', { shouldFail: true });
expect(repo.getCurrentTags()).toEqual([]);
expect(repo.getCurrentTags()).toEqual([]);
expect(await npmShow('bar')).toMatchObject({
name: 'bar',
versions: ['1.4.0'],
'dist-tags': { latest: '1.4.0' },
});
expect(await npmShow('bar')).toMatchObject({
name: 'bar',
versions: ['1.4.0'],
'dist-tags': { latest: '1.4.0' },
});
repo.checkout(defaultBranchName);
repo.pull();
expect(repo.getCurrentTags()).toEqual(['bar_v1.4.0']);
});
repo.checkout(defaultBranchName);
repo.pull();
expect(repo.getCurrentTags()).toEqual(['bar_v1.4.0']);
}
);
it('should respect prepublish hooks', async () => {
repositoryFactory = new RepositoryFactory('monorepo');
@ -435,7 +444,7 @@ describe('publish command (e2e)', () => {
const options = getOptions({
depth: 10,
});
});
generateChangeFiles(['foo'], options);
@ -542,6 +551,7 @@ describe('publish command (e2e)', () => {
});
it('handles errors correctly when one of the packages fails during concurrent publishing', async () => {
logs.setOverrideOptions({ alsoLog: [] });
const packageNames = ['pkg1', 'pkg2', 'pkg3', 'pkg4', 'pkg5', 'pkg6', 'pkg7', 'pkg8'];
const packages: { [packageName: string]: PackageJsonFixture } = {};
const packageToFail = 'pkg4';
@ -571,12 +581,14 @@ describe('publish command (e2e)', () => {
stdout: '',
success: false,
all: 'Failed to publish package',
}
};
}
return _mockNpmPublish(registryData, args, opts);
});
await expect(publish(options)).rejects.toThrow('Error publishing! Refer to the previous logs for recovery instructions.');
await expect(publish(options)).rejects.toThrow(
'Error publishing! Refer to the previous logs for recovery instructions.'
);
for (const name of packageNames) {
if (['pkg7', 'pkg8', packageToFail].includes(name)) {
@ -621,7 +633,7 @@ describe('publish command (e2e)', () => {
let maxConcurrency = 0;
const options = getOptions({
hooks: {
postpublish: async (packagePath) => {
postpublish: async packagePath => {
currentConcurrency++;
await simulateWait(100);
const packageName = path.basename(packagePath);

Просмотреть файл

@ -163,7 +163,9 @@ describe('_mockNpmShow', () => {
// support for this could be added later
it('currently throws if requested version is a range', async () => {
await expect(() => _mockNpmShow(data, ['foo@^1.0.0'], { cwd: undefined })).rejects.toThrow(/not currently supported/);
await expect(() => _mockNpmShow(data, ['foo@^1.0.0'], { cwd: undefined })).rejects.toThrow(
/not currently supported/
);
});
});
@ -199,7 +201,9 @@ describe('_mockNpmPublish', () => {
});
it('throws if cwd is not specified', async () => {
await expect(() => _mockNpmPublish({}, [], { cwd: undefined })).rejects.toThrow('cwd is required for mock npm publish');
await expect(() => _mockNpmPublish({}, [], { cwd: undefined })).rejects.toThrow(
'cwd is required for mock npm publish'
);
});
it('errors if reading package.json fails', async () => {

Просмотреть файл

@ -88,7 +88,7 @@ export function initNpmMock(): NpmMock {
if (!func) {
throw new Error(`Command not supported by mock npm: ${command}`);
}
return await func(registryData, args, opts) as NpmResult;
return (await func(registryData, args, opts)) as NpmResult;
});
});
@ -187,7 +187,11 @@ export const _mockNpmShow: MockNpmCommand = async (registryData, args) => {
};
/** (exported for testing) Mock npm publish to the registry data */
export const _mockNpmPublish: MockNpmCommand = async (registryData, args: string[], opts: Parameters<typeof npm>[1]) => {
export const _mockNpmPublish: MockNpmCommand = async (
registryData,
args: string[],
opts: Parameters<typeof npm>[1]
) => {
if (!opts?.cwd) {
throw new Error('cwd is required for mock npm publish');
}

Просмотреть файл

@ -187,8 +187,8 @@ describe('prepareChangelogPaths', () => {
[file1]: 'md 1',
[file2]: 'md 2',
});
// ensure different timestamps by waiting 1ms
await new Promise(resolve => setTimeout(resolve, 1));
// ensure different timestamps by waiting 5ms
await new Promise(resolve => setTimeout(resolve, 5));
fs.writeFileSync(path.join(tempDir, `CHANGELOG-${lastHash}.md`), 'last md');
const paths = prepareChangelogPathsWrapper({

Просмотреть файл

@ -8,7 +8,11 @@ describe('getPackageGraph', () => {
/**
* @returns all package names in the package graph
*/
async function getPackageGraphPackageNames(affectedPackages: Iterable<string>, packageInfos: PackageInfos, runHook?: (packageInfo: PackageInfo) => Promise<void>): Promise<string[]> {
async function getPackageGraphPackageNames(
affectedPackages: Iterable<string>,
packageInfos: PackageInfos,
runHook?: (packageInfo: PackageInfo) => Promise<void>
): Promise<string[]> {
const visitedPackages: string[] = [];
const packageGraph = getPackageGraph(affectedPackages, packageInfos, async (packageInfo: PackageInfo) => {
visitedPackages.push(packageInfo.name);
@ -27,8 +31,12 @@ describe('getPackageGraph', () => {
/**
* Ensure that both `toposortPackages` and `getPackageGraph` are running the same logic for sorting packages.
*/
async function validateToposortPackagesAndPackageGraph(inputPackages: string[], packageInfos: PackageInfos, possibleSolutions: string[][]): Promise<void> {
const toposortPackagesOutput = (toposortPackages(inputPackages, packageInfos))
async function validateToposortPackagesAndPackageGraph(
inputPackages: string[],
packageInfos: PackageInfos,
possibleSolutions: string[][]
): Promise<void> {
const toposortPackagesOutput = toposortPackages(inputPackages, packageInfos);
const getPackageGraphPackageNamesOutput = await getPackageGraphPackageNames(inputPackages, packageInfos);
expect(possibleSolutions).toContainEqual(toposortPackagesOutput);
@ -53,9 +61,7 @@ describe('getPackageGraph', () => {
foo2: {},
});
await validateToposortPackagesAndPackageGraph(['foo', 'foo2', 'foo3'], packageInfos, [
['foo2', 'foo3', 'foo']
]);
await validateToposortPackagesAndPackageGraph(['foo', 'foo2', 'foo3'], packageInfos, [['foo2', 'foo3', 'foo']]);
});
it('sort packages with different kinds of dependencies', async () => {
@ -81,7 +87,7 @@ describe('getPackageGraph', () => {
});
await validateToposortPackagesAndPackageGraph(['foo', 'foo2', 'foo3', 'foo4'], packageInfos, [
['foo2', 'foo3', 'foo4', 'foo']
['foo2', 'foo3', 'foo4', 'foo'],
]);
});
@ -92,9 +98,7 @@ describe('getPackageGraph', () => {
foo3: { dependencies: { foo2: '1.0.0' } },
});
await validateToposortPackagesAndPackageGraph(['foo', 'foo3'], packageInfos, [
['foo3', 'foo']
]);
await validateToposortPackagesAndPackageGraph(['foo', 'foo3'], packageInfos, [['foo3', 'foo']]);
});
it('do not sort packages if it is not included harder scenario', async () => {
@ -102,24 +106,24 @@ describe('getPackageGraph', () => {
foo: { dependencies: { foo3: '1.0.0', bar: '1.0.0' } },
foo2: { dependencies: { foo4: '1.0.0' } },
foo3: { dependencies: { foo2: '1.0.0' } },
foo4: { dependencies: {}},
foo4: { dependencies: {} },
bar: { dependencies: { foo: '1.0.0' } },
});
await validateToposortPackagesAndPackageGraph(['foo', 'foo3'], packageInfos, [
['foo3', 'foo']
]);
await validateToposortPackagesAndPackageGraph(['foo', 'foo3'], packageInfos, [['foo3', 'foo']]);
});
it('throws if contains circular dependencies inside affected packages', async () => {
const packageInfos = makePackageInfos({
foo: { dependencies: { bar: '1.0.0', } },
foo: { dependencies: { bar: '1.0.0' } },
bar: { dependencies: { foo: '1.0.0' } },
});
await expect(async () => {
await getPackageGraphPackageNames(['foo', 'bar'], packageInfos);
}).rejects.toThrow(/We could not find a node in the graph with no dependencies, this likely means there is a cycle including all nodes/);
}).rejects.toThrow(
/We could not find a node in the graph with no dependencies, this likely means there is a cycle including all nodes/
);
});
it('throws if contains circular dependencies', async () => {
@ -130,25 +134,27 @@ describe('getPackageGraph', () => {
await expect(async () => {
await getPackageGraphPackageNames(['foo', 'bar'], packageInfos);
}).rejects.toThrow(/We could not find a node in the graph with no dependencies, this likely means there is a cycle including all nodes/);
}).rejects.toThrow(
/We could not find a node in the graph with no dependencies, this likely means there is a cycle including all nodes/
);
});
it(`doesn't throws if graph contains circular dependencies outside affected packages`, async () => {
const packageInfos = makePackageInfos({
foo: { dependencies: { } },
bar: { dependencies: { } },
foo: { dependencies: {} },
bar: { dependencies: {} },
bar2: { dependencies: { bar3: '1.0.0' } },
bar3: { dependencies: { bar2: '1.0.0', bar: '1.0.0' } },
});
await getPackageGraphPackageNames(['foo', 'bar'], packageInfos)
await getPackageGraphPackageNames(['foo', 'bar'], packageInfos);
});
it('throws if package info is missing', async () => {
const packageInfos = {} as any as PackageInfos;
await expect(async () => {
await getPackageGraphPackageNames(['foo', 'bar'], packageInfos)
await getPackageGraphPackageNames(['foo', 'bar'], packageInfos);
}).rejects.toThrow(`Package info is missing for foo.`);
});
});

Просмотреть файл

@ -30,7 +30,7 @@ export async function callHook(
await packageGraph.run({
concurrency: concurrency,
continue: false
})
continue: false,
});
}
}

Просмотреть файл

@ -14,11 +14,14 @@ export function getPackageGraph(
});
}
const dependencyGraph: [string | undefined, string][] = getPackageDependencyGraph(Array.from(affectedPackages), packageInfos);
const dependencyGraph: [string | undefined, string][] = getPackageDependencyGraph(
Array.from(affectedPackages),
packageInfos
);
const filteredDependencyGraph = filterDependencyGraph(dependencyGraph);
return pGraph(nodeMap, filteredDependencyGraph);
}
function filterDependencyGraph(dependencyGraph: [string | undefined, string][]): [string, string][] {
return dependencyGraph.filter(([dep, _]) => dep !== undefined) as [string, string][];
}
}

Просмотреть файл

@ -69,7 +69,7 @@ export async function publishToRegistry(originalBumpInfo: PublishBumpInfo, optio
concurrency: options.concurrency,
// This option is set to true to ensure that all tasks that are started are awaited,
// this doesn't actually start tasks for packages of which dependencies have failed.
continue: true
continue: true,
});
}
} catch (error) {

252
yarn.lock
Просмотреть файл

@ -2228,6 +2228,14 @@ agentkeepalive@^2.2.0:
resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-2.2.0.tgz#c5d1bd4b129008f1163f236f86e5faea2026e2ef"
integrity sha512-TnB6ziK363p7lR8QpeLC8aMr8EGYBKZTpgzQLfqTs3bR0Oo5VbKdwKf8h0dSzsYrB7lSCgfJnMZKqShvlq5Oyg==
aggregate-error@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
dependencies:
clean-stack "^2.0.0"
indent-string "^4.0.0"
ajv-errors@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
@ -2286,7 +2294,7 @@ ansi-colors@^3.0.0:
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
ansi-escapes@^4.1.0, ansi-escapes@^4.2.1:
ansi-escapes@^4.1.0, ansi-escapes@^4.2.1, ansi-escapes@^4.3.0:
version "4.3.2"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
@ -2313,6 +2321,11 @@ ansi-regex@^5.0.1:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-regex@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654"
integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@ -2332,6 +2345,11 @@ ansi-styles@^5.0.0:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
ansi-styles@^6.0.0:
version "6.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
anymatch@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@ -2491,6 +2509,11 @@ assign-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
astral-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
async-each@^1.0.1:
version "1.0.6"
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77"
@ -3268,11 +3291,39 @@ clean-css@4.2.x:
dependencies:
source-map "~0.6.0"
clean-stack@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
cli-boxes@^2.2.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
cli-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
dependencies:
restore-cursor "^3.1.0"
cli-truncate@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
dependencies:
slice-ansi "^3.0.0"
string-width "^4.2.0"
cli-truncate@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389"
integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==
dependencies:
slice-ansi "^5.0.0"
string-width "^5.0.0"
cliui@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
@ -3365,6 +3416,11 @@ color@^3.0.0:
color-convert "^1.9.3"
color-string "^1.6.0"
colorette@^2.0.16:
version "2.0.20"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@ -3392,6 +3448,11 @@ commander@7:
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
commander@^9.3.0:
version "9.5.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30"
integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==
commander@~2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
@ -4466,7 +4527,7 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4:
version "4.3.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
@ -4823,6 +4884,11 @@ duplexify@^3.4.2, duplexify@^3.6.0:
readable-stream "^2.0.0"
stream-shift "^1.0.0"
eastasianwidth@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@ -4888,6 +4954,11 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
emoji-regex@^9.2.2:
version "9.2.2"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
emojis-list@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
@ -5301,7 +5372,7 @@ execa@^1.0.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
execa@^5.0.0:
execa@^5.0.0, execa@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
@ -6359,6 +6430,11 @@ human-signals@^2.1.0:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
husky@^8.0.0:
version "8.0.3"
resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184"
integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==
iconv-lite@0.4, iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@ -6471,6 +6547,11 @@ imurmurhash@^0.1.4:
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
indent-string@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
indexes-of@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
@ -6718,6 +6799,11 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-fullwidth-code-point@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88"
integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
is-generator-fn@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
@ -7711,6 +7797,11 @@ levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
lilconfig@2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25"
integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==
lines-and-columns@^1.1.6:
version "1.2.4"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
@ -7723,6 +7814,40 @@ linkify-it@^2.0.0:
dependencies:
uc.micro "^1.0.1"
lint-staged@^12.0.0:
version "12.5.0"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-12.5.0.tgz#d6925747480ae0e380d13988522f9dd8ef9126e3"
integrity sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g==
dependencies:
cli-truncate "^3.1.0"
colorette "^2.0.16"
commander "^9.3.0"
debug "^4.3.4"
execa "^5.1.1"
lilconfig "2.0.5"
listr2 "^4.0.5"
micromatch "^4.0.5"
normalize-path "^3.0.0"
object-inspect "^1.12.2"
pidtree "^0.5.0"
string-argv "^0.3.1"
supports-color "^9.2.2"
yaml "^1.10.2"
listr2@^4.0.5:
version "4.0.5"
resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5"
integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==
dependencies:
cli-truncate "^2.1.0"
colorette "^2.0.16"
log-update "^4.0.0"
p-map "^4.0.0"
rfdc "^1.3.0"
rxjs "^7.5.5"
through "^2.3.8"
wrap-ansi "^7.0.0"
load-script@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4"
@ -7873,6 +7998,16 @@ lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
log-update@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1"
integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==
dependencies:
ansi-escapes "^4.3.0"
cli-cursor "^3.1.0"
slice-ansi "^4.0.0"
wrap-ansi "^6.2.0"
loglevel@^1.6.8:
version "1.9.2"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08"
@ -8134,7 +8269,7 @@ micromatch@^3.1.10, micromatch@^3.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.2"
micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4:
micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5:
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
@ -8565,7 +8700,7 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
object-inspect@^1.13.1:
object-inspect@^1.12.2, object-inspect@^1.13.1:
version "1.13.2"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
@ -8653,7 +8788,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
dependencies:
wrappy "1"
onetime@^5.1.2:
onetime@^5.1.0, onetime@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
@ -8745,6 +8880,13 @@ p-map@^2.0.0:
resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
p-map@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
dependencies:
aggregate-error "^3.0.0"
p-retry@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
@ -8947,6 +9089,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
pidtree@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.5.0.tgz#ad5fbc1de78b8a5f99d6fbdd4f6e4eee21d1aca1"
integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==
pify@^2.0.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@ -9906,6 +10053,14 @@ responselike@^1.0.2:
dependencies:
lowercase-keys "^1.0.0"
restore-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
dependencies:
onetime "^5.1.0"
signal-exit "^3.0.2"
ret@~0.1.10:
version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
@ -9921,6 +10076,11 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rfdc@^1.3.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca"
integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==
rgb-regex@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
@ -9977,6 +10137,13 @@ rw@1:
resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==
rxjs@^7.5.5:
version "7.8.1"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543"
integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==
dependencies:
tslib "^2.1.0"
safe-array-concat@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb"
@ -10289,6 +10456,32 @@ slash@^3.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
slice-ansi@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
dependencies:
ansi-styles "^4.0.0"
astral-regex "^2.0.0"
is-fullwidth-code-point "^3.0.0"
slice-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
dependencies:
ansi-styles "^4.0.0"
astral-regex "^2.0.0"
is-fullwidth-code-point "^3.0.0"
slice-ansi@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a"
integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==
dependencies:
ansi-styles "^6.0.0"
is-fullwidth-code-point "^4.0.0"
smoothscroll-polyfill@^0.4.3:
version "0.4.4"
resolved "https://registry.yarnpkg.com/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz#3a259131dc6930e6ca80003e1cb03b603b69abf8"
@ -10543,6 +10736,11 @@ strict-uri-encode@^1.0.0:
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==
string-argv@^0.3.1:
version "0.3.2"
resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6"
integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==
string-length@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
@ -10569,6 +10767,15 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string-width@^5.0.0:
version "5.1.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
dependencies:
eastasianwidth "^0.2.0"
emoji-regex "^9.2.2"
strip-ansi "^7.0.1"
string.prototype.trim@^1.2.9:
version "1.2.9"
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
@ -10625,6 +10832,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
dependencies:
ansi-regex "^5.0.1"
strip-ansi@^7.0.1:
version "7.1.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
dependencies:
ansi-regex "^6.0.1"
strip-bom-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
@ -10727,6 +10941,11 @@ supports-color@^8.0.0:
dependencies:
has-flag "^4.0.0"
supports-color@^9.2.2:
version "9.4.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954"
integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
@ -10817,7 +11036,7 @@ through2@^2.0.0:
readable-stream "~2.3.6"
xtend "~4.0.1"
"through@>=2.2.7 <3", through@~2.3.4:
"through@>=2.2.7 <3", through@^2.3.8, through@~2.3.4:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
@ -10975,6 +11194,11 @@ ts-jest@^29.0.0:
semver "^7.6.3"
yargs-parser "^21.1.1"
tslib@^2.1.0:
version "2.8.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
tsscmp@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
@ -11872,6 +12096,15 @@ wrap-ansi@^5.1.0:
string-width "^3.0.0"
strip-ansi "^5.0.0"
wrap-ansi@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
@ -11961,6 +12194,11 @@ yallist@^4.0.0:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
yaml@^1.10.2:
version "1.10.2"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yargs-parser@^13.1.2:
version "13.1.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"