From 27c9cdd77c7b0b2f761dc5d0d3cf793c2ef5fbd7 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 23 Nov 2024 21:19:58 +0100 Subject: [PATCH 1/5] refactor: prepare plugin for createNodes v2 --- packages/nx-plugin/src/plugin/plugin.ts | 22 +- .../nx-plugin/src/plugin/plugin.unit.test.ts | 30 +++ .../nx-plugin/src/plugin/target/targets.ts | 16 +- .../src/plugin/target/targets.unit.test.ts | 84 ++----- packages/nx-plugin/src/plugin/types.ts | 7 +- packages/nx-plugin/src/plugin/utils.ts | 75 ++++--- .../nx-plugin/src/plugin/utils.unit.test.ts | 207 +++++++----------- .../test-nx-utils/src/lib/utils/nx-plugin.ts | 8 +- 8 files changed, 205 insertions(+), 244 deletions(-) diff --git a/packages/nx-plugin/src/plugin/plugin.ts b/packages/nx-plugin/src/plugin/plugin.ts index e548bfa7a..7f5bc1271 100644 --- a/packages/nx-plugin/src/plugin/plugin.ts +++ b/packages/nx-plugin/src/plugin/plugin.ts @@ -1,9 +1,11 @@ import type { CreateNodes, CreateNodesContext } from '@nx/devkit'; import type { CreateNodesResult } from 'nx/src/utils/nx-plugin'; import { PROJECT_JSON_FILE_NAME } from '../internal/constants'; -import { createTargets } from './target/targets'; -import type { CreateNodesOptions } from './types'; -import { normalizedCreateNodesContext } from './utils'; +import { + createProjectConfiguration, + loadProjectConfiguration, + normalizeCreateNodesOptions, +} from './utils'; // name has to be "createNodes" to get picked up by Nx export const createNodes: CreateNodes = [ @@ -13,17 +15,19 @@ export const createNodes: CreateNodes = [ createNodesOptions: unknown, context: CreateNodesContext, ): Promise => { - const parsedCreateNodesOptions = createNodesOptions as CreateNodesOptions; - const normalizedContext = await normalizedCreateNodesContext( - context, + const projectJson = await loadProjectConfiguration( projectConfigurationFile, - parsedCreateNodesOptions, ); + const createOptions = normalizeCreateNodesOptions(createNodesOptions); + const { targets } = await createProjectConfiguration( + projectJson, + createOptions, + ); return { projects: { - [normalizedContext.projectRoot]: { - targets: await createTargets(normalizedContext), + [projectJson.root]: { + targets, }, }, }; diff --git a/packages/nx-plugin/src/plugin/plugin.unit.test.ts b/packages/nx-plugin/src/plugin/plugin.unit.test.ts index aa218e617..32e95a999 100644 --- a/packages/nx-plugin/src/plugin/plugin.unit.test.ts +++ b/packages/nx-plugin/src/plugin/plugin.unit.test.ts @@ -20,10 +20,37 @@ describe('@code-pushup/nx-plugin/plugin', () => { vol.reset(); }); + it('should normalize context of project.json with missing root property', async () => { + const projectRoot = '.'; + const matchingFilesData = { + [`${projectRoot}/${PROJECT_JSON_FILE_NAME}`]: `${JSON.stringify({ + name: '@org/empty-root', + })}`, + }; + + await expect( + invokeCreateNodesOnVirtualFiles( + createNodes, + context, + {}, + { matchingFilesData }, + ), + ).resolves.toStrictEqual({ + [projectRoot]: { + targets: { + [`${CP_TARGET_NAME}--configuration`]: { + command: `nx g ${PACKAGE_NAME}:configuration --skipTarget --targetName="code-pushup" --project="@org/empty-root"`, + }, + }, + }, + }); + }); + it('should normalize context and use it to create the configuration target on ROOT project', async () => { const projectRoot = '.'; const matchingFilesData = { [`${projectRoot}/${PROJECT_JSON_FILE_NAME}`]: `${JSON.stringify({ + root: projectRoot, name: '@org/empty-root', })}`, }; @@ -50,6 +77,7 @@ describe('@code-pushup/nx-plugin/plugin', () => { const projectRoot = 'apps/my-app'; const matchingFilesData = { [`${projectRoot}/${PROJECT_JSON_FILE_NAME}`]: `${JSON.stringify({ + root: projectRoot, name: '@org/empty-root', })}`, }; @@ -76,6 +104,7 @@ describe('@code-pushup/nx-plugin/plugin', () => { const projectRoot = '.'; const matchingFilesData = { [`${projectRoot}/${PROJECT_JSON_FILE_NAME}`]: `${JSON.stringify({ + root: projectRoot, name: '@org/empty-root', })}`, [`${projectRoot}/code-pushup.config.ts`]: '{}', @@ -108,6 +137,7 @@ describe('@code-pushup/nx-plugin/plugin', () => { const projectRoot = 'apps/my-app'; const matchingFilesData = { [`${projectRoot}/${PROJECT_JSON_FILE_NAME}`]: `${JSON.stringify({ + root: projectRoot, name: '@org/empty-root', })}`, [`${projectRoot}/code-pushup.config.ts`]: '{}', diff --git a/packages/nx-plugin/src/plugin/target/targets.ts b/packages/nx-plugin/src/plugin/target/targets.ts index e6d62e03a..456506eba 100644 --- a/packages/nx-plugin/src/plugin/target/targets.ts +++ b/packages/nx-plugin/src/plugin/target/targets.ts @@ -1,19 +1,17 @@ +import { ProjectConfiguration } from '@nx/devkit'; import { readdir } from 'node:fs/promises'; import { CP_TARGET_NAME } from '../constants'; -import type { NormalizedCreateNodesContext } from '../types'; +import { NormalizedCreateNodesOptions } from '../types'; import { createConfigurationTarget } from './configuration-target'; import { CODE_PUSHUP_CONFIG_REGEX } from './constants'; import { createExecutorTarget } from './executor-target'; export async function createTargets( - normalizedContext: NormalizedCreateNodesContext, + projectConfig: ProjectConfiguration, + options: NormalizedCreateNodesOptions, ) { - const { - targetName = CP_TARGET_NAME, - bin, - projectPrefix, - } = normalizedContext.createOptions; - const rootFiles = await readdir(normalizedContext.projectRoot); + const { targetName = CP_TARGET_NAME, bin, projectPrefix } = options; + const rootFiles = await readdir(projectConfig.root); return rootFiles.some(filename => filename.match(CODE_PUSHUP_CONFIG_REGEX)) ? { [targetName]: createExecutorTarget({ bin, projectPrefix }), @@ -22,7 +20,7 @@ export async function createTargets( { [`${targetName}--configuration`]: createConfigurationTarget({ targetName, - projectName: normalizedContext.projectJson.name, + projectName: projectConfig.name, bin, }), }; diff --git a/packages/nx-plugin/src/plugin/target/targets.unit.test.ts b/packages/nx-plugin/src/plugin/target/targets.unit.test.ts index 0de7288d2..facabb52d 100644 --- a/packages/nx-plugin/src/plugin/target/targets.unit.test.ts +++ b/packages/nx-plugin/src/plugin/target/targets.unit.test.ts @@ -1,13 +1,19 @@ +import { ProjectConfiguration } from '@nx/devkit'; import { vol } from 'memfs'; import { rm } from 'node:fs/promises'; import { afterEach, beforeEach, expect } from 'vitest'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; import { DEFAULT_TARGET_NAME, PACKAGE_NAME } from '../../internal/constants'; import { CP_TARGET_NAME } from '../constants'; -import type { NormalizedCreateNodesContext } from '../types'; +import type { NormalizedCreateNodesOptions } from '../types'; import { createTargets } from './targets'; describe('createTargets', () => { + const projectName = 'plugin-my-plugin'; + const projectConfig = { + root: '.', + name: projectName, + } as ProjectConfiguration; beforeEach(async () => { // needed to have the folder present. readdir otherwise it fails vol.fromJSON( @@ -24,15 +30,8 @@ describe('createTargets', () => { }); it('should return configuration targets for project without code-pushup config', async () => { - const projectName = 'plugin-my-plugin'; await expect( - createTargets({ - projectRoot: '.', - projectJson: { - name: projectName, - }, - createOptions: {}, - } as NormalizedCreateNodesContext), + createTargets(projectConfig, {} as NormalizedCreateNodesOptions), ).resolves.toStrictEqual({ [`${CP_TARGET_NAME}--configuration`]: { command: `nx g ${PACKAGE_NAME}:configuration --skipTarget --targetName="code-pushup" --project="${projectName}"`, @@ -44,24 +43,15 @@ describe('createTargets', () => { const projectName = 'plugin-my-plugin'; const targetName = 'cp'; await expect( - createTargets({ - projectRoot: '.', - projectJson: { - name: projectName, - }, - createOptions: { - targetName, - }, - } as NormalizedCreateNodesContext), + createTargets(projectConfig, { targetName }), ).resolves.toStrictEqual({ [`${targetName}--configuration`]: { - command: `nx g ${PACKAGE_NAME}:configuration --skipTarget --targetName="cp" --project="${projectName}"`, + command: `nx g ${PACKAGE_NAME}:configuration --skipTarget --targetName="${targetName}" --project="${projectName}"`, }, }); }); it('should NOT return configuration target if code-pushup config is given', async () => { - const projectName = 'plugin-my-plugin'; vol.fromJSON( { [`code-pushup.config.ts`]: `{}`, @@ -70,15 +60,7 @@ describe('createTargets', () => { ); const targetName = 'cp'; await expect( - createTargets({ - projectRoot: '.', - projectJson: { - name: projectName, - }, - createOptions: { - targetName, - }, - } as NormalizedCreateNodesContext), + createTargets(projectConfig, { targetName }), ).resolves.toStrictEqual( expect.not.objectContaining({ [`${targetName}--configuration`]: expect.any(Object), @@ -87,7 +69,6 @@ describe('createTargets', () => { }); it('should return executor target if code-pushup config is given', async () => { - const projectName = 'plugin-my-plugin'; vol.fromJSON( { [`code-pushup.config.ts`]: `{}`, @@ -96,15 +77,7 @@ describe('createTargets', () => { ); const targetName = 'cp'; await expect( - createTargets({ - projectRoot: '.', - projectJson: { - name: projectName, - }, - createOptions: { - targetName, - }, - } as NormalizedCreateNodesContext), + createTargets(projectConfig, { targetName }), ).resolves.toStrictEqual( expect.objectContaining({ [targetName]: { @@ -115,7 +88,6 @@ describe('createTargets', () => { }); it('should return executor targets for project if configured', async () => { - const projectName = 'plugin-my-plugin'; vol.fromJSON( { [`code-pushup.config.ts`]: `{}`, @@ -123,13 +95,7 @@ describe('createTargets', () => { MEMFS_VOLUME, ); await expect( - createTargets({ - projectRoot: '.', - projectJson: { - name: projectName, - }, - createOptions: {}, - } as NormalizedCreateNodesContext), + createTargets(projectConfig, {} as NormalizedCreateNodesOptions), ).resolves.toStrictEqual({ [DEFAULT_TARGET_NAME]: { executor: '@code-pushup/nx-plugin:cli', @@ -138,7 +104,6 @@ describe('createTargets', () => { }); it('should return executor targets for configured project and use given targetName', async () => { - const projectName = 'plugin-my-plugin'; vol.fromJSON( { [`code-pushup.config.ts`]: `{}`, @@ -146,15 +111,7 @@ describe('createTargets', () => { MEMFS_VOLUME, ); await expect( - createTargets({ - projectRoot: '.', - projectJson: { - name: projectName, - }, - createOptions: { - targetName: 'cp', - }, - } as NormalizedCreateNodesContext), + createTargets(projectConfig, { targetName: 'cp' }), ).resolves.toStrictEqual({ cp: { executor: '@code-pushup/nx-plugin:cli', @@ -163,7 +120,6 @@ describe('createTargets', () => { }); it('should include projectPrefix options in executor targets if given', async () => { - const projectName = 'plugin-my-plugin'; vol.fromJSON( { [`code-pushup.config.ts`]: `{}`, @@ -171,15 +127,9 @@ describe('createTargets', () => { MEMFS_VOLUME, ); await expect( - createTargets({ - projectRoot: '.', - projectJson: { - name: projectName, - }, - createOptions: { - projectPrefix: 'cli', - }, - } as NormalizedCreateNodesContext), + createTargets(projectConfig, { + projectPrefix: 'cli', + } as NormalizedCreateNodesOptions), ).resolves.toStrictEqual({ [DEFAULT_TARGET_NAME]: expect.objectContaining({ options: { projectPrefix: 'cli' }, diff --git a/packages/nx-plugin/src/plugin/types.ts b/packages/nx-plugin/src/plugin/types.ts index 17d79ee3b..9174a48b2 100644 --- a/packages/nx-plugin/src/plugin/types.ts +++ b/packages/nx-plugin/src/plugin/types.ts @@ -13,8 +13,13 @@ export type ProjectConfigurationWithName = WithRequired< 'name' >; +export type NormalizedCreateNodesOptions = Omit< + CreateNodesOptions, + 'targetName' +> & + Required>; export type NormalizedCreateNodesContext = CreateNodesContext & { projectJson: ProjectConfigurationWithName; projectRoot: string; - createOptions: CreateNodesOptions; + createOptions: NormalizedCreateNodesOptions; }; diff --git a/packages/nx-plugin/src/plugin/utils.ts b/packages/nx-plugin/src/plugin/utils.ts index 667cb01ff..b47f5c95e 100644 --- a/packages/nx-plugin/src/plugin/utils.ts +++ b/packages/nx-plugin/src/plugin/utils.ts @@ -1,38 +1,49 @@ -import type { CreateNodesContext } from '@nx/devkit'; +import { ProjectConfiguration } from '@nx/devkit'; import { readFile } from 'node:fs/promises'; -import { dirname } from 'node:path'; +import { dirname, join } from 'node:path'; import { CP_TARGET_NAME } from './constants'; -import type { - CreateNodesOptions, - NormalizedCreateNodesContext, - ProjectConfigurationWithName, -} from './types'; +import { createTargets } from './target/targets'; +import { CreateNodesOptions, NormalizedCreateNodesOptions } from './types'; -export async function normalizedCreateNodesContext( - context: CreateNodesContext, - projectConfigurationFile: string, - createOptions: CreateNodesOptions = {}, -): Promise { - const projectRoot = dirname(projectConfigurationFile); - - try { - const projectJson = JSON.parse( - (await readFile(projectConfigurationFile)).toString(), - ) as ProjectConfigurationWithName; +export function normalizeCreateNodesOptions( + options: unknown = {}, +): NormalizedCreateNodesOptions { + const { targetName = CP_TARGET_NAME } = options as CreateNodesOptions; + return { + ...(options as CreateNodesOptions), + targetName, + }; +} - const { targetName = CP_TARGET_NAME } = createOptions; - return { - ...context, - projectJson, - projectRoot, - createOptions: { - ...createOptions, - targetName, - }, - }; - } catch { - throw new Error( - `Error parsing project.json file ${projectConfigurationFile}.`, - ); +export async function loadProjectConfiguration( + projectConfigurationFile: string, +): Promise { + const projectConfiguration: ProjectConfiguration = await readFile( + join(process.cwd(), projectConfigurationFile), + 'utf8', + ).then(JSON.parse); + if ( + !('name' in projectConfiguration) || + typeof projectConfiguration.name !== 'string' + ) { + throw new Error('Project name is required'); } + return { + ...projectConfiguration, + root: projectConfiguration?.root ?? dirname(projectConfigurationFile), + }; +} + +export async function createProjectConfiguration( + projectConfiguration: ProjectConfiguration, + options: CreateNodesOptions, +): Promise< + Pick & + Partial> +> { + const normalizeOptions = normalizeCreateNodesOptions(options); + return { + namedInputs: {}, + targets: await createTargets(projectConfiguration, normalizeOptions), + }; } diff --git a/packages/nx-plugin/src/plugin/utils.unit.test.ts b/packages/nx-plugin/src/plugin/utils.unit.test.ts index f88811467..e053f16f1 100644 --- a/packages/nx-plugin/src/plugin/utils.unit.test.ts +++ b/packages/nx-plugin/src/plugin/utils.unit.test.ts @@ -1,160 +1,121 @@ import { vol } from 'memfs'; -import { describe, expect } from 'vitest'; -import { createNodesContext } from '@code-pushup/test-nx-utils'; +import { beforeEach, describe, expect } from 'vitest'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; -import { normalizedCreateNodesContext } from './utils'; +import * as targets from './target/targets'; +import { + createProjectConfiguration, + loadProjectConfiguration, + normalizeCreateNodesOptions, +} from './utils'; -describe('normalizedCreateNodesContext', () => { - it('should provide workspaceRoot', async () => { - vol.fromJSON( - { - 'project.json': JSON.stringify({ name: 'my-project' }), - }, - MEMFS_VOLUME, - ); - - await expect( - normalizedCreateNodesContext( - createNodesContext({ workspaceRoot: MEMFS_VOLUME }), - 'project.json', - ), - ).resolves.toStrictEqual( - expect.objectContaining({ - workspaceRoot: MEMFS_VOLUME, - }), - ); +describe('normalizeCreateNodesOptions', () => { + it('should provide default targetName in options', () => { + expect(normalizeCreateNodesOptions({})).toStrictEqual({ + targetName: 'code-pushup', + }); }); - it('should provide projectRoot', async () => { - vol.fromJSON( - { - 'packages/utils/project.json': JSON.stringify({ - name: 'my-project', - }), - }, - MEMFS_VOLUME, - ); - - await expect( - normalizedCreateNodesContext( - createNodesContext(), - 'packages/utils/project.json', - ), - ).resolves.toStrictEqual( - expect.objectContaining({ - projectRoot: 'packages/utils', + it('should use provided options', () => { + expect( + normalizeCreateNodesOptions({ + targetName: 'cp', + projectPrefix: 'cli', }), - ); + ).toStrictEqual({ + targetName: 'cp', + projectPrefix: 'cli', + }); }); +}); - it('should provide nxJsonConfiguration', async () => { +describe('loadProjectConfiguration', () => { + it('should load project configuration', async () => { vol.fromJSON( { - 'project.json': JSON.stringify({ - name: 'my-project', - }), - }, - MEMFS_VOLUME, - ); - - await expect( - normalizedCreateNodesContext( - createNodesContext({ - nxJsonConfiguration: { - workspaceLayout: { - libsDir: 'libs', - }, + ['project.json']: JSON.stringify( + { + root: '.', + name: 'my-lib', }, - }), - 'project.json', - ), - ).resolves.toStrictEqual( - expect.objectContaining({ - nxJsonConfiguration: { - workspaceLayout: { - libsDir: 'libs', - }, - }, - }), - ); - }); - - it('should provide projectJson', async () => { - vol.fromJSON( - { - 'project.json': JSON.stringify({ - name: 'my-project', - }), + null, + 2, + ), }, MEMFS_VOLUME, ); - await expect( - normalizedCreateNodesContext(createNodesContext(), 'project.json'), - ).resolves.toStrictEqual( - expect.objectContaining({ - projectJson: { - name: 'my-project', - }, - }), - ); + loadProjectConfiguration('./project.json'), + ).resolves.toStrictEqual({ + root: '.', + name: 'my-lib', + }); }); - it('should throw for empty project.json', async () => { + it('should load project configuration and provide fallback for root if not given', async () => { vol.fromJSON( { - 'project.json': '', + ['packages/project.json']: JSON.stringify( + { + name: 'my-lib', + }, + null, + 2, + ), }, MEMFS_VOLUME, ); - await expect( - normalizedCreateNodesContext(createNodesContext(), 'project.json'), - ).rejects.toThrow('Error parsing project.json file project.json.'); + loadProjectConfiguration('./packages/project.json'), + ).resolves.toStrictEqual({ + root: './packages', + name: 'my-lib', + }); }); +}); - it('should provide default targetName in createOptions', async () => { +describe('createProjectConfiguration', () => { + it('should create project configuration', async () => { + const root = '.'; vol.fromJSON( { - 'project.json': JSON.stringify({ - name: 'my-project', - }), + ['project.json']: JSON.stringify( + { + root, + name: 'my-lib', + }, + null, + 2, + ), }, MEMFS_VOLUME, ); await expect( - normalizedCreateNodesContext(createNodesContext(), 'project.json'), - ).resolves.toStrictEqual( - expect.objectContaining({ - createOptions: { - targetName: 'code-pushup', + createProjectConfiguration( + { + root, + name: 'my-lib', }, - }), - ); + {}, + ), + ).resolves.toStrictEqual({ + namedInputs: {}, + targets: expect.any(Object), + }); }); - it('should provide createOptions', async () => { - vol.fromJSON( - { - 'project.json': JSON.stringify({ - name: 'my-project', - }), - }, - MEMFS_VOLUME, - ); - - await expect( - normalizedCreateNodesContext(createNodesContext(), 'project.json', { - projectPrefix: 'cli', - }), - ).resolves.toStrictEqual( - expect.objectContaining({ - createOptions: { - targetName: 'code-pushup', - projectPrefix: 'cli', - }, - }), - ); + it('should normalize options and pass project configuration and options to createTargets', async () => { + const createTargetsSpy = vi + .spyOn(targets, 'createTargets') + .mockResolvedValue({ proj: {} }); + const projectCfg = { + root: '.', + name: 'my-lib', + }; + await createProjectConfiguration(projectCfg, {}); + expect(createTargetsSpy).toHaveBeenCalledTimes(1); + expect(createTargetsSpy).toHaveBeenCalledWith(projectCfg, { + targetName: 'code-pushup', + }); }); }); diff --git a/testing/test-nx-utils/src/lib/utils/nx-plugin.ts b/testing/test-nx-utils/src/lib/utils/nx-plugin.ts index d074eaa30..d171053c2 100644 --- a/testing/test-nx-utils/src/lib/utils/nx-plugin.ts +++ b/testing/test-nx-utils/src/lib/utils/nx-plugin.ts @@ -7,6 +7,7 @@ import { vol } from 'memfs'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; /** + * @TODO replace this with a better testing approach * Unit Testing helper for the createNodes function of a Nx plugin. * This function will create files over `memfs` from testCfg.matchingFilesData * and invoke the createNodes function on each of the files provided including potential createNodeOptions. @@ -41,9 +42,10 @@ export async function invokeCreateNodesOnVirtualFiles< vol.fromJSON(matchingFilesData, MEMFS_VOLUME); const results = await Promise.all( - Object.keys(matchingFilesData).map(file => - createNodes[1](file, createNodeOptions, context), - ), + Object.keys(matchingFilesData) + // @TODO this will fail for plugins with a different matcher + .filter(f => f.endsWith('project.json')) + .map(file => createNodes[1](file, createNodeOptions, context)), ); const result: NonNullable = {}; From 57e05dc4bed9adb06e20b46eddad8cd57de0aa91 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 23 Nov 2024 21:20:21 +0100 Subject: [PATCH 2/5] test: adjust e2e folder --- e2e/nx-plugin-e2e/tests/plugin-create-nodes.e2e.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/nx-plugin-e2e/tests/plugin-create-nodes.e2e.test.ts b/e2e/nx-plugin-e2e/tests/plugin-create-nodes.e2e.test.ts index 2616ec1da..288b85515 100644 --- a/e2e/nx-plugin-e2e/tests/plugin-create-nodes.e2e.test.ts +++ b/e2e/nx-plugin-e2e/tests/plugin-create-nodes.e2e.test.ts @@ -223,7 +223,7 @@ describe('nx-plugin', () => { }); it('should consider plugin option projectPrefix in executor target', async () => { - const cwd = join(baseDir, 'configuration-option-bin'); + const cwd = join(baseDir, 'configuration-option-project-prefix'); registerPluginInWorkspace(tree, { plugin: '@code-pushup/nx-plugin', options: { From 7378bccf51647f041d8641134c5b7d88a797bc1f Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 23 Nov 2024 21:29:09 +0100 Subject: [PATCH 3/5] fix: fix lint --- packages/nx-plugin/src/plugin/plugin.ts | 2 +- packages/nx-plugin/src/plugin/target/targets.ts | 4 ++-- .../nx-plugin/src/plugin/target/targets.unit.test.ts | 3 +-- packages/nx-plugin/src/plugin/utils.ts | 10 +++++----- packages/nx-plugin/src/plugin/utils.unit.test.ts | 2 +- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/nx-plugin/src/plugin/plugin.ts b/packages/nx-plugin/src/plugin/plugin.ts index 7f5bc1271..69378163e 100644 --- a/packages/nx-plugin/src/plugin/plugin.ts +++ b/packages/nx-plugin/src/plugin/plugin.ts @@ -13,7 +13,7 @@ export const createNodes: CreateNodes = [ async ( projectConfigurationFile: string, createNodesOptions: unknown, - context: CreateNodesContext, + _: CreateNodesContext, ): Promise => { const projectJson = await loadProjectConfiguration( projectConfigurationFile, diff --git a/packages/nx-plugin/src/plugin/target/targets.ts b/packages/nx-plugin/src/plugin/target/targets.ts index 456506eba..a0d882965 100644 --- a/packages/nx-plugin/src/plugin/target/targets.ts +++ b/packages/nx-plugin/src/plugin/target/targets.ts @@ -1,7 +1,7 @@ -import { ProjectConfiguration } from '@nx/devkit'; +import type { ProjectConfiguration } from '@nx/devkit'; import { readdir } from 'node:fs/promises'; import { CP_TARGET_NAME } from '../constants'; -import { NormalizedCreateNodesOptions } from '../types'; +import type { NormalizedCreateNodesOptions } from '../types'; import { createConfigurationTarget } from './configuration-target'; import { CODE_PUSHUP_CONFIG_REGEX } from './constants'; import { createExecutorTarget } from './executor-target'; diff --git a/packages/nx-plugin/src/plugin/target/targets.unit.test.ts b/packages/nx-plugin/src/plugin/target/targets.unit.test.ts index facabb52d..d500bfc26 100644 --- a/packages/nx-plugin/src/plugin/target/targets.unit.test.ts +++ b/packages/nx-plugin/src/plugin/target/targets.unit.test.ts @@ -1,4 +1,4 @@ -import { ProjectConfiguration } from '@nx/devkit'; +import type { ProjectConfiguration } from '@nx/devkit'; import { vol } from 'memfs'; import { rm } from 'node:fs/promises'; import { afterEach, beforeEach, expect } from 'vitest'; @@ -40,7 +40,6 @@ describe('createTargets', () => { }); it('should return configuration targets for empty project without code-pushup config and consider targetName', async () => { - const projectName = 'plugin-my-plugin'; const targetName = 'cp'; await expect( createTargets(projectConfig, { targetName }), diff --git a/packages/nx-plugin/src/plugin/utils.ts b/packages/nx-plugin/src/plugin/utils.ts index b47f5c95e..785cac224 100644 --- a/packages/nx-plugin/src/plugin/utils.ts +++ b/packages/nx-plugin/src/plugin/utils.ts @@ -1,9 +1,9 @@ -import { ProjectConfiguration } from '@nx/devkit'; +import type { ProjectConfiguration } from '@nx/devkit'; import { readFile } from 'node:fs/promises'; import { dirname, join } from 'node:path'; import { CP_TARGET_NAME } from './constants'; import { createTargets } from './target/targets'; -import { CreateNodesOptions, NormalizedCreateNodesOptions } from './types'; +import type { CreateNodesOptions, NormalizedCreateNodesOptions } from './types'; export function normalizeCreateNodesOptions( options: unknown = {}, @@ -18,10 +18,10 @@ export function normalizeCreateNodesOptions( export async function loadProjectConfiguration( projectConfigurationFile: string, ): Promise { - const projectConfiguration: ProjectConfiguration = await readFile( + const projectConfiguration = (await readFile( join(process.cwd(), projectConfigurationFile), 'utf8', - ).then(JSON.parse); + ).then(JSON.parse)) as Omit & { root?: string }; if ( !('name' in projectConfiguration) || typeof projectConfiguration.name !== 'string' @@ -30,7 +30,7 @@ export async function loadProjectConfiguration( } return { ...projectConfiguration, - root: projectConfiguration?.root ?? dirname(projectConfigurationFile), + root: projectConfiguration.root ?? dirname(projectConfigurationFile), }; } diff --git a/packages/nx-plugin/src/plugin/utils.unit.test.ts b/packages/nx-plugin/src/plugin/utils.unit.test.ts index e053f16f1..36c2a74de 100644 --- a/packages/nx-plugin/src/plugin/utils.unit.test.ts +++ b/packages/nx-plugin/src/plugin/utils.unit.test.ts @@ -1,5 +1,5 @@ import { vol } from 'memfs'; -import { beforeEach, describe, expect } from 'vitest'; +import { describe, expect } from 'vitest'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; import * as targets from './target/targets'; import { From 94820d35a650dae5b296757a5134c8cf0378b139 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 23 Nov 2024 22:09:28 +0100 Subject: [PATCH 4/5] test: refactor tests of create nodes v1 --- packages/nx-plugin/src/plugin/plugin.ts | 48 ++--- .../nx-plugin/src/plugin/plugin.unit.test.ts | 195 +++++++++--------- .../test-nx-utils/src/lib/utils/nx-plugin.ts | 57 +---- .../src/lib/utils/nx-plugin.unit.test.ts | 39 +--- 4 files changed, 123 insertions(+), 216 deletions(-) diff --git a/packages/nx-plugin/src/plugin/plugin.ts b/packages/nx-plugin/src/plugin/plugin.ts index 69378163e..842d8cf83 100644 --- a/packages/nx-plugin/src/plugin/plugin.ts +++ b/packages/nx-plugin/src/plugin/plugin.ts @@ -7,29 +7,31 @@ import { normalizeCreateNodesOptions, } from './utils'; +type FileMatcher = `${string}${typeof PROJECT_JSON_FILE_NAME}`; + // name has to be "createNodes" to get picked up by Nx -export const createNodes: CreateNodes = [ - `**/${PROJECT_JSON_FILE_NAME}`, - async ( - projectConfigurationFile: string, - createNodesOptions: unknown, - _: CreateNodesContext, - ): Promise => { - const projectJson = await loadProjectConfiguration( - projectConfigurationFile, - ); - const createOptions = normalizeCreateNodesOptions(createNodesOptions); +export const createNodes = [ + `**/${PROJECT_JSON_FILE_NAME}` as FileMatcher, + createNodesV1Fn, +] satisfies CreateNodes; + +export async function createNodesV1Fn( + projectConfigurationFile: string, + createNodesOptions: unknown, + _: CreateNodesContext, +): Promise { + const projectJson = await loadProjectConfiguration(projectConfigurationFile); + const createOptions = normalizeCreateNodesOptions(createNodesOptions); - const { targets } = await createProjectConfiguration( - projectJson, - createOptions, - ); - return { - projects: { - [projectJson.root]: { - targets, - }, + const { targets } = await createProjectConfiguration( + projectJson, + createOptions, + ); + return { + projects: { + [projectJson.root]: { + targets, }, - }; - }, -]; + }, + }; +} diff --git a/packages/nx-plugin/src/plugin/plugin.unit.test.ts b/packages/nx-plugin/src/plugin/plugin.unit.test.ts index 32e95a999..bd3f68cb5 100644 --- a/packages/nx-plugin/src/plugin/plugin.unit.test.ts +++ b/packages/nx-plugin/src/plugin/plugin.unit.test.ts @@ -1,45 +1,37 @@ import type { CreateNodesContext } from '@nx/devkit'; import { vol } from 'memfs'; +import { join } from 'node:path'; import { describe, expect } from 'vitest'; -import { invokeCreateNodesOnVirtualFiles } from '@code-pushup/test-nx-utils'; +import { MEMFS_VOLUME } from '@code-pushup/test-utils'; import { PACKAGE_NAME, PROJECT_JSON_FILE_NAME } from '../internal/constants'; import { CP_TARGET_NAME } from './constants'; -import { createNodes } from './plugin'; +import { createNodesV1Fn } from './plugin'; -describe('@code-pushup/nx-plugin/plugin', () => { - let context: CreateNodesContext; - - beforeEach(() => { - context = { - nxJsonConfiguration: {}, - workspaceRoot: '', - }; - }); - - afterEach(() => { - vol.reset(); - }); +describe('createNodesV1Fn', () => { + const context: CreateNodesContext = { + nxJsonConfiguration: {}, + workspaceRoot: '', + }; it('should normalize context of project.json with missing root property', async () => { - const projectRoot = '.'; - const matchingFilesData = { - [`${projectRoot}/${PROJECT_JSON_FILE_NAME}`]: `${JSON.stringify({ - name: '@org/empty-root', - })}`, - }; + vol.fromJSON( + { + [PROJECT_JSON_FILE_NAME]: `${JSON.stringify({ + name: '@org/empty-root', + })}`, + }, + MEMFS_VOLUME, + ); await expect( - invokeCreateNodesOnVirtualFiles( - createNodes, - context, - {}, - { matchingFilesData }, - ), + createNodesV1Fn(PROJECT_JSON_FILE_NAME, {}, context), ).resolves.toStrictEqual({ - [projectRoot]: { - targets: { - [`${CP_TARGET_NAME}--configuration`]: { - command: `nx g ${PACKAGE_NAME}:configuration --skipTarget --targetName="code-pushup" --project="@org/empty-root"`, + projects: { + ['.']: { + targets: { + [`${CP_TARGET_NAME}--configuration`]: { + command: `nx g ${PACKAGE_NAME}:configuration --skipTarget --targetName="code-pushup" --project="@org/empty-root"`, + }, }, }, }, @@ -47,26 +39,24 @@ describe('@code-pushup/nx-plugin/plugin', () => { }); it('should normalize context and use it to create the configuration target on ROOT project', async () => { - const projectRoot = '.'; - const matchingFilesData = { - [`${projectRoot}/${PROJECT_JSON_FILE_NAME}`]: `${JSON.stringify({ - root: projectRoot, - name: '@org/empty-root', - })}`, - }; + vol.fromJSON( + { + [PROJECT_JSON_FILE_NAME]: `${JSON.stringify({ + name: '@org/empty-root', + })}`, + }, + MEMFS_VOLUME, + ); await expect( - invokeCreateNodesOnVirtualFiles( - createNodes, - context, - {}, - { matchingFilesData }, - ), + createNodesV1Fn(PROJECT_JSON_FILE_NAME, {}, context), ).resolves.toStrictEqual({ - [projectRoot]: { - targets: { - [`${CP_TARGET_NAME}--configuration`]: { - command: `nx g ${PACKAGE_NAME}:configuration --skipTarget --targetName="code-pushup" --project="@org/empty-root"`, + projects: { + ['.']: { + targets: { + [`${CP_TARGET_NAME}--configuration`]: { + command: `nx g ${PACKAGE_NAME}:configuration --skipTarget --targetName="code-pushup" --project="@org/empty-root"`, + }, }, }, }, @@ -75,25 +65,25 @@ describe('@code-pushup/nx-plugin/plugin', () => { it('should normalize context and use it to create the configuration target on PACKAGE project', async () => { const projectRoot = 'apps/my-app'; - const matchingFilesData = { - [`${projectRoot}/${PROJECT_JSON_FILE_NAME}`]: `${JSON.stringify({ - root: projectRoot, - name: '@org/empty-root', - })}`, - }; + vol.fromJSON( + { + [join(projectRoot, PROJECT_JSON_FILE_NAME)]: `${JSON.stringify({ + root: projectRoot, + name: '@org/empty-root', + })}`, + }, + MEMFS_VOLUME, + ); await expect( - invokeCreateNodesOnVirtualFiles( - createNodes, - context, - {}, - { matchingFilesData }, - ), + createNodesV1Fn(join(projectRoot, PROJECT_JSON_FILE_NAME), {}, context), ).resolves.toStrictEqual({ - [projectRoot]: { - targets: { - [`${CP_TARGET_NAME}--configuration`]: { - command: `nx g ${PACKAGE_NAME}:configuration --skipTarget --targetName="code-pushup" --project="@org/empty-root"`, + projects: { + [projectRoot]: { + targets: { + [`${CP_TARGET_NAME}--configuration`]: { + command: `nx g ${PACKAGE_NAME}:configuration --skipTarget --targetName="code-pushup" --project="@org/empty-root"`, + }, }, }, }, @@ -101,31 +91,34 @@ describe('@code-pushup/nx-plugin/plugin', () => { }); it('should create the executor target on ROOT project if configured', async () => { - const projectRoot = '.'; - const matchingFilesData = { - [`${projectRoot}/${PROJECT_JSON_FILE_NAME}`]: `${JSON.stringify({ - root: projectRoot, - name: '@org/empty-root', - })}`, - [`${projectRoot}/code-pushup.config.ts`]: '{}', - }; + vol.fromJSON( + { + [PROJECT_JSON_FILE_NAME]: `${JSON.stringify({ + root: '.', + name: '@org/empty-root', + })}`, + ['code-pushup.config.ts']: '{}', + }, + MEMFS_VOLUME, + ); await expect( - invokeCreateNodesOnVirtualFiles( - createNodes, - context, + createNodesV1Fn( + PROJECT_JSON_FILE_NAME, { projectPrefix: 'cli', }, - { matchingFilesData }, + context, ), ).resolves.toStrictEqual({ - [projectRoot]: { - targets: { - [CP_TARGET_NAME]: { - executor: `${PACKAGE_NAME}:cli`, - options: { - projectPrefix: 'cli', + projects: { + ['.']: { + targets: { + [CP_TARGET_NAME]: { + executor: `${PACKAGE_NAME}:cli`, + options: { + projectPrefix: 'cli', + }, }, }, }, @@ -135,30 +128,34 @@ describe('@code-pushup/nx-plugin/plugin', () => { it('should create the executor target on PACKAGE project if configured', async () => { const projectRoot = 'apps/my-app'; - const matchingFilesData = { - [`${projectRoot}/${PROJECT_JSON_FILE_NAME}`]: `${JSON.stringify({ - root: projectRoot, - name: '@org/empty-root', - })}`, - [`${projectRoot}/code-pushup.config.ts`]: '{}', - }; + vol.fromJSON( + { + [join(projectRoot, PROJECT_JSON_FILE_NAME)]: `${JSON.stringify({ + root: projectRoot, + name: '@org/empty-root', + })}`, + [join(projectRoot, 'code-pushup.config.ts')]: '{}', + }, + MEMFS_VOLUME, + ); await expect( - invokeCreateNodesOnVirtualFiles( - createNodes, - context, + createNodesV1Fn( + join(projectRoot, PROJECT_JSON_FILE_NAME), { projectPrefix: 'cli', }, - { matchingFilesData }, + context, ), ).resolves.toStrictEqual({ - [projectRoot]: { - targets: { - [CP_TARGET_NAME]: { - executor: `${PACKAGE_NAME}:cli`, - options: { - projectPrefix: 'cli', + projects: { + [projectRoot]: { + targets: { + [CP_TARGET_NAME]: { + executor: `${PACKAGE_NAME}:cli`, + options: { + projectPrefix: 'cli', + }, }, }, }, diff --git a/testing/test-nx-utils/src/lib/utils/nx-plugin.ts b/testing/test-nx-utils/src/lib/utils/nx-plugin.ts index d171053c2..e7a48a998 100644 --- a/testing/test-nx-utils/src/lib/utils/nx-plugin.ts +++ b/testing/test-nx-utils/src/lib/utils/nx-plugin.ts @@ -1,59 +1,4 @@ -import type { - CreateNodes, - CreateNodesContext, - CreateNodesResult, -} from '@nx/devkit'; -import { vol } from 'memfs'; -import { MEMFS_VOLUME } from '@code-pushup/test-utils'; - -/** - * @TODO replace this with a better testing approach - * Unit Testing helper for the createNodes function of a Nx plugin. - * This function will create files over `memfs` from testCfg.matchingFilesData - * and invoke the createNodes function on each of the files provided including potential createNodeOptions. - * It will aggregate the results of each invocation and return the projects from CreateNodesResult. - * - * @example - * ```ts - * const projects = await createFilesAndInvokeCreateNodesOnThem(createNodes, context, undefined, { matchingFilesData}); - * // project should have one target created - * const targets = projects[projectRoot]?.targets ?? {}; - * expect(Object.keys(targets)).toHaveLength(1); - * // target should be the init target - * expect(targets[`${CP_TARGET_NAME}--init`]).toBeDefined(); - * ``` - * - * @param createNodes - * @param context - * @param createNodeOptions - * @param mockData - */ -export async function invokeCreateNodesOnVirtualFiles< - T extends Record | undefined, ->( - createNodes: CreateNodes, - context: CreateNodesContext, - createNodeOptions: T, - mockData: { - matchingFilesData: Record; - }, -) { - const { matchingFilesData } = mockData; - vol.fromJSON(matchingFilesData, MEMFS_VOLUME); - - const results = await Promise.all( - Object.keys(matchingFilesData) - // @TODO this will fail for plugins with a different matcher - .filter(f => f.endsWith('project.json')) - .map(file => createNodes[1](file, createNodeOptions, context)), - ); - - const result: NonNullable = {}; - return results.reduce( - (acc, { projects }) => ({ ...acc, ...projects }), - result, - ); -} +import type { CreateNodesContext } from '@nx/devkit'; export function createNodesContext( options?: Partial, diff --git a/testing/test-nx-utils/src/lib/utils/nx-plugin.unit.test.ts b/testing/test-nx-utils/src/lib/utils/nx-plugin.unit.test.ts index d4b77cfc3..24a670677 100644 --- a/testing/test-nx-utils/src/lib/utils/nx-plugin.unit.test.ts +++ b/testing/test-nx-utils/src/lib/utils/nx-plugin.unit.test.ts @@ -1,9 +1,6 @@ import * as process from 'node:process'; import { describe, expect } from 'vitest'; -import { - createNodesContext, - invokeCreateNodesOnVirtualFiles, -} from './nx-plugin'; +import { createNodesContext } from './nx-plugin'; describe('createNodesContext', () => { it('should return a context with the provided options', () => { @@ -25,37 +22,3 @@ describe('createNodesContext', () => { }); }); }); - -describe('invokeCreateNodesOnVirtualFiles', () => { - it('should invoke passed function if matching file is given', async () => { - const createNodesFnSpy = vi.fn().mockResolvedValue({}); - await expect( - invokeCreateNodesOnVirtualFiles( - [`**/project.json`, createNodesFnSpy], - createNodesContext(), - {}, - { - matchingFilesData: { - '**/project.json': JSON.stringify({ - name: 'my-lib', - }), - }, - }, - ), - ).resolves.toStrictEqual({}); - expect(createNodesFnSpy).toHaveBeenCalledTimes(1); - }); - - it('should NOT invoke passed function if matching file is NOT given', async () => { - const createNodesFnSpy = vi.fn().mockResolvedValue({}); - await expect( - invokeCreateNodesOnVirtualFiles( - [`**/project.json`, createNodesFnSpy], - createNodesContext(), - {}, - { matchingFilesData: {} }, - ), - ).resolves.toStrictEqual({}); - expect(createNodesFnSpy).not.toHaveBeenCalled(); - }); -}); From 1f978964366b7e365f9cb425e6c8a06c5bb7790c Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 22 Dec 2024 22:21:15 +0100 Subject: [PATCH 5/5] wip --- .eslintignore | 5 - .eslintrc.json | 116 - .github/labeler.yml | 1 - .nvmrc | 2 +- .prettierignore | 2 +- .tool-versions | 2 +- CHANGELOG.md | 47 + code-pushup.config.ts | 39 +- code-pushup.preset.ts | 13 +- commitlint.config.mjs => commitlint.config.js | 0 docs/e2e.md | 4 +- e2e/ci-e2e/.eslintrc.json | 12 - e2e/ci-e2e/eslint.config.js | 12 + e2e/ci-e2e/mocks/api.ts | 14 + .../code-pushup.config.ts | 0 .../fixtures/{ci-test-repo => basic}/index.js | 0 .../npm-workspaces/code-pushup/categories.js | 9 + .../code-pushup/ts-migration.plugin.js | 44 + .../fixtures/npm-workspaces/package-lock.json | 42 + .../fixtures/npm-workspaces/package.json | 6 + .../packages/cli/code-pushup.config.js | 7 + .../npm-workspaces/packages/cli/package.json | 10 + .../npm-workspaces/packages/cli/src/bin.js | 1 + .../packages/core/code-pushup.config.js | 7 + .../npm-workspaces/packages/core/package.json | 10 + .../npm-workspaces/packages/core/src/index.js | 1 + .../packages/utils/code-pushup.config.js | 7 + .../packages/utils/package.json | 7 + .../packages/utils/src/index.js | 1 + .../apps/api/code-pushup.config.js | 3 + .../nx-monorepo/apps/api/project.json | 9 + .../nx-monorepo/apps/api/src/index.js | 1 + .../apps/cms/code-pushup.config.js | 3 + .../nx-monorepo/apps/cms/project.json | 9 + .../nx-monorepo/apps/cms/src/index.js | 1 + .../apps/web/code-pushup.config.js | 3 + .../nx-monorepo/apps/web/project.json | 9 + .../nx-monorepo/apps/web/src/index.ts | 1 + .../nx-monorepo/code-pushup.preset.js | 66 + .../nx-monorepo/libs/ui/code-pushup.config.js | 3 + .../fixtures/nx-monorepo/libs/ui/project.json | 9 + .../nx-monorepo/libs/ui/src/index.test.ts | 6 + .../fixtures/nx-monorepo/libs/ui/src/index.ts | 1 + .../libs/utils/code-pushup.config.js | 3 + .../nx-monorepo/libs/utils/project.json | 9 + .../nx-monorepo/libs/utils/src/index.js | 1 + .../nx-monorepo/libs/utils/src/index.test.js | 6 + e2e/ci-e2e/mocks/fixtures/nx-monorepo/nx.json | 4 + e2e/ci-e2e/mocks/setup.ts | 43 + .../{report-diff.md => basic-report-diff.md} | 0 .../npm-workspaces-report-diff.md | 45 + .../__snapshots__/nx-monorepo-report-diff.md | 64 + e2e/ci-e2e/tests/basic.e2e.test.ts | 130 + e2e/ci-e2e/tests/ci.e2e.test.ts | 185 - e2e/ci-e2e/tests/npm-workspaces.e2e.test.ts | 167 + e2e/ci-e2e/tests/nx-monorepo.e2e.test.ts | 197 + e2e/ci-e2e/vite.config.e2e.ts | 2 +- e2e/cli-e2e/.eslintrc.json | 12 - e2e/cli-e2e/eslint.config.js | 12 + .../dummy-setup/code-pushup.config.js | 2 +- .../dummy-setup/code-pushup.config.mjs | 2 +- .../dummy-setup/code-pushup.config.ts | 2 +- .../fixtures/dummy-setup/dummy.plugin.ts | 4 +- .../existing-reports/code-pushup.config.ts | 2 +- .../fixtures/existing-reports/dummy.plugin.ts | 4 +- e2e/cli-e2e/tests/collect.e2e.test.ts | 12 +- e2e/cli-e2e/tests/compare.e2e.test.ts | 18 +- e2e/cli-e2e/tests/help.e2e.test.ts | 4 +- e2e/cli-e2e/tests/print-config.e2e.test.ts | 10 +- e2e/cli-e2e/vite.config.e2e.ts | 2 +- e2e/create-cli-e2e/.eslintrc.json | 12 - e2e/create-cli-e2e/eslint.config.js | 12 + e2e/create-cli-e2e/project.json | 1 + e2e/create-cli-e2e/tests/init.e2e.test.ts | 48 +- e2e/create-cli-e2e/vite.config.e2e.ts | 2 +- e2e/nx-plugin-e2e/.eslintrc.json | 12 - e2e/nx-plugin-e2e/eslint.config.js | 12 + .../plugin-create-nodes.e2e.test.ts.snap | 3 + .../tests/executor-cli.e2e.test.ts | 35 +- .../tests/generator-configuration.e2e.test.ts | 39 +- .../tests/generator-init.e2e.test.ts | 18 +- e2e/nx-plugin-e2e/tests/inline-plugin.ts | 21 + .../tests/plugin-create-nodes.e2e.test.ts | 64 +- e2e/nx-plugin-e2e/vite.config.e2e.ts | 2 +- .../tests/plugin-create-nodes.e2e.test.ts | 22 +- e2e/plugin-coverage-e2e/.eslintrc.json | 12 - e2e/plugin-coverage-e2e/eslint.config.js | 12 + .../existing-report/code-pushup.config.ts | 4 +- .../tests/collect.e2e.test.ts | 23 +- e2e/plugin-coverage-e2e/vite.config.e2e.ts | 2 +- e2e/plugin-eslint-e2e/.eslintrc.json | 12 - e2e/plugin-eslint-e2e/eslint.config.js | 12 + .../fixtures/flat-config/eslint.config.cjs | 2 +- .../fixtures/legacy-config/.eslintrc.json | 2 +- .../tests/collect.e2e.test.ts | 29 +- e2e/plugin-eslint-e2e/vite.config.e2e.ts | 2 +- e2e/plugin-lighthouse-e2e/.eslintrc.json | 12 - e2e/plugin-lighthouse-e2e/eslint.config.js | 12 + .../tests/collect.e2e.test.ts | 11 +- e2e/plugin-lighthouse-e2e/vite.config.e2e.ts | 2 +- esbuild.config.js | 57 - eslint.config.js | 121 + examples/plugins/.eslintrc.json | 29 - examples/plugins/code-pushup.config.ts | 6 +- examples/plugins/eslint.config.js | 12 + examples/plugins/mocks/constants.ts | 2 +- examples/plugins/project.json | 5 +- .../src/file-size.plugin.integration.test.ts | 2 +- .../src/file-size/src/file-size.plugin.ts | 10 +- .../src/file-size.plugin.unit.test.ts | 10 +- examples/plugins/src/index.ts | 8 +- examples/plugins/src/lighthouse/README.md | 4 +- .../plugins/src/lighthouse/src/constants.ts | 5 +- examples/plugins/src/lighthouse/src/index.ts | 4 +- .../src/lighthouse.plugin.integration.test.ts | 10 +- .../src/lighthouse/src/lighthouse.plugin.ts | 15 +- .../src/lighthouse.plugin.unit.test.ts | 4 +- examples/plugins/src/lighthouse/src/utils.ts | 8 +- .../src/lighthouse/src/utils.unit.test.ts | 2 +- .../plugins/src/package-json/src/constants.ts | 6 +- .../plugins/src/package-json/src/index.ts | 6 +- .../src/integration/dependencies.audit.ts | 4 +- .../dependencies.audit.unit.test.ts | 4 +- .../src/integration/license.audit.ts | 4 +- .../integration/license.audit.unit.test.ts | 4 +- .../src/integration/type.audit.ts | 4 +- .../src/integration/type.audit.unit.test.ts | 6 +- .../src/package-json/src/integration/utils.ts | 2 +- .../package-json.plugin.integration.test.ts | 6 +- .../package-json/src/package-json.plugin.ts | 12 +- .../plugins/src/package-json/src/scoring.ts | 8 +- examples/plugins/vite.config.integration.ts | 2 +- examples/plugins/vite.config.unit.ts | 2 +- knip.config.ts | 1 - nx.json | 18 +- package-lock.json | 18592 ++++++++-------- package.json | 124 +- packages/ci/.eslintrc.json | 25 - packages/ci/README.md | 54 +- packages/ci/eslint.config.js | 31 + .../ci/mocks/fixtures/code-pushup.config.ts | 44 - .../monorepos/custom/backend/api/package.json | 6 + .../custom/backend/auth/package.json | 6 + .../monorepos/custom/frontend/package.json | 6 + .../fixtures/monorepos/npm/package-lock.json | 27 + .../mocks/fixtures/monorepos/npm/package.json | 6 + .../monorepos/npm/packages/cli/package.json | 6 + .../monorepos/npm/packages/core/package.json | 6 + .../monorepos/npm/packages/utils/package.json | 6 + .../ci/mocks/fixtures/monorepos/nx/.gitignore | 1 + .../ci/mocks/fixtures/monorepos/nx/nx.json | 1 + .../fixtures/monorepos/nx/package-lock.json | 6 + .../mocks/fixtures/monorepos/nx/package.json | 1 + .../monorepos/nx/packages/cli/project.json | 8 + .../monorepos/nx/packages/core/project.json | 8 + .../monorepos/nx/packages/utils/project.json | 8 + .../fixtures/monorepos/nx/tsconfig.base.json | 1 + .../fixtures/monorepos/pnpm/package.json | 3 + .../monorepos/pnpm/packages/cli/package.json | 6 + .../monorepos/pnpm/packages/core/package.json | 6 + .../pnpm/packages/utils/package.json | 6 + .../fixtures/monorepos/pnpm/pnpm-lock.yaml | 14 + .../monorepos/pnpm/pnpm-workspace.yaml | 2 + .../fixtures/monorepos/turbo/package.json | 7 + .../monorepos/turbo/packages/cli/package.json | 6 + .../turbo/packages/core/package.json | 6 + .../turbo/packages/utils/package.json | 6 + .../mocks/fixtures/monorepos/turbo/turbo.json | 8 + .../mocks/fixtures/monorepos/turbo/yarn.lock | 4 + .../fixtures/monorepos/yarn/package.json | 7 + .../monorepos/yarn/packages/cli/package.json | 6 + .../monorepos/yarn/packages/core/package.json | 6 + .../yarn/packages/utils/package.json | 6 + .../mocks/fixtures/monorepos/yarn/yarn.lock | 30 + .../mocks/fixtures/{ => outputs}/config.json | 0 .../ci/mocks/fixtures/outputs/diff-merged.md | 45 + .../diff-project.json} | 0 .../diff-project.md} | 0 .../report.json => outputs/report-after.json} | 0 .../report.md => outputs/report-after.md} | 0 .../report-before.json} | 0 .../report.md => outputs/report-before.md} | 0 packages/ci/package.json | 11 +- packages/ci/project.json | 5 +- packages/ci/src/index.ts | 8 +- packages/ci/src/lib/cli/commands/collect.ts | 16 +- packages/ci/src/lib/cli/commands/compare.ts | 16 +- .../ci/src/lib/cli/commands/merge-diffs.ts | 29 +- .../ci/src/lib/cli/commands/print-config.ts | 23 +- packages/ci/src/lib/cli/context.ts | 12 +- packages/ci/src/lib/cli/context.unit.test.ts | 48 +- packages/ci/src/lib/cli/index.ts | 12 +- packages/ci/src/lib/cli/persist.ts | 124 +- packages/ci/src/lib/cli/persist.unit.test.ts | 218 +- packages/ci/src/lib/comment.ts | 2 +- packages/ci/src/lib/comment.unit.test.ts | 8 +- packages/ci/src/lib/constants.ts | 6 +- packages/ci/src/lib/git.integration.test.ts | 25 +- packages/ci/src/lib/issues.ts | 2 +- packages/ci/src/lib/issues.unit.test.ts | 2 +- packages/ci/src/lib/models.ts | 21 +- packages/ci/src/lib/monorepo/detect-tool.ts | 4 +- .../ci/src/lib/monorepo/handlers/index.ts | 12 +- packages/ci/src/lib/monorepo/handlers/npm.ts | 22 +- .../lib/monorepo/handlers/npm.unit.test.ts | 205 + packages/ci/src/lib/monorepo/handlers/nx.ts | 42 +- .../src/lib/monorepo/handlers/nx.unit.test.ts | 163 + packages/ci/src/lib/monorepo/handlers/pnpm.ts | 40 +- .../lib/monorepo/handlers/pnpm.unit.test.ts | 227 + .../ci/src/lib/monorepo/handlers/turbo.ts | 40 +- .../lib/monorepo/handlers/turbo.unit.test.ts | 223 + packages/ci/src/lib/monorepo/handlers/yarn.ts | 41 +- .../lib/monorepo/handlers/yarn.unit.test.ts | 265 + packages/ci/src/lib/monorepo/index.ts | 6 +- packages/ci/src/lib/monorepo/list-projects.ts | 94 +- .../lib/monorepo/list-projects.unit.test.ts | 256 +- packages/ci/src/lib/monorepo/packages.ts | 10 +- .../ci/src/lib/monorepo/packages.unit.test.ts | 377 + packages/ci/src/lib/monorepo/tools.ts | 11 + packages/ci/src/lib/run-monorepo.ts | 286 + packages/ci/src/lib/run-standalone.ts | 28 + packages/ci/src/lib/run-utils.ts | 314 + packages/ci/src/lib/run.integration.test.ts | 1213 +- packages/ci/src/lib/run.ts | 268 +- packages/ci/vite.config.integration.ts | 2 +- packages/ci/vite.config.unit.ts | 2 +- packages/cli/.eslintrc.json | 20 - packages/cli/docs/custom-plugins.md | 8 +- packages/cli/eslint.config.js | 21 + packages/cli/mocks/constants.ts | 6 +- packages/cli/package.json | 12 +- packages/cli/project.json | 5 +- packages/cli/src/index.ts | 2 +- .../cli/src/lib/autorun/autorun-command.ts | 4 +- .../lib/autorun/autorun-command.unit.test.ts | 6 +- packages/cli/src/lib/cli.ts | 10 +- .../cli/src/lib/collect/collect-command.ts | 4 +- .../lib/collect/collect-command.unit.test.ts | 6 +- packages/cli/src/lib/commands.ts | 14 +- .../cli/src/lib/compare/compare-command.ts | 6 +- .../lib/compare/compare-command.unit.test.ts | 6 +- .../cli/src/lib/history/history-command.ts | 10 +- .../lib/history/history-command.unit.test.ts | 6 +- .../cli/src/lib/history/history.options.ts | 4 +- packages/cli/src/lib/history/utils.ts | 2 +- .../cli/src/lib/history/utils.unit.test.ts | 4 +- .../src/lib/implementation/compare.options.ts | 2 +- .../core-config.integration.test.ts | 6 +- ...core-config.middleware.integration.test.ts | 22 +- .../implementation/core-config.middleware.ts | 6 +- .../core-config.middleware.unit.test.ts | 8 +- .../lib/implementation/core-config.model.ts | 2 - .../lib/implementation/core-config.options.ts | 2 +- .../lib/implementation/filter.middleware.ts | 4 +- .../filter.middleware.unit.test.ts | 4 +- .../src/lib/implementation/filter.options.ts | 4 +- .../implementation/formatting.unit.test.ts | 2 +- .../src/lib/implementation/global.model.ts | 2 +- .../src/lib/implementation/global.options.ts | 2 +- .../src/lib/implementation/global.utils.ts | 3 +- .../implementation/global.utils.unit.test.ts | 4 +- .../lib/implementation/merge-diffs.options.ts | 2 +- .../validate-filter-options.utils.ts | 2 +- ...validate-filter-options.utils.unit.test.ts | 4 +- .../lib/merge-diffs/merge-diffs-command.ts | 6 +- .../merge-diffs-command.unit.test.ts | 6 +- packages/cli/src/lib/middlewares.ts | 4 +- packages/cli/src/lib/options.ts | 6 +- .../lib/print-config/print-config-command.ts | 3 +- .../print-config-command.unit.test.ts | 6 +- packages/cli/src/lib/upload/upload-command.ts | 4 +- .../lib/upload/upload-command.unit.test.ts | 6 +- .../cli/src/lib/yargs-cli.integration.test.ts | 22 +- packages/cli/src/lib/yargs-cli.ts | 12 +- packages/cli/vite.config.integration.ts | 2 +- packages/cli/vite.config.unit.ts | 2 +- packages/core/.eslintrc.json | 24 - packages/core/eslint.config.js | 21 + packages/core/package.json | 11 +- packages/core/project.json | 5 +- packages/core/src/index.ts | 22 +- packages/core/src/lib/collect-and-persist.ts | 9 +- .../src/lib/collect-and-persist.unit.test.ts | 9 +- packages/core/src/lib/compare.ts | 18 +- packages/core/src/lib/compare.unit.test.ts | 48 +- packages/core/src/lib/history.ts | 6 +- packages/core/src/lib/history.unit.test.ts | 7 +- .../collect.integration.test.ts | 2 +- .../core/src/lib/implementation/collect.ts | 13 +- .../compare-scorables.unit.test.ts | 2 +- .../src/lib/implementation/execute-plugin.ts | 16 +- .../execute-plugin.unit.test.ts | 2 +- .../core/src/lib/implementation/persist.ts | 4 +- .../lib/implementation/persist.unit.test.ts | 22 +- .../read-rc-file.integration.test.ts | 22 +- .../src/lib/implementation/read-rc-file.ts | 34 +- .../implementation/read-rc-file.unit.test.ts | 2 +- .../implementation/report-to-gql.unit.test.ts | 2 +- .../core/src/lib/implementation/runner.ts | 4 +- .../lib/implementation/runner.unit.test.ts | 2 +- packages/core/src/lib/merge-diffs.ts | 6 +- .../core/src/lib/merge-diffs.unit.test.ts | 8 +- packages/core/src/lib/normalize.unit.test.ts | 14 +- packages/core/src/lib/upload.ts | 6 +- packages/core/src/lib/upload.unit.test.ts | 2 +- packages/core/vite.config.integration.ts | 2 +- packages/core/vite.config.unit.ts | 2 +- packages/create-cli/.eslintrc.json | 25 - packages/create-cli/eslint.config.js | 24 + packages/create-cli/package.json | 8 +- packages/create-cli/project.json | 7 +- packages/create-cli/src/index.ts | 2 +- packages/create-cli/src/lib/init.ts | 2 +- packages/create-cli/src/lib/init.unit.test.ts | 4 +- packages/create-cli/src/lib/utils.ts | 2 +- .../create-cli/src/lib/utils.unit.test.ts | 2 +- .../create-cli/vite.config.integration.ts | 2 +- packages/create-cli/vite.config.unit.ts | 2 +- packages/models/.eslintrc.json | 19 - packages/models/eslint.config.js | 21 + packages/models/package.json | 4 +- packages/models/project.json | 5 +- packages/models/src/index.ts | 42 +- packages/models/src/lib/audit-output.ts | 8 +- .../models/src/lib/audit-output.unit.test.ts | 2 +- packages/models/src/lib/audit.ts | 4 +- packages/models/src/lib/audit.unit.test.ts | 2 +- packages/models/src/lib/category-config.ts | 4 +- .../src/lib/category-config.unit.test.ts | 8 +- packages/models/src/lib/commit.unit.test.ts | 2 +- packages/models/src/lib/core-config.ts | 14 +- .../models/src/lib/core-config.unit.test.ts | 2 +- packages/models/src/lib/group.ts | 5 +- packages/models/src/lib/group.unit.test.ts | 4 +- .../src/lib/implementation/constants.ts | 2 +- .../models/src/lib/implementation/schemas.ts | 24 +- .../lib/implementation/schemas.unit.test.ts | 2 +- .../models/src/lib/implementation/utils.ts | 6 +- .../src/lib/implementation/utils.unit.test.ts | 2 +- packages/models/src/lib/issue.ts | 4 +- packages/models/src/lib/issue.unit.test.ts | 2 +- packages/models/src/lib/persist-config.ts | 2 +- .../src/lib/persist-config.unit.test.ts | 2 +- packages/models/src/lib/plugin-config.ts | 10 +- .../models/src/lib/plugin-config.unit.test.ts | 2 +- packages/models/src/lib/report.ts | 16 +- packages/models/src/lib/report.unit.test.ts | 2 +- packages/models/src/lib/reports-diff.ts | 8 +- .../models/src/lib/reports-diff.unit.test.ts | 2 +- packages/models/src/lib/runner-config.ts | 4 +- .../models/src/lib/runner-config.unit.test.ts | 2 +- packages/models/src/lib/source.ts | 2 +- packages/models/src/lib/table.ts | 2 +- packages/models/src/lib/table.unit.test.ts | 2 +- packages/models/src/lib/upload-config.ts | 2 +- .../models/src/lib/upload-config.unit.test.ts | 2 +- packages/models/vite.config.integration.ts | 2 +- packages/models/vite.config.unit.ts | 2 +- packages/nx-plugin/.env.lint.local | 1 + packages/nx-plugin/.eslintrc.json | 50 - packages/nx-plugin/eslint.config.cjs | 51 + packages/nx-plugin/mock/utils/executor.ts | 2 +- packages/nx-plugin/package.json | 13 +- .../cli/executor.integration.test.ts | 8 +- .../nx-plugin/src/executors/cli/executor.ts | 9 +- .../src/executors/cli/executor.unit.test.ts | 5 +- .../nx-plugin/src/executors/cli/schema.ts | 2 +- .../executors/cli/utils.integration.test.ts | 6 +- packages/nx-plugin/src/executors/cli/utils.ts | 10 +- .../src/executors/cli/utils.unit.test.ts | 5 +- .../nx-plugin/src/executors/internal/cli.ts | 7 +- .../src/executors/internal/cli.unit.test.ts | 2 +- .../internal/config.integration.test.ts | 6 +- .../src/executors/internal/config.ts | 10 +- .../executors/internal/config.unit.test.ts | 6 +- .../src/executors/internal/context.ts | 2 +- .../executors/internal/context.unit.test.ts | 4 +- .../nx-plugin/src/executors/internal/env.ts | 1 - .../src/executors/internal/env.unit.test.ts | 2 +- .../code-pushup-config.integration.test.ts | 10 +- .../configuration/code-pushup-config.ts | 19 +- .../code-pushup-config.unit.test.ts | 22 +- .../generator.integration.test.ts | 9 +- .../src/generators/configuration/generator.ts | 6 +- .../src/generators/configuration/schema.d.ts | 2 +- .../src/generators/configuration/utils.ts | 4 +- .../configuration/utils.unit.test.ts | 2 +- .../init/generator.integration.test.ts | 2 +- .../src/generators/init/generator.ts | 6 +- packages/nx-plugin/src/index.ts | 23 +- .../src/internal/execute-process.unit.test.ts | 2 +- packages/nx-plugin/src/internal/versions.ts | 14 +- packages/nx-plugin/src/plugin/caching.ts | 10 +- .../nx-plugin/src/plugin/caching.unit.test.ts | 96 +- packages/nx-plugin/src/plugin/index.ts | 4 +- packages/nx-plugin/src/plugin/plugin.ts | 14 +- .../nx-plugin/src/plugin/plugin.unit.test.ts | 4 +- .../src/plugin/target/configuration-target.ts | 6 +- .../target/configuration.target.unit.test.ts | 4 +- .../src/plugin/target/executor-target.ts | 4 +- .../target/executor.target.unit.test.ts | 2 +- .../src/plugin/target/targets.unit.test.ts | 8 +- packages/nx-plugin/src/plugin/types.ts | 2 +- packages/nx-plugin/src/plugin/utils.ts | 21 +- packages/nx-plugin/vite.config.integration.ts | 2 +- packages/nx-plugin/vite.config.unit.ts | 2 +- packages/plugin-coverage/.eslintrc.json | 19 - packages/plugin-coverage/eslint.config.js | 21 + packages/plugin-coverage/package.json | 8 +- packages/plugin-coverage/project.json | 5 +- packages/plugin-coverage/src/bin.ts | 2 +- packages/plugin-coverage/src/index.ts | 6 +- .../src/lib/config.unit.test.ts | 2 +- .../src/lib/coverage-plugin.ts | 23 +- .../src/lib/coverage-plugin.unit.test.ts | 6 +- .../src/lib/nx/coverage-paths.ts | 18 +- .../src/lib/nx/coverage-paths.unit.test.ts | 96 +- .../src/lib/runner/constants.ts | 6 +- .../plugin-coverage/src/lib/runner/index.ts | 14 +- .../lcov/lcov-runner.integration.test.ts | 12 +- .../src/lib/runner/lcov/lcov-runner.ts | 14 +- .../lib/runner/lcov/lcov-runner.unit.test.ts | 40 +- .../lib/runner/lcov/merge-lcov.unit.test.ts | 2 +- .../src/lib/runner/lcov/transform.ts | 8 +- .../lib/runner/lcov/transform.unit.test.ts | 6 +- .../src/lib/runner/lcov/types.ts | 2 +- .../src/lib/runner/lcov/utils.ts | 2 +- .../src/lib/runner/lcov/utils.unit.test.ts | 2 +- .../src/lib/runner/runner.integration.test.ts | 16 +- packages/plugin-coverage/src/lib/utils.ts | 6 +- .../src/lib/utils.unit.test.ts | 2 +- .../vite.config.integration.ts | 2 +- packages/plugin-coverage/vite.config.unit.ts | 2 +- packages/plugin-eslint/.eslintrc.json | 19 - packages/plugin-eslint/eslint.config.js | 21 + .../mocks/fixtures/nx-monorepo/.eslintrc.json | 40 - .../mocks/fixtures/nx-monorepo/.gitignore | 2 +- .../fixtures/nx-monorepo/eslint.config.js | 41 + .../mocks/fixtures/nx-monorepo/nx.json | 3 +- .../mocks/fixtures/nx-monorepo/package.json | 4 + .../nx-monorepo/packages/cli/.eslintrc.json | 25 - .../nx-monorepo/packages/cli/eslint.config.js | 19 + .../nx-monorepo/packages/cli/project.json | 9 +- .../nx-monorepo/packages/core/.eslintrc.json | 25 - .../packages/core/eslint.config.js | 19 + .../nx-monorepo/packages/core/project.json | 9 +- .../packages/nx-plugin/.eslintrc.json | 32 - .../packages/nx-plugin/eslint.config.js | 28 + .../packages/nx-plugin/project.json | 10 +- .../nx-monorepo/packages/utils/.eslintrc.json | 25 - .../packages/utils/eslint.config.js | 19 + .../nx-monorepo/packages/utils/project.json | 9 +- .../fixtures/nx-monorepo/tsconfig.base.json | 4 +- .../mocks/fixtures/todos-app/.eslintrc.js | 69 - .../todos-app/code-pushup.eslint.config.mjs | 3 + .../todos-app/code-pushup.eslintrc.yml | 2 - .../mocks/fixtures/todos-app/eslint.config.js | 67 + .../mocks/fixtures/todos-app/package.json | 7 +- .../fixtures/todos-app/tsconfig.base.json | 19 + packages/plugin-eslint/package.json | 8 +- packages/plugin-eslint/project.json | 5 +- packages/plugin-eslint/src/bin.ts | 2 +- packages/plugin-eslint/src/index.ts | 11 +- .../eslint-plugin.integration.test.ts.snap | 60 +- .../runner.integration.test.ts.snap | 30 +- .../src/lib/eslint-plugin.integration.test.ts | 28 +- .../plugin-eslint/src/lib/eslint-plugin.ts | 23 +- packages/plugin-eslint/src/lib/meta/groups.ts | 24 +- .../src/lib/meta/groups.unit.test.ts | 18 +- packages/plugin-eslint/src/lib/meta/hash.ts | 5 + .../src/lib/meta/hash.unit.test.ts | 2 +- packages/plugin-eslint/src/lib/meta/index.ts | 11 +- packages/plugin-eslint/src/lib/meta/parse.ts | 15 +- .../src/lib/meta/parse.unit.test.ts | 40 +- ...unit.test.ts => rules.integration.test.ts} | 45 +- packages/plugin-eslint/src/lib/meta/rules.ts | 12 +- .../plugin-eslint/src/lib/meta/transform.ts | 22 +- .../src/lib/meta/transform.unit.test.ts | 14 +- .../src/lib/meta/versions/detect.ts | 2 +- .../src/lib/meta/versions/detect.unit.test.ts | 2 +- .../meta/versions/flat.integration.test.ts | 42 +- .../src/lib/meta/versions/flat.ts | 38 +- .../src/lib/meta/versions/index.ts | 14 +- .../src/lib/meta/versions/legacy.ts | 30 +- .../src/lib/nx.integration.test.ts | 95 +- .../lib/nx/filter-project-graph.unit.test.ts | 2 +- .../src/lib/nx/find-all-projects.ts | 6 +- .../src/lib/nx/find-project-with-deps.ts | 6 +- .../src/lib/nx/find-project-without-deps.ts | 4 +- packages/plugin-eslint/src/lib/nx/index.ts | 9 +- .../src/lib/nx/projects-to-config.ts | 25 +- .../lib/nx/projects-to-config.unit.test.ts | 78 +- .../src/lib/nx/traverse-graph.unit.test.ts | 2 +- packages/plugin-eslint/src/lib/nx/utils.ts | 112 +- .../src/lib/nx/utils.unit.test.ts | 404 +- .../src/lib/runner.integration.test.ts | 18 +- .../plugin-eslint/src/lib/runner/index.ts | 18 +- packages/plugin-eslint/src/lib/runner/lint.ts | 6 +- .../src/lib/runner/lint.unit.test.ts | 5 +- .../plugin-eslint/src/lib/runner/transform.ts | 4 +- .../src/lib/runner/transform.unit.test.ts | 2 +- packages/plugin-eslint/src/lib/setup.ts | 2 +- .../plugin-eslint/vite.config.integration.ts | 2 +- packages/plugin-eslint/vite.config.unit.ts | 2 +- packages/plugin-js-packages/.eslintrc.json | 19 - packages/plugin-js-packages/README.md | 8 +- packages/plugin-js-packages/eslint.config.js | 21 + packages/plugin-js-packages/package.json | 8 +- packages/plugin-js-packages/project.json | 5 +- packages/plugin-js-packages/src/bin.ts | 2 +- packages/plugin-js-packages/src/index.ts | 4 +- packages/plugin-js-packages/src/lib/config.ts | 2 +- .../src/lib/config.unit.test.ts | 2 +- .../plugin-js-packages/src/lib/constants.ts | 8 +- .../src/lib/js-packages-plugin.ts | 27 +- .../src/lib/js-packages-plugin.unit.test.ts | 2 +- .../derive-package-manager.ts | 16 +- .../derive-package-manager.unit.test.ts | 6 +- .../package-managers/derive-yarn.unit.test.ts | 3 +- .../src/lib/package-managers/index.ts | 2 - .../lib/package-managers/npm/audit-result.ts | 6 +- .../npm/audit-result.unit.test.ts | 6 +- .../src/lib/package-managers/npm/npm.ts | 12 +- .../package-managers/npm/outdated-result.ts | 4 +- .../npm/outdated-result.unit.test.ts | 4 +- .../src/lib/package-managers/npm/types.ts | 6 +- .../lib/package-managers/package-managers.ts | 12 +- .../lib/package-managers/pnpm/audit-result.ts | 8 +- .../pnpm/audit-result.unit.test.ts | 6 +- .../package-managers/pnpm/outdated-result.ts | 6 +- .../pnpm/outdated-result.unit.test.ts | 6 +- .../src/lib/package-managers/pnpm/pnpm.ts | 12 +- .../src/lib/package-managers/pnpm/types.ts | 6 +- .../src/lib/package-managers/types.ts | 6 +- .../yarn-classic/audit-result.ts | 6 +- .../yarn-classic/audit-result.unit.test.ts | 6 +- .../yarn-classic/constants.ts | 4 +- .../yarn-classic/outdated-result.ts | 9 +- .../yarn-classic/outdated-result.unit.test.ts | 9 +- .../package-managers/yarn-classic/types.ts | 4 +- .../yarn-classic/yarn-classic.ts | 10 +- .../yarn-modern/audit-result.ts | 6 +- .../yarn-modern/audit-result.unit.test.ts | 6 +- .../yarn-modern/outdated-result.ts | 4 +- .../yarn-modern/outdated-result.unit.test.ts | 4 +- .../lib/package-managers/yarn-modern/types.ts | 6 +- .../yarn-modern/yarn-modern.ts | 10 +- .../src/lib/runner/audit/constants.ts | 6 +- .../src/lib/runner/audit/transform.ts | 6 +- .../lib/runner/audit/transform.unit.test.ts | 6 +- .../src/lib/runner/audit/types.ts | 2 +- .../src/lib/runner/audit/utils.ts | 2 +- .../src/lib/runner/constants.ts | 6 +- .../src/lib/runner/index.ts | 24 +- .../src/lib/runner/outdated/transform.ts | 8 +- .../runner/outdated/transform.unit.test.ts | 4 +- .../src/lib/runner/runner.integration.test.ts | 8 +- .../src/lib/runner/utils.ts | 14 +- .../src/lib/runner/utils.unit.test.ts | 28 +- packages/plugin-js-packages/src/lib/utils.ts | 6 +- .../src/lib/utils.unit.test.ts | 2 +- .../vite.config.integration.ts | 2 +- .../plugin-js-packages/vite.config.unit.ts | 2 +- packages/plugin-lighthouse/.eslintrc.json | 19 - packages/plugin-lighthouse/eslint.config.js | 21 + packages/plugin-lighthouse/package.json | 8 +- packages/plugin-lighthouse/project.json | 5 +- packages/plugin-lighthouse/src/index.ts | 12 +- .../plugin-lighthouse/src/lib/constants.ts | 4 +- .../src/lib/lighthouse-plugin.ts | 22 +- .../src/lib/lighthouse-plugin.unit.test.ts | 12 +- .../src/lib/normalize-flags.ts | 7 +- .../src/lib/normalize-flags.unit.test.ts | 14 +- .../src/lib/runner/constants.ts | 10 +- .../src/lib/runner/constants.unit.test.ts | 5 +- .../src/lib/runner/details/details.ts | 6 +- .../lib/runner/details/details.unit.test.ts | 2 +- .../src/lib/runner/details/item-value.ts | 4 +- .../runner/details/item-value.unit.test.ts | 2 +- .../lib/runner/details/opportunity.type.ts | 4 +- .../details/opportunity.type.unit.test.ts | 4 +- .../src/lib/runner/details/table.type.ts | 4 +- .../runner/details/table.type.unit.test.ts | 4 +- .../plugin-lighthouse/src/lib/runner/index.ts | 8 - .../src/lib/runner/runner.ts | 10 +- .../src/lib/runner/runner.unit.test.ts | 10 +- .../plugin-lighthouse/src/lib/runner/types.ts | 2 +- .../plugin-lighthouse/src/lib/runner/utils.ts | 6 +- .../src/lib/runner/utils.unit.test.ts | 9 +- packages/plugin-lighthouse/src/lib/types.ts | 4 +- packages/plugin-lighthouse/src/lib/utils.ts | 4 +- .../src/lib/utils.unit.test.ts | 2 +- .../vite.config.integration.ts | 2 +- .../plugin-lighthouse/vite.config.unit.ts | 2 +- packages/utils/.eslintrc.json | 29 - packages/utils/eslint.config.js | 24 + .../mocks/fixtures/execute-progress.mock.mjs | 2 +- packages/utils/package.json | 12 +- .../utils/perf/crawl-file-system/fs-walk.ts | 2 +- .../utils/perf/crawl-file-system/index.ts | 12 +- packages/utils/perf/score-report/index.ts | 15 +- .../utils/perf/score-report/optimized0.ts | 2 +- .../utils/perf/score-report/optimized1.ts | 5 +- .../utils/perf/score-report/optimized2.ts | 5 +- .../utils/perf/score-report/optimized3.ts | 6 +- packages/utils/project.json | 5 +- packages/utils/src/index.ts | 74 +- packages/utils/src/lib/diff.unit.test.ts | 2 +- packages/utils/src/lib/errors.unit.test.ts | 2 +- packages/utils/src/lib/execute-process.ts | 2 +- .../src/lib/execute-process.unit.test.ts | 2 +- .../src/lib/file-system.integration.test.ts | 18 +- packages/utils/src/lib/file-system.ts | 40 +- .../utils/src/lib/file-system.unit.test.ts | 30 +- packages/utils/src/lib/filter.unit.test.ts | 2 +- packages/utils/src/lib/formatting.ts | 2 +- .../utils/src/lib/formatting.unit.test.ts | 2 +- .../git.commits-and-tags.integration.test.ts | 13 +- .../utils/src/lib/git/git.commits-and-tags.ts | 4 +- .../lib/git/git.commits-and-tags.unit.test.ts | 2 +- .../utils/src/lib/git/git.integration.test.ts | 18 +- packages/utils/src/lib/git/git.ts | 18 +- packages/utils/src/lib/git/git.unit.test.ts | 6 +- .../src/lib/group-by-status.unit.test.ts | 2 +- packages/utils/src/lib/guards.ts | 8 + packages/utils/src/lib/guards.unit.test.ts | 24 +- packages/utils/src/lib/log-results.ts | 4 +- .../utils/src/lib/log-results.unit.test.ts | 6 +- packages/utils/src/lib/logging.ts | 2 +- .../utils/src/lib/merge-configs.unit.test.ts | 2 +- .../src/lib/progress.integration.test.ts | 2 +- packages/utils/src/lib/progress.ts | 3 +- packages/utils/src/lib/reports/constants.ts | 4 +- .../utils/src/lib/reports/environment-type.ts | 2 +- .../lib/reports/environment-type.unit.test.ts | 2 +- .../lib/reports/flatten-plugins.unit.test.ts | 2 +- packages/utils/src/lib/reports/formatting.ts | 12 +- .../src/lib/reports/formatting.unit.test.ts | 4 +- ...te-md-report-category-section.unit.test.ts | 4 +- .../generate-md-report-categoy-section.ts | 12 +- .../generate-md-report.integration.test.ts | 6 +- .../src/lib/reports/generate-md-report.ts | 18 +- .../reports/generate-md-report.unit.test.ts | 6 +- .../reports/generate-md-reports-diff-utils.ts | 6 +- ...enerate-md-reports-diff-utils.unit.test.ts | 4 +- ...nerate-md-reports-diff.integration.test.ts | 2 +- .../lib/reports/generate-md-reports-diff.ts | 18 +- packages/utils/src/lib/reports/load-report.ts | 6 +- .../src/lib/reports/load-report.unit.test.ts | 2 +- .../log-stdout-summary.integration.test.ts | 8 +- .../src/lib/reports/log-stdout-summary.ts | 18 +- .../reports/log-stdout-summary.unit.test.ts | 6 +- packages/utils/src/lib/reports/scoring.ts | 4 +- .../src/lib/reports/scoring.unit.test.ts | 2 +- .../lib/reports/sorting.integration.test.ts | 4 +- packages/utils/src/lib/reports/sorting.ts | 4 +- .../src/lib/reports/sorting.unit.test.ts | 4 +- packages/utils/src/lib/reports/utils.ts | 31 +- .../utils/src/lib/reports/utils.unit.test.ts | 17 +- packages/utils/src/lib/semver.unit.test.ts | 2 +- .../utils/src/lib/text-formats/constants.ts | 4 +- .../src/lib/text-formats/html/details.ts | 2 +- .../text-formats/html/font-style.unit.test.ts | 2 +- .../utils/src/lib/text-formats/html/table.ts | 4 +- .../lib/text-formats/html/table.unit.test.ts | 2 +- packages/utils/src/lib/text-formats/index.ts | 10 +- packages/utils/src/lib/text-formats/table.ts | 2 +- .../src/lib/text-formats/table.unit.test.ts | 2 +- packages/utils/src/lib/transform.ts | 11 +- packages/utils/src/lib/transform.unit.test.ts | 4 +- packages/utils/src/lib/types.ts | 6 +- packages/utils/src/lib/verbose-utils.ts | 2 +- .../utils/src/lib/verbose-utils.unit.test.ts | 4 +- packages/utils/src/lib/zod-validation.ts | 25 + .../utils/src/lib/zod-validation.unit.test.ts | 14 + packages/utils/vite.config.integration.ts | 2 +- packages/utils/vite.config.unit.ts | 2 +- project.json | 21 +- testing/test-nx-utils/.eslintrc.json | 12 - testing/test-nx-utils/eslint.config.js | 12 + testing/test-nx-utils/project.json | 7 +- testing/test-nx-utils/src/index.ts | 8 +- .../test-nx-utils/src/lib/utils/nx-plugin.ts | 4 +- .../src/lib/utils/nx-plugin.unit.test.ts | 4 + testing/test-nx-utils/src/lib/utils/nx.ts | 59 +- .../src/lib/utils/nx.unit.test.ts | 2 +- .../src/lib/utils/tree.integration.test.ts | 10 +- testing/test-nx-utils/src/lib/utils/tree.ts | 6 +- testing/test-nx-utils/vite.config.unit.ts | 2 +- testing/test-setup/.eslintrc.json | 12 - testing/test-setup/eslint.config.js | 12 + testing/test-setup/project.json | 7 +- testing/test-setup/src/index.ts | 2 +- testing/test-utils/.eslintrc.json | 12 - testing/test-utils/eslint.config.js | 12 + testing/test-utils/package.json | 4 + testing/test-utils/project.json | 7 +- testing/test-utils/src/index.ts | 55 +- .../configs/code-pushup.invalid.config.ts | 2 +- .../code-pushup.needs-tsconfig.config.ts | 1 + .../configs/progress-bar.config.mock.ts | 8 +- .../src/lib/utils/create-npm-workshpace.ts | 4 +- .../utils/dynamic-mocks/categories.mock.ts | 2 +- .../lib/utils/dynamic-mocks/config.mock.ts | 10 +- .../utils/dynamic-mocks/eslint-plugin.mock.ts | 8 +- .../dynamic-mocks/lighthouse-plugin.mock.ts | 8 +- .../utils/dynamic-mocks/plugin-config.mock.ts | 6 +- .../utils/dynamic-mocks/report-diff.mock.ts | 12 +- .../lib/utils/dynamic-mocks/report.mock.ts | 8 +- .../lib/utils/execute-process-helper.mock.ts | 4 +- .../src/lib/utils/file-system.unit.test.ts | 10 +- testing/test-utils/src/lib/utils/git.ts | 37 +- .../src/lib/utils/omit-report-data.ts | 1 - .../lib/utils/os-agnostic-paths.unit.test.ts | 27 +- .../lib/utils/progress-bar-process.mock.mjs | 4 +- .../test-utils/src/lib/utils/report.mock.ts | 4 +- testing/test-utils/vite.config.unit.ts | 2 +- tools/.eslintrc.json | 15 - tools/eslint.config.js | 12 + tools/src/debug/bin/clean-npmrc.ts | 4 +- tools/src/debug/bin/kill-process.ts | 4 +- tools/src/debug/bin/list-process.ts | 4 +- tools/src/debug/bin/types.ts | 2 +- tools/src/debug/debug.plugin.ts | 6 +- tools/src/debug/utils.ts | 4 +- tsconfig.base.json | 2 +- 726 files changed, 18557 insertions(+), 13216 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.json rename commitlint.config.mjs => commitlint.config.js (100%) delete mode 100644 e2e/ci-e2e/.eslintrc.json create mode 100644 e2e/ci-e2e/eslint.config.js create mode 100644 e2e/ci-e2e/mocks/api.ts rename e2e/ci-e2e/mocks/fixtures/{ci-test-repo => basic}/code-pushup.config.ts (100%) rename e2e/ci-e2e/mocks/fixtures/{ci-test-repo => basic}/index.js (100%) create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/code-pushup/categories.js create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/code-pushup/ts-migration.plugin.js create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/package-lock.json create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/package.json create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/code-pushup.config.js create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/package.json create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/src/bin.js create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/code-pushup.config.js create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/package.json create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/src/index.js create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/code-pushup.config.js create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/package.json create mode 100644 e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/src/index.js create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/code-pushup.config.js create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/project.json create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/src/index.js create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/code-pushup.config.js create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/project.json create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/src/index.js create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/code-pushup.config.js create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/project.json create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/src/index.ts create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/code-pushup.preset.js create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/code-pushup.config.js create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/project.json create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/src/index.test.ts create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/src/index.ts create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/code-pushup.config.js create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/project.json create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/src/index.js create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/src/index.test.js create mode 100644 e2e/ci-e2e/mocks/fixtures/nx-monorepo/nx.json create mode 100644 e2e/ci-e2e/mocks/setup.ts rename e2e/ci-e2e/tests/__snapshots__/{report-diff.md => basic-report-diff.md} (100%) create mode 100644 e2e/ci-e2e/tests/__snapshots__/npm-workspaces-report-diff.md create mode 100644 e2e/ci-e2e/tests/__snapshots__/nx-monorepo-report-diff.md create mode 100644 e2e/ci-e2e/tests/basic.e2e.test.ts delete mode 100644 e2e/ci-e2e/tests/ci.e2e.test.ts create mode 100644 e2e/ci-e2e/tests/npm-workspaces.e2e.test.ts create mode 100644 e2e/ci-e2e/tests/nx-monorepo.e2e.test.ts delete mode 100644 e2e/cli-e2e/.eslintrc.json create mode 100644 e2e/cli-e2e/eslint.config.js delete mode 100644 e2e/create-cli-e2e/.eslintrc.json create mode 100644 e2e/create-cli-e2e/eslint.config.js delete mode 100644 e2e/nx-plugin-e2e/.eslintrc.json create mode 100644 e2e/nx-plugin-e2e/eslint.config.js create mode 100644 e2e/nx-plugin-e2e/tests/inline-plugin.ts delete mode 100644 e2e/plugin-coverage-e2e/.eslintrc.json create mode 100644 e2e/plugin-coverage-e2e/eslint.config.js delete mode 100644 e2e/plugin-eslint-e2e/.eslintrc.json create mode 100644 e2e/plugin-eslint-e2e/eslint.config.js delete mode 100644 e2e/plugin-lighthouse-e2e/.eslintrc.json create mode 100644 e2e/plugin-lighthouse-e2e/eslint.config.js delete mode 100644 esbuild.config.js create mode 100644 eslint.config.js delete mode 100644 examples/plugins/.eslintrc.json create mode 100644 examples/plugins/eslint.config.js delete mode 100644 packages/ci/.eslintrc.json create mode 100644 packages/ci/eslint.config.js delete mode 100644 packages/ci/mocks/fixtures/code-pushup.config.ts create mode 100644 packages/ci/mocks/fixtures/monorepos/custom/backend/api/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/custom/backend/auth/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/custom/frontend/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/npm/package-lock.json create mode 100644 packages/ci/mocks/fixtures/monorepos/npm/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/npm/packages/cli/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/npm/packages/core/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/npm/packages/utils/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/nx/.gitignore create mode 100644 packages/ci/mocks/fixtures/monorepos/nx/nx.json create mode 100644 packages/ci/mocks/fixtures/monorepos/nx/package-lock.json create mode 100644 packages/ci/mocks/fixtures/monorepos/nx/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/nx/packages/cli/project.json create mode 100644 packages/ci/mocks/fixtures/monorepos/nx/packages/core/project.json create mode 100644 packages/ci/mocks/fixtures/monorepos/nx/packages/utils/project.json create mode 100644 packages/ci/mocks/fixtures/monorepos/nx/tsconfig.base.json create mode 100644 packages/ci/mocks/fixtures/monorepos/pnpm/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/pnpm/packages/cli/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/pnpm/packages/core/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/pnpm/packages/utils/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/pnpm/pnpm-lock.yaml create mode 100644 packages/ci/mocks/fixtures/monorepos/pnpm/pnpm-workspace.yaml create mode 100644 packages/ci/mocks/fixtures/monorepos/turbo/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/turbo/packages/cli/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/turbo/packages/core/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/turbo/packages/utils/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/turbo/turbo.json create mode 100644 packages/ci/mocks/fixtures/monorepos/turbo/yarn.lock create mode 100644 packages/ci/mocks/fixtures/monorepos/yarn/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/yarn/packages/cli/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/yarn/packages/core/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/yarn/packages/utils/package.json create mode 100644 packages/ci/mocks/fixtures/monorepos/yarn/yarn.lock rename packages/ci/mocks/fixtures/{ => outputs}/config.json (100%) create mode 100644 packages/ci/mocks/fixtures/outputs/diff-merged.md rename packages/ci/mocks/fixtures/{report-diff.json => outputs/diff-project.json} (100%) rename packages/ci/mocks/fixtures/{report-diff.md => outputs/diff-project.md} (100%) rename packages/ci/mocks/fixtures/{feature-1/report.json => outputs/report-after.json} (100%) rename packages/ci/mocks/fixtures/{feature-1/report.md => outputs/report-after.md} (100%) rename packages/ci/mocks/fixtures/{main/report.json => outputs/report-before.json} (100%) rename packages/ci/mocks/fixtures/{main/report.md => outputs/report-before.md} (100%) create mode 100644 packages/ci/src/lib/monorepo/handlers/npm.unit.test.ts create mode 100644 packages/ci/src/lib/monorepo/handlers/nx.unit.test.ts create mode 100644 packages/ci/src/lib/monorepo/handlers/pnpm.unit.test.ts create mode 100644 packages/ci/src/lib/monorepo/handlers/turbo.unit.test.ts create mode 100644 packages/ci/src/lib/monorepo/handlers/yarn.unit.test.ts create mode 100644 packages/ci/src/lib/monorepo/packages.unit.test.ts create mode 100644 packages/ci/src/lib/run-monorepo.ts create mode 100644 packages/ci/src/lib/run-standalone.ts create mode 100644 packages/ci/src/lib/run-utils.ts delete mode 100644 packages/cli/.eslintrc.json create mode 100644 packages/cli/eslint.config.js delete mode 100644 packages/core/.eslintrc.json create mode 100644 packages/core/eslint.config.js delete mode 100644 packages/create-cli/.eslintrc.json create mode 100644 packages/create-cli/eslint.config.js delete mode 100644 packages/models/.eslintrc.json create mode 100644 packages/models/eslint.config.js create mode 100644 packages/nx-plugin/.env.lint.local delete mode 100644 packages/nx-plugin/.eslintrc.json create mode 100644 packages/nx-plugin/eslint.config.cjs delete mode 100644 packages/plugin-coverage/.eslintrc.json create mode 100644 packages/plugin-coverage/eslint.config.js delete mode 100644 packages/plugin-eslint/.eslintrc.json create mode 100644 packages/plugin-eslint/eslint.config.js delete mode 100644 packages/plugin-eslint/mocks/fixtures/nx-monorepo/.eslintrc.json create mode 100644 packages/plugin-eslint/mocks/fixtures/nx-monorepo/eslint.config.js create mode 100644 packages/plugin-eslint/mocks/fixtures/nx-monorepo/package.json delete mode 100644 packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/.eslintrc.json create mode 100644 packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/eslint.config.js delete mode 100644 packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/.eslintrc.json create mode 100644 packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/eslint.config.js delete mode 100644 packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/.eslintrc.json create mode 100644 packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/eslint.config.js delete mode 100644 packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/.eslintrc.json create mode 100644 packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/eslint.config.js delete mode 100644 packages/plugin-eslint/mocks/fixtures/todos-app/.eslintrc.js create mode 100644 packages/plugin-eslint/mocks/fixtures/todos-app/code-pushup.eslint.config.mjs delete mode 100644 packages/plugin-eslint/mocks/fixtures/todos-app/code-pushup.eslintrc.yml create mode 100644 packages/plugin-eslint/mocks/fixtures/todos-app/eslint.config.js create mode 100644 packages/plugin-eslint/mocks/fixtures/todos-app/tsconfig.base.json rename packages/plugin-eslint/src/lib/meta/{rules.unit.test.ts => rules.integration.test.ts} (82%) delete mode 100644 packages/plugin-js-packages/.eslintrc.json create mode 100644 packages/plugin-js-packages/eslint.config.js delete mode 100644 packages/plugin-js-packages/src/lib/package-managers/index.ts delete mode 100644 packages/plugin-lighthouse/.eslintrc.json create mode 100644 packages/plugin-lighthouse/eslint.config.js delete mode 100644 packages/plugin-lighthouse/src/lib/runner/index.ts delete mode 100644 packages/utils/.eslintrc.json create mode 100644 packages/utils/eslint.config.js create mode 100644 packages/utils/src/lib/zod-validation.ts create mode 100644 packages/utils/src/lib/zod-validation.unit.test.ts delete mode 100644 testing/test-nx-utils/.eslintrc.json create mode 100644 testing/test-nx-utils/eslint.config.js delete mode 100644 testing/test-setup/.eslintrc.json create mode 100644 testing/test-setup/eslint.config.js delete mode 100644 testing/test-utils/.eslintrc.json create mode 100644 testing/test-utils/eslint.config.js create mode 100644 testing/test-utils/package.json delete mode 100644 tools/.eslintrc.json create mode 100644 tools/eslint.config.js diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 0c203c742..000000000 --- a/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -**/*.mock.* -**/code-pushup.config.ts -**/mocks/fixtures/** -**/__snapshots__/** diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 68a4b3111..000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "root": true, - "ignorePatterns": ["**/*"], - "plugins": ["@nx"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": { - "@nx/enforce-module-boundaries": [ - "error", - { - "enforceBuildableLibDependency": true, - "allow": ["tools"], - "depConstraints": [ - { - "sourceTag": "scope:shared", - "onlyDependOnLibsWithTags": ["scope:shared"] - }, - { - "sourceTag": "scope:core", - "onlyDependOnLibsWithTags": ["scope:core", "scope:shared"] - }, - { - "sourceTag": "scope:plugin", - "onlyDependOnLibsWithTags": ["scope:shared"] - }, - { - "sourceTag": "scope:tooling", - "onlyDependOnLibsWithTags": ["scope:tooling", "scope:shared"] - }, - { - "sourceTag": "type:e2e", - "onlyDependOnLibsWithTags": [ - "type:app", - "type:feature", - "type:util", - "type:testing" - ] - }, - { - "sourceTag": "type:app", - "onlyDependOnLibsWithTags": [ - "type:feature", - "type:util", - "type:testing" - ] - }, - { - "sourceTag": "type:feature", - "onlyDependOnLibsWithTags": [ - "type:feature", - "type:util", - "type:testing" - ] - }, - { - "sourceTag": "type:util", - "onlyDependOnLibsWithTags": ["type:util", "type:testing"] - }, - { - "sourceTag": "type:testing", - "onlyDependOnLibsWithTags": ["type:util", "type:testing"] - } - ] - } - ], - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_" - } - ], - "@typescript-eslint/no-import-type-side-effects": "warn" - } - }, - { - "files": ["*.ts", "*.tsx"], - "extends": [ - "plugin:@nx/typescript", - "@code-pushup/eslint-config/typescript", - "@code-pushup/eslint-config/node", - "@code-pushup/eslint-config/vitest" - ], - "settings": { - "import/resolver": { - "typescript": { - "project": "tsconfig.base.json" - } - } - }, - "rules": { - "vitest/consistent-test-filename": [ - "warn", - { "pattern": ".*\\.(unit|integration|e2e)\\.test\\.[tj]sx?$" } - ] - } - }, - { - "files": ["*.js", "*.jsx"], - "extends": ["plugin:@nx/javascript", "@code-pushup"], - "rules": {} - }, - { - "files": "*.json", - "parser": "jsonc-eslint-parser", - "rules": {} - }, - { - "files": ["**/perf/**/*.ts"], - "rules": { - "no-magic-numbers": "off", - "sonarjs/no-duplicate-string": "off" - } - } - ] -} diff --git a/.github/labeler.yml b/.github/labeler.yml index adfc5a17d..47a25558a 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -73,7 +73,6 @@ - 'nx.json' - '.nvmrc' - '.prettierrc' - - 'esbuild.config.js' - '.github/ISSUE_TEMPLATE/**' - '.husky/**' - 'commitlint.config.mjs' diff --git a/.nvmrc b/.nvmrc index 18c284172..2fdffdecf 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.11.0 \ No newline at end of file +22.10.0 \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index 17120ea5f..4ee7dc0ac 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,5 @@ # Add files here to ignore them from prettier formatting /dist /coverage -/.nx/cache +/.nx __snapshots__ diff --git a/.tool-versions b/.tool-versions index 33f368048..c9526937f 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -nodejs 20.11.0 \ No newline at end of file +nodejs 22.10.0 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 304a11593..f07295873 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,50 @@ +## 0.57.0 (2024-12-17) + +### 🚀 Features + +- **ci:** detect persist config from print-config ([ad8bd284](https://github.com/code-pushup/cli/commit/ad8bd284)) +- **ci:** remove obsolete output option ([0b9d679e](https://github.com/code-pushup/cli/commit/0b9d679e)) +- **ci:** implement run many command resolution for each monorepo tool ([094797d9](https://github.com/code-pushup/cli/commit/094797d9)) +- **ci:** add parallel option ([85e51864](https://github.com/code-pushup/cli/commit/85e51864)) +- **ci:** filter nx run-many by projects from nx show projects as fallback ([97a603cc](https://github.com/code-pushup/cli/commit/97a603cc)) +- **ci:** sort nx projects alphabetically ([6a6c2f3d](https://github.com/code-pushup/cli/commit/6a6c2f3d)) +- **ci:** copy merged-report-diff.md from project to root ([e1305295](https://github.com/code-pushup/cli/commit/e1305295)) +- **ci:** implement bulk collecting reports for parallel monorepo runs ([e0b4d97f](https://github.com/code-pushup/cli/commit/e0b4d97f)) +- **core:** enhance config validation ([836b242d](https://github.com/code-pushup/cli/commit/836b242d)) +- **utils:** implement type guard for nullable object props ([c3fc549e](https://github.com/code-pushup/cli/commit/c3fc549e)) + +### 🩹 Fixes + +- prevent "ExperimentalWarning: Importing JSON" logged to stderr ([8ce9e635](https://github.com/code-pushup/cli/commit/8ce9e635)) +- update progress bar gradually as plugin run complete ([7a592ebd](https://github.com/code-pushup/cli/commit/7a592ebd)) +- lint import extensions and fix missing .js extensions ([9d6eacf4](https://github.com/code-pushup/cli/commit/9d6eacf4)) +- **ci:** handle non-JSON prefix/suffix lines from print-config ([43ffcf2d](https://github.com/code-pushup/cli/commit/43ffcf2d)) +- **ci:** ensure valid output directory for reports and merged diff ([5e36323d](https://github.com/code-pushup/cli/commit/5e36323d)) +- **ci:** resolve outputDir correctly by running workspace commands in project dir ([94b25f88](https://github.com/code-pushup/cli/commit/94b25f88)) +- **ci:** only copy merged-report-diff.md when paths are different ([f8ac4007](https://github.com/code-pushup/cli/commit/f8ac4007)) +- **nx-plugin:** use wildcard path imports to prevent CJS runtime errors ([31bed82a](https://github.com/code-pushup/cli/commit/31bed82a)) +- **plugin-eslint:** avoid directory imports ([688a4859](https://github.com/code-pushup/cli/commit/688a4859)) +- **plugin-eslint:** consider defaultOptions to ensure rule slugs from runner match ([13de4b57](https://github.com/code-pushup/cli/commit/13de4b57)) +- **plugin-eslint:** handle mismatched slugs for legacy configs ([e324f39d](https://github.com/code-pushup/cli/commit/e324f39d)) +- **plugin-eslint:** parse rule names containing slashes correctly ([f1163d0a](https://github.com/code-pushup/cli/commit/f1163d0a)) + +### ❤️ Thank You + +- Hanna Skryl @hanna-skryl +- Matěj Chalk +- Vojtech Masek @vmasek + +## 0.56.0 (2024-11-29) + +### 🚀 Features + +- **ci:** add nxProjectsFilter option, forwards custom filters to Nx CLI ([93a6a428](https://github.com/code-pushup/cli/commit/93a6a428)) +- **plugin-eslint:** support new config format in nx helpers ([effd5d26](https://github.com/code-pushup/cli/commit/effd5d26)) + +### ❤️ Thank You + +- Matěj Chalk + ## 0.55.0 (2024-11-25) ### 🚀 Features diff --git a/code-pushup.config.ts b/code-pushup.config.ts index c96b7551c..bd089d884 100644 --- a/code-pushup.config.ts +++ b/code-pushup.config.ts @@ -5,16 +5,9 @@ import { eslintCoreConfigNx, jsPackagesCoreConfig, lighthouseCoreConfig, -} from './code-pushup.preset'; -import { - fileSizePlugin, - fileSizeRecommendedRefs, - packageJsonDocumentationGroupRef, - packageJsonPerformanceGroupRef, - packageJsonPlugin, -} from './dist/examples/plugins'; -import { mergeConfigs } from './dist/packages/utils'; -import type { CoreConfig } from './packages/models/src'; +} from './code-pushup.preset.js'; +import type { CoreConfig } from './packages/models/src/index.js'; +import { mergeConfigs } from './packages/utils/src/index.js'; // load upload configuration from environment const envSchema = z.object({ @@ -35,31 +28,7 @@ const config: CoreConfig = { }, }), - plugins: [ - fileSizePlugin({ - directory: './dist/packages', - pattern: /\.js$/, - budget: 174_080, // 170 kB - }), - - packageJsonPlugin({ - directory: './dist/packages', - license: 'MIT', - type: 'module', - }), - ], - - categories: [ - { - slug: 'custom-checks', - title: 'Custom checks', - refs: [ - ...fileSizeRecommendedRefs, - packageJsonPerformanceGroupRef, - packageJsonDocumentationGroupRef, - ], - }, - ], + plugins: [], }; export default mergeConfigs( diff --git a/code-pushup.preset.ts b/code-pushup.preset.ts index 21d6339b3..74e6b51ce 100644 --- a/code-pushup.preset.ts +++ b/code-pushup.preset.ts @@ -1,15 +1,18 @@ +import type { + CategoryConfig, + CoreConfig, +} from './packages/models/src/index.js'; import coveragePlugin, { getNxCoveragePaths, -} from './dist/packages/plugin-coverage'; +} from './packages/plugin-coverage/src/index.js'; import eslintPlugin, { eslintConfigFromAllNxProjects, eslintConfigFromNxProject, -} from './dist/packages/plugin-eslint'; -import jsPackagesPlugin from './dist/packages/plugin-js-packages'; +} from './packages/plugin-eslint/src/index.js'; +import jsPackagesPlugin from './packages/plugin-js-packages/src/index.js'; import lighthousePlugin, { lighthouseGroupRef, -} from './dist/packages/plugin-lighthouse'; -import type { CategoryConfig, CoreConfig } from './packages/models/src'; +} from './packages/plugin-lighthouse/src/index.js'; export const jsPackagesCategories: CategoryConfig[] = [ { diff --git a/commitlint.config.mjs b/commitlint.config.js similarity index 100% rename from commitlint.config.mjs rename to commitlint.config.js diff --git a/docs/e2e.md b/docs/e2e.md index a239dd047..6bf043d7f 100644 --- a/docs/e2e.md +++ b/docs/e2e.md @@ -144,14 +144,14 @@ export default defineConfig({ // to avoid port conflicts ever E2E targets has a unique port const uniquePort = 6000 + Math.round(Math.random() * 1000); -const e2eDir = join('tmp', 'e2e'); +const e2eDir = path.join('tmp', 'e2e'); export async function setup() { // start local verdaccio registry const { registry } = await startLocalRegistry({ localRegistryTarget: '@code-pushup/cli-source:start-verdaccio', // to avoid file system conflicts ever E2E targets has a unique storage folder - storage: join(join(e2eDir, `registry-${uniquePort}`), 'storage'), + storage: path.join(path.join(e2eDir, `registry-${uniquePort}`), 'storage'), port: uniquePort, }); diff --git a/e2e/ci-e2e/.eslintrc.json b/e2e/ci-e2e/.eslintrc.json deleted file mode 100644 index 8ebe317c9..000000000 --- a/e2e/ci-e2e/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "code-pushup.config*.ts"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["e2e/ci-e2e/tsconfig.*?.json"] - } - } - ] -} diff --git a/e2e/ci-e2e/eslint.config.js b/e2e/ci-e2e/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/e2e/ci-e2e/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/e2e/ci-e2e/mocks/api.ts b/e2e/ci-e2e/mocks/api.ts new file mode 100644 index 000000000..a59a12d8f --- /dev/null +++ b/e2e/ci-e2e/mocks/api.ts @@ -0,0 +1,14 @@ +import type { Comment, ProviderAPIClient } from '@code-pushup/ci'; + +export const MOCK_COMMENT: Comment = { + id: 42, + body: '... ', + url: 'https://github.com///pull/1#issuecomment-42', +}; + +export const MOCK_API: ProviderAPIClient = { + maxCommentChars: 1_000_000, + createComment: () => Promise.resolve(MOCK_COMMENT), + updateComment: () => Promise.resolve(MOCK_COMMENT), + listComments: () => Promise.resolve([]), +}; diff --git a/e2e/ci-e2e/mocks/fixtures/ci-test-repo/code-pushup.config.ts b/e2e/ci-e2e/mocks/fixtures/basic/code-pushup.config.ts similarity index 100% rename from e2e/ci-e2e/mocks/fixtures/ci-test-repo/code-pushup.config.ts rename to e2e/ci-e2e/mocks/fixtures/basic/code-pushup.config.ts diff --git a/e2e/ci-e2e/mocks/fixtures/ci-test-repo/index.js b/e2e/ci-e2e/mocks/fixtures/basic/index.js similarity index 100% rename from e2e/ci-e2e/mocks/fixtures/ci-test-repo/index.js rename to e2e/ci-e2e/mocks/fixtures/basic/index.js diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/code-pushup/categories.js b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/code-pushup/categories.js new file mode 100644 index 000000000..ff9c9a258 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/code-pushup/categories.js @@ -0,0 +1,9 @@ +export const DEFAULT_CATEGORIES = [ + { + slug: 'ts-migration', + title: 'TypeScript migration', + refs: [ + { type: 'audit', plugin: 'ts-migration', slug: 'ts-files', weight: 1 }, + ], + }, +]; diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/code-pushup/ts-migration.plugin.js b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/code-pushup/ts-migration.plugin.js new file mode 100644 index 000000000..7d802f09c --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/code-pushup/ts-migration.plugin.js @@ -0,0 +1,44 @@ +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { crawlFileSystem } from '@code-pushup/utils'; + +export default function tsMigrationPlugin(url) { + return { + slug: 'ts-migration', + title: 'TypeScript migration', + icon: 'typescript', + audits: [ + { + slug: 'ts-files', + title: 'Source files converted from JavaScript to TypeScript', + }, + ], + runner: async () => { + const paths = await crawlFileSystem({ + directory: fileURLToPath(dirname(url)), + pattern: /\.[jt]s$/, + }); + const jsPaths = paths.filter(path => path.endsWith('.js')); + const tsPaths = paths.filter(path => path.endsWith('.ts')); + const jsFileCount = jsPaths.length; + const tsFileCount = tsPaths.length; + const ratio = tsFileCount / (jsFileCount + tsFileCount); + const percentage = Math.round(ratio * 100); + return [ + { + slug: 'ts-files', + value: percentage, + score: ratio, + displayValue: `${percentage}% converted`, + details: { + issues: jsPaths.map(file => ({ + message: 'Use .ts file extension instead of .js', + severity: 'warning', + source: { file }, + })), + }, + }, + ]; + }, + }; +} diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/package-lock.json b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/package-lock.json new file mode 100644 index 000000000..a8e618099 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/package-lock.json @@ -0,0 +1,42 @@ +{ + "name": "npm-workspaces", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "workspaces": [ + "packages/*" + ] + }, + "node_modules/@example/cli": { + "resolved": "packages/cli", + "link": true + }, + "node_modules/@example/core": { + "resolved": "packages/core", + "link": true + }, + "node_modules/@example/utils": { + "resolved": "packages/utils", + "link": true + }, + "packages/cli": { + "name": "@example/cli", + "version": "1.2.3", + "dependencies": { + "@example/core": "1.2.3" + } + }, + "packages/core": { + "name": "@example/core", + "version": "1.2.3", + "dependencies": { + "@example/utils": "1.2.3" + } + }, + "packages/utils": { + "name": "@example/utils", + "version": "1.2.3" + } + } +} diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/package.json b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/package.json new file mode 100644 index 000000000..9f0acdba5 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "workspaces": [ + "packages/*" + ] +} diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/code-pushup.config.js b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/code-pushup.config.js new file mode 100644 index 000000000..796df75d0 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/code-pushup.config.js @@ -0,0 +1,7 @@ +import { DEFAULT_CATEGORIES } from '../../code-pushup/categories.js'; +import tsMigrationPlugin from '../../code-pushup/ts-migration.plugin.js'; + +export default { + plugins: [tsMigrationPlugin(import.meta.url)], + categories: DEFAULT_CATEGORIES, +}; diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/package.json b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/package.json new file mode 100644 index 000000000..8be8e49a2 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/package.json @@ -0,0 +1,10 @@ +{ + "name": "@example/cli", + "version": "1.2.3", + "scripts": { + "code-pushup": "code-pushup --no-progress" + }, + "dependencies": { + "@example/core": "1.2.3" + } +} diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/src/bin.js b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/src/bin.js new file mode 100644 index 000000000..a76cfe4d7 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/cli/src/bin.js @@ -0,0 +1 @@ +console.log('Hello, world'); diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/code-pushup.config.js b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/code-pushup.config.js new file mode 100644 index 000000000..796df75d0 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/code-pushup.config.js @@ -0,0 +1,7 @@ +import { DEFAULT_CATEGORIES } from '../../code-pushup/categories.js'; +import tsMigrationPlugin from '../../code-pushup/ts-migration.plugin.js'; + +export default { + plugins: [tsMigrationPlugin(import.meta.url)], + categories: DEFAULT_CATEGORIES, +}; diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/package.json b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/package.json new file mode 100644 index 000000000..7d1338389 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/package.json @@ -0,0 +1,10 @@ +{ + "name": "@example/core", + "version": "1.2.3", + "scripts": { + "code-pushup": "code-pushup --no-progress" + }, + "dependencies": { + "@example/utils": "1.2.3" + } +} diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/src/index.js b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/src/index.js new file mode 100644 index 000000000..a76cfe4d7 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/core/src/index.js @@ -0,0 +1 @@ +console.log('Hello, world'); diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/code-pushup.config.js b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/code-pushup.config.js new file mode 100644 index 000000000..796df75d0 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/code-pushup.config.js @@ -0,0 +1,7 @@ +import { DEFAULT_CATEGORIES } from '../../code-pushup/categories.js'; +import tsMigrationPlugin from '../../code-pushup/ts-migration.plugin.js'; + +export default { + plugins: [tsMigrationPlugin(import.meta.url)], + categories: DEFAULT_CATEGORIES, +}; diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/package.json b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/package.json new file mode 100644 index 000000000..b739b5d9d --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/package.json @@ -0,0 +1,7 @@ +{ + "name": "@example/utils", + "version": "1.2.3", + "scripts": { + "code-pushup": "code-pushup --no-progress" + } +} diff --git a/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/src/index.js b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/src/index.js new file mode 100644 index 000000000..a76cfe4d7 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/npm-workspaces/packages/utils/src/index.js @@ -0,0 +1 @@ +console.log('Hello, world'); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/code-pushup.config.js b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/code-pushup.config.js new file mode 100644 index 000000000..984fdd122 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/code-pushup.config.js @@ -0,0 +1,3 @@ +import { resolveConfig } from '../../code-pushup.preset.js'; + +export default resolveConfig(import.meta.url); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/project.json b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/project.json new file mode 100644 index 000000000..9a9308248 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/project.json @@ -0,0 +1,9 @@ +{ + "name": "api", + "projectType": "application", + "targets": { + "code-pushup": { + "command": "npx @code-pushup/cli --no-progress --config=apps/api/code-pushup.config.js" + } + } +} diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/src/index.js b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/src/index.js new file mode 100644 index 000000000..e9fe0090d --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/api/src/index.js @@ -0,0 +1 @@ +console.log('Hello, world!'); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/code-pushup.config.js b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/code-pushup.config.js new file mode 100644 index 000000000..984fdd122 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/code-pushup.config.js @@ -0,0 +1,3 @@ +import { resolveConfig } from '../../code-pushup.preset.js'; + +export default resolveConfig(import.meta.url); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/project.json b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/project.json new file mode 100644 index 000000000..dfc038de3 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/project.json @@ -0,0 +1,9 @@ +{ + "name": "cms", + "projectType": "application", + "targets": { + "code-pushup": { + "command": "npx @code-pushup/cli --no-progress --config=apps/cms/code-pushup.config.js" + } + } +} diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/src/index.js b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/src/index.js new file mode 100644 index 000000000..e9fe0090d --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/cms/src/index.js @@ -0,0 +1 @@ +console.log('Hello, world!'); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/code-pushup.config.js b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/code-pushup.config.js new file mode 100644 index 000000000..984fdd122 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/code-pushup.config.js @@ -0,0 +1,3 @@ +import { resolveConfig } from '../../code-pushup.preset.js'; + +export default resolveConfig(import.meta.url); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/project.json b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/project.json new file mode 100644 index 000000000..992d0e57e --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/project.json @@ -0,0 +1,9 @@ +{ + "name": "web", + "projectType": "application", + "targets": { + "code-pushup": { + "command": "npx @code-pushup/cli --no-progress --config=apps/web/code-pushup.config.js" + } + } +} diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/src/index.ts b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/src/index.ts new file mode 100644 index 000000000..e9fe0090d --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/apps/web/src/index.ts @@ -0,0 +1 @@ +console.log('Hello, world!'); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/code-pushup.preset.js b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/code-pushup.preset.js new file mode 100644 index 000000000..43acc1537 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/code-pushup.preset.js @@ -0,0 +1,66 @@ +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { crawlFileSystem } from '@code-pushup/utils'; + +export function resolveConfig(url) { + const directory = fileURLToPath(dirname(url)); + return { + persist: { + outputDir: join(directory, '.code-pushup'), + }, + plugins: [ + { + slug: 'ts-migration', + title: 'TypeScript migration', + icon: 'typescript', + audits: [ + { + slug: 'ts-files', + title: 'Source files converted from JavaScript to TypeScript', + }, + ], + runner: async () => { + const paths = await crawlFileSystem({ + directory, + pattern: /\.[jt]s$/, + }); + const jsPaths = paths.filter(path => path.endsWith('.js')); + const tsPaths = paths.filter(path => path.endsWith('.ts')); + const jsFileCount = jsPaths.length; + const tsFileCount = tsPaths.length; + const ratio = tsFileCount / (jsFileCount + tsFileCount); + const percentage = Math.round(ratio * 100); + return [ + { + slug: 'ts-files', + value: percentage, + score: ratio, + displayValue: `${percentage}% converted`, + details: { + issues: jsPaths.map(file => ({ + message: 'Use .ts file extension instead of .js', + severity: 'warning', + source: { file }, + })), + }, + }, + ]; + }, + }, + ], + categories: [ + { + slug: 'ts-migration', + title: 'TypeScript migration', + refs: [ + { + type: 'audit', + plugin: 'ts-migration', + slug: 'ts-files', + weight: 1, + }, + ], + }, + ], + }; +} diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/code-pushup.config.js b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/code-pushup.config.js new file mode 100644 index 000000000..984fdd122 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/code-pushup.config.js @@ -0,0 +1,3 @@ +import { resolveConfig } from '../../code-pushup.preset.js'; + +export default resolveConfig(import.meta.url); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/project.json b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/project.json new file mode 100644 index 000000000..aec5ff267 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/project.json @@ -0,0 +1,9 @@ +{ + "name": "ui", + "projectType": "library", + "targets": { + "code-pushup": { + "command": "npx @code-pushup/cli --no-progress --config=libs/ui/code-pushup.config.js" + } + } +} diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/src/index.test.ts b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/src/index.test.ts new file mode 100644 index 000000000..76b6b6045 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/src/index.test.ts @@ -0,0 +1,6 @@ +import assert from 'node:assert'; +import test from 'node:test'; + +test('1984', () => { + assert.equal(2 + 2, 5); +}); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/src/index.ts b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/src/index.ts new file mode 100644 index 000000000..e9fe0090d --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/ui/src/index.ts @@ -0,0 +1 @@ +console.log('Hello, world!'); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/code-pushup.config.js b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/code-pushup.config.js new file mode 100644 index 000000000..984fdd122 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/code-pushup.config.js @@ -0,0 +1,3 @@ +import { resolveConfig } from '../../code-pushup.preset.js'; + +export default resolveConfig(import.meta.url); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/project.json b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/project.json new file mode 100644 index 000000000..fc0812779 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/project.json @@ -0,0 +1,9 @@ +{ + "name": "utils", + "projectType": "library", + "targets": { + "code-pushup": { + "command": "npx @code-pushup/cli --no-progress --config=libs/utils/code-pushup.config.js" + } + } +} diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/src/index.js b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/src/index.js new file mode 100644 index 000000000..e9fe0090d --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/src/index.js @@ -0,0 +1 @@ +console.log('Hello, world!'); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/src/index.test.js b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/src/index.test.js new file mode 100644 index 000000000..76b6b6045 --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/libs/utils/src/index.test.js @@ -0,0 +1,6 @@ +import assert from 'node:assert'; +import test from 'node:test'; + +test('1984', () => { + assert.equal(2 + 2, 5); +}); diff --git a/e2e/ci-e2e/mocks/fixtures/nx-monorepo/nx.json b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/nx.json new file mode 100644 index 000000000..047c7dd4d --- /dev/null +++ b/e2e/ci-e2e/mocks/fixtures/nx-monorepo/nx.json @@ -0,0 +1,4 @@ +{ + "$schema": "../../../../../node_modules/nx/schemas/nx-schema.json", + "useDaemonProcess": false +} diff --git a/e2e/ci-e2e/mocks/setup.ts b/e2e/ci-e2e/mocks/setup.ts new file mode 100644 index 000000000..70d47a192 --- /dev/null +++ b/e2e/ci-e2e/mocks/setup.ts @@ -0,0 +1,43 @@ +import { cp } from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { simpleGit } from 'simple-git'; +import { nxTargetProject } from '@code-pushup/test-nx-utils'; +import { teardownTestFolder } from '@code-pushup/test-setup'; +import { + E2E_ENVIRONMENTS_DIR, + TEST_OUTPUT_DIR, + initGitRepo, + simulateGitFetch, +} from '@code-pushup/test-utils'; + +export type TestRepo = Awaited>; + +export async function setupTestRepo(folder: string) { + const fixturesDir = path.join( + fileURLToPath(path.dirname(import.meta.url)), + 'fixtures', + folder, + ); + const baseDir = path.join( + process.cwd(), + E2E_ENVIRONMENTS_DIR, + nxTargetProject(), + TEST_OUTPUT_DIR, + folder, + ); + + await cp(fixturesDir, baseDir, { recursive: true }); + + const git = await initGitRepo(simpleGit, { baseDir }); + await simulateGitFetch(git); + + await git.add('.'); + await git.commit('Initial commit'); + + return { + git, + baseDir, + cleanup: () => teardownTestFolder(baseDir), + }; +} diff --git a/e2e/ci-e2e/tests/__snapshots__/report-diff.md b/e2e/ci-e2e/tests/__snapshots__/basic-report-diff.md similarity index 100% rename from e2e/ci-e2e/tests/__snapshots__/report-diff.md rename to e2e/ci-e2e/tests/__snapshots__/basic-report-diff.md diff --git a/e2e/ci-e2e/tests/__snapshots__/npm-workspaces-report-diff.md b/e2e/ci-e2e/tests/__snapshots__/npm-workspaces-report-diff.md new file mode 100644 index 000000000..ca5179383 --- /dev/null +++ b/e2e/ci-e2e/tests/__snapshots__/npm-workspaces-report-diff.md @@ -0,0 +1,45 @@ +# Code PushUp + +🥳 Code PushUp report has **improved** – compared target commit `` with source commit ``. + +## 💼 Project `@example/core` + +🥳 Code PushUp report has **improved**. + +| 🏷️ Category | ⭐ Previous score | ⭐ Current score | 🔄 Score change | +| :------------------- | :--------------: | :-------------: | :--------------------------------------------------------------: | +| TypeScript migration | 🔴 0 | 🟢 **100** | ![↑ +100](https://img.shields.io/badge/%E2%86%91%20%2B100-green) | + +
+👍 1 audit improved + +### 🛡️ Audits + +| 🔌 Plugin | 🛡️ Audit | 📏 Previous value | 📏 Current value | 🔄 Value change | +| :------------------- | :--------------------------------------------------- | :---------------: | :-------------------: | :--------------------------------------------------------------------------------: | +| TypeScript migration | Source files converted from JavaScript to TypeScript | 🟥 0% converted | 🟩 **100% converted** | ![↑ +∞ %](https://img.shields.io/badge/%E2%86%91%20%2B%E2%88%9E%E2%80%89%25-green) | + +
+ +## 💼 Project `@example/cli` + +🥳 Code PushUp report has **improved**. + +| 🏷️ Category | ⭐ Previous score | ⭐ Current score | 🔄 Score change | +| :------------------- | :--------------: | :-------------: | :------------------------------------------------------------: | +| TypeScript migration | 🔴 0 | 🟡 **50** | ![↑ +50](https://img.shields.io/badge/%E2%86%91%20%2B50-green) | + +
+👍 1 audit improved + +### 🛡️ Audits + +| 🔌 Plugin | 🛡️ Audit | 📏 Previous value | 📏 Current value | 🔄 Value change | +| :------------------- | :--------------------------------------------------- | :---------------: | :------------------: | :--------------------------------------------------------------------------------: | +| TypeScript migration | Source files converted from JavaScript to TypeScript | 🟥 0% converted | 🟨 **50% converted** | ![↑ +∞ %](https://img.shields.io/badge/%E2%86%91%20%2B%E2%88%9E%E2%80%89%25-green) | + +
+ +--- + +1 other project is unchanged. diff --git a/e2e/ci-e2e/tests/__snapshots__/nx-monorepo-report-diff.md b/e2e/ci-e2e/tests/__snapshots__/nx-monorepo-report-diff.md new file mode 100644 index 000000000..45ca3a465 --- /dev/null +++ b/e2e/ci-e2e/tests/__snapshots__/nx-monorepo-report-diff.md @@ -0,0 +1,64 @@ +# Code PushUp + +🤨 Code PushUp report has both **improvements and regressions** – compared target commit `` with source commit ``. + +## 💼 Project `api` + +🥳 Code PushUp report has **improved**. + +| 🏷️ Category | ⭐ Previous score | ⭐ Current score | 🔄 Score change | +| :------------------- | :--------------: | :-------------: | :------------------------------------------------------------: | +| TypeScript migration | 🔴 0 | 🟡 **50** | ![↑ +50](https://img.shields.io/badge/%E2%86%91%20%2B50-green) | + +
+👍 1 audit improved + +### 🛡️ Audits + +| 🔌 Plugin | 🛡️ Audit | 📏 Previous value | 📏 Current value | 🔄 Value change | +| :------------------- | :--------------------------------------------------- | :---------------: | :------------------: | :--------------------------------------------------------------------------------: | +| TypeScript migration | Source files converted from JavaScript to TypeScript | 🟥 0% converted | 🟨 **50% converted** | ![↑ +∞ %](https://img.shields.io/badge/%E2%86%91%20%2B%E2%88%9E%E2%80%89%25-green) | + +
+ +## 💼 Project `web` + +😟 Code PushUp report has **regressed**. + +| 🏷️ Category | ⭐ Previous score | ⭐ Current score | 🔄 Score change | +| :------------------- | :--------------: | :-------------: | :----------------------------------------------------------------: | +| TypeScript migration | 🟡 50 | 🔴 **0** | ![↓ −50](https://img.shields.io/badge/%E2%86%93%20%E2%88%9250-red) | + +
+👎 1 audit regressed + +### 🛡️ Audits + +| 🔌 Plugin | 🛡️ Audit | 📏 Previous value | 📏 Current value | 🔄 Value change | +| :------------------- | :--------------------------------------------------- | :---------------: | :-----------------: | :--------------------------------------------------------------------------------: | +| TypeScript migration | Source files converted from JavaScript to TypeScript | 🟨 50% converted | 🟥 **0% converted** | ![↓ −100 %](https://img.shields.io/badge/%E2%86%93%20%E2%88%92100%E2%80%89%25-red) | + +
+ +## 💼 Project `ui` + +🥳 Code PushUp report has **improved**. + +| 🏷️ Category | ⭐ Previous score | ⭐ Current score | 🔄 Score change | +| :------------------- | :--------------: | :-------------: | :----------------------------------------------------------------: | +| TypeScript migration | 🟡 67 | 🟢 **100** | ![↑ +33.3](https://img.shields.io/badge/%E2%86%91%20%2B33.3-green) | + +
+👍 1 audit improved + +### 🛡️ Audits + +| 🔌 Plugin | 🛡️ Audit | 📏 Previous value | 📏 Current value | 🔄 Value change | +| :------------------- | :--------------------------------------------------- | :---------------: | :-------------------: | :------------------------------------------------------------------------------: | +| TypeScript migration | Source files converted from JavaScript to TypeScript | 🟨 67% converted | 🟩 **100% converted** | ![↑ +49.3 %](https://img.shields.io/badge/%E2%86%91%20%2B49.3%E2%80%89%25-green) | + +
+ +--- + +2 other projects are unchanged. diff --git a/e2e/ci-e2e/tests/basic.e2e.test.ts b/e2e/ci-e2e/tests/basic.e2e.test.ts new file mode 100644 index 000000000..f5f00d176 --- /dev/null +++ b/e2e/ci-e2e/tests/basic.e2e.test.ts @@ -0,0 +1,130 @@ +import { readFile, rename } from 'node:fs/promises'; +import path from 'node:path'; +import type { SimpleGit } from 'simple-git'; +import { afterEach } from 'vitest'; +import { + type GitRefs, + type Options, + type RunResult, + runInCI, +} from '@code-pushup/ci'; +import { TEST_SNAPSHOTS_DIR } from '@code-pushup/test-utils'; +import { MOCK_API, MOCK_COMMENT } from '../mocks/api.js'; +import { type TestRepo, setupTestRepo } from '../mocks/setup.js'; + +describe('CI - standalone mode', () => { + let repo: TestRepo; + let git: SimpleGit; + let options: Options; + + beforeEach(async () => { + repo = await setupTestRepo('basic'); + git = repo.git; + options = { + directory: repo.baseDir, + silent: true, // comment out for debugging + }; + }); + + afterEach(async () => { + await repo.cleanup(); + }); + + describe('push event', () => { + beforeEach(async () => { + await git.checkout('main'); + }); + + it('should collect report', async () => { + await expect( + runInCI( + { head: { ref: 'main', sha: await git.revparse('main') } }, + MOCK_API, + options, + git, + ), + ).resolves.toEqual({ + mode: 'standalone', + files: { + report: { + json: path.join(repo.baseDir, '.code-pushup/report.json'), + md: path.join(repo.baseDir, '.code-pushup/report.md'), + }, + }, + } satisfies RunResult); + + const jsonPromise = readFile( + path.join(repo.baseDir, '.code-pushup/report.json'), + 'utf8', + ); + await expect(jsonPromise).resolves.toBeTruthy(); + const report = JSON.parse(await jsonPromise) as Report; + expect(report).toEqual( + expect.objectContaining({ + plugins: [ + expect.objectContaining({ + slug: 'ts-migration', + audits: [ + expect.objectContaining({ + score: 0.5, + displayValue: '50% converted', + }), + ], + }), + ], + }), + ); + }); + }); + + describe('pull request event', () => { + let refs: GitRefs; + + beforeEach(async () => { + await git.checkoutLocalBranch('feature-1'); + + await rename( + path.join(repo.baseDir, 'index.js'), + path.join(repo.baseDir, 'index.ts'), + ); + + await git.add('index.ts'); + await git.commit('Convert JS file to TS'); + + refs = { + head: { ref: 'feature-1', sha: await git.revparse('feature-1') }, + base: { ref: 'main', sha: await git.revparse('main') }, + }; + }); + + it('should compare reports', async () => { + await expect(runInCI(refs, MOCK_API, options, git)).resolves.toEqual({ + mode: 'standalone', + commentId: MOCK_COMMENT.id, + newIssues: [], + files: { + report: { + json: path.join(repo.baseDir, '.code-pushup/report.json'), + md: path.join(repo.baseDir, '.code-pushup/report.md'), + }, + diff: { + json: path.join(repo.baseDir, '.code-pushup/report-diff.json'), + md: path.join(repo.baseDir, '.code-pushup/report-diff.md'), + }, + }, + } satisfies RunResult); + + const mdPromise = readFile( + path.join(repo.baseDir, '.code-pushup/report-diff.md'), + 'utf8', + ); + await expect(mdPromise).resolves.toBeTruthy(); + const md = await mdPromise; + await expect( + md.replace(/[\da-f]{40}/g, '``'), + ).toMatchFileSnapshot( + path.join(TEST_SNAPSHOTS_DIR, 'basic-report-diff.md'), + ); + }); + }); +}); diff --git a/e2e/ci-e2e/tests/ci.e2e.test.ts b/e2e/ci-e2e/tests/ci.e2e.test.ts deleted file mode 100644 index 96d85f9ac..000000000 --- a/e2e/ci-e2e/tests/ci.e2e.test.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { cp, readFile, rename } from 'node:fs/promises'; -import { dirname, join } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { - type DiffResult, - type FetchResult, - type SimpleGit, - simpleGit, -} from 'simple-git'; -import { afterEach } from 'vitest'; -import { - type Comment, - type GitRefs, - type Options, - type ProviderAPIClient, - type RunResult, - runInCI, -} from '@code-pushup/ci'; -import { nxTargetProject } from '@code-pushup/test-nx-utils'; -import { teardownTestFolder } from '@code-pushup/test-setup'; -import { - E2E_ENVIRONMENTS_DIR, - TEST_OUTPUT_DIR, - TEST_SNAPSHOTS_DIR, - initGitRepo, -} from '@code-pushup/test-utils'; - -describe('CI package', () => { - const fixturesDir = join( - fileURLToPath(dirname(import.meta.url)), - '..', - 'mocks', - 'fixtures', - 'ci-test-repo', - ); - const ciSetupRepoDir = join( - process.cwd(), - E2E_ENVIRONMENTS_DIR, - nxTargetProject(), - TEST_OUTPUT_DIR, - 'ci-test-repo', - ); - const outputDir = join(ciSetupRepoDir, '.code-pushup'); - - const options = { - directory: ciSetupRepoDir, - } satisfies Options; - - let git: SimpleGit; - - beforeEach(async () => { - await cp(fixturesDir, ciSetupRepoDir, { recursive: true }); - - git = await initGitRepo(simpleGit, { baseDir: ciSetupRepoDir }); - - vi.spyOn(git, 'fetch').mockResolvedValue({} as FetchResult); - vi.spyOn(git, 'diffSummary').mockResolvedValue({ - files: [{ file: 'index.ts', binary: false }], - } as DiffResult); - vi.spyOn(git, 'diff').mockResolvedValue(''); - - await git.add('index.js'); - await git.add('code-pushup.config.ts'); - await git.commit('Initial commit'); - }); - - afterEach(async () => { - await teardownTestFolder(ciSetupRepoDir); - }); - - afterAll(async () => { - await teardownTestFolder(ciSetupRepoDir); - }); - - describe('push event', () => { - beforeEach(async () => { - await git.checkout('main'); - }); - - it('should collect report', async () => { - await expect( - runInCI( - { head: { ref: 'main', sha: await git.revparse('main') } }, - {} as ProviderAPIClient, - options, - git, - ), - ).resolves.toEqual({ - mode: 'standalone', - artifacts: { - report: { - rootDir: outputDir, - files: [ - join(outputDir, 'report.json'), - join(outputDir, 'report.md'), - ], - }, - }, - } satisfies RunResult); - - const jsonPromise = readFile(join(outputDir, 'report.json'), 'utf8'); - await expect(jsonPromise).resolves.toBeTruthy(); - const report = JSON.parse(await jsonPromise) as Report; - expect(report).toEqual( - expect.objectContaining({ - plugins: [ - expect.objectContaining({ - slug: 'ts-migration', - audits: [ - expect.objectContaining({ - score: 0.5, - displayValue: '50% converted', - }), - ], - }), - ], - }), - ); - }); - }); - - describe('pull request event', () => { - const comment: Comment = { - id: 42, - body: '... ', - url: 'https://github.com///pull/1#issuecomment-42', - }; - const api: ProviderAPIClient = { - maxCommentChars: 1_000_000, - createComment: () => Promise.resolve(comment), - updateComment: () => Promise.resolve(comment), - listComments: () => Promise.resolve([]), - }; - - let refs: GitRefs; - - beforeEach(async () => { - await git.checkoutLocalBranch('feature-1'); - - await rename( - join(ciSetupRepoDir, 'index.js'), - join(ciSetupRepoDir, 'index.ts'), - ); - - await git.add('index.ts'); - await git.commit('Convert JS file to TS'); - - refs = { - head: { ref: 'feature-1', sha: await git.revparse('feature-1') }, - base: { ref: 'main', sha: await git.revparse('main') }, - }; - }); - - it('should compare reports', async () => { - await expect(runInCI(refs, api, options, git)).resolves.toEqual({ - mode: 'standalone', - commentId: comment.id, - newIssues: [], - artifacts: { - report: { - rootDir: outputDir, - files: [ - join(outputDir, 'report.json'), - join(outputDir, 'report.md'), - ], - }, - diff: { - rootDir: outputDir, - files: [ - join(outputDir, 'report-diff.json'), - join(outputDir, 'report-diff.md'), - ], - }, - }, - } satisfies RunResult); - - const mdPromise = readFile(join(outputDir, 'report-diff.md'), 'utf8'); - await expect(mdPromise).resolves.toBeTruthy(); - const md = await mdPromise; - await expect( - md.replace(/[\da-f]{40}/g, '``'), - ).toMatchFileSnapshot(join(TEST_SNAPSHOTS_DIR, 'report-diff.md')); - }); - }); -}); diff --git a/e2e/ci-e2e/tests/npm-workspaces.e2e.test.ts b/e2e/ci-e2e/tests/npm-workspaces.e2e.test.ts new file mode 100644 index 000000000..af2a7ddd9 --- /dev/null +++ b/e2e/ci-e2e/tests/npm-workspaces.e2e.test.ts @@ -0,0 +1,167 @@ +import { readFile, rename } from 'node:fs/promises'; +import path from 'node:path'; +import type { SimpleGit } from 'simple-git'; +import { afterEach } from 'vitest'; +import { + type GitRefs, + type Options, + type ProjectRunResult, + type RunResult, + runInCI, +} from '@code-pushup/ci'; +import { TEST_SNAPSHOTS_DIR } from '@code-pushup/test-utils'; +import { readJsonFile } from '@code-pushup/utils'; +import { MOCK_API, MOCK_COMMENT } from '../mocks/api.js'; +import { type TestRepo, setupTestRepo } from '../mocks/setup.js'; + +describe('CI - monorepo mode (npm workspaces)', () => { + let repo: TestRepo; + let git: SimpleGit; + let options: Options; + + beforeEach(async () => { + repo = await setupTestRepo('npm-workspaces'); + git = repo.git; + options = { + monorepo: true, + directory: repo.baseDir, + silent: true, // comment out for debugging + }; + }); + + afterEach(async () => { + await repo.cleanup(); + }); + + describe('push event', () => { + beforeEach(async () => { + await git.checkout('main'); + }); + + it('should collect reports for all projects', async () => { + await expect( + runInCI( + { head: { ref: 'main', sha: await git.revparse('main') } }, + MOCK_API, + options, + git, + ), + ).resolves.toEqual({ + mode: 'monorepo', + projects: expect.arrayContaining([ + { + name: '@example/cli', + files: { + report: { + json: path.join( + repo.baseDir, + 'packages/cli/.code-pushup/report.json', + ), + md: path.join( + repo.baseDir, + 'packages/cli/.code-pushup/report.md', + ), + }, + }, + }, + ]), + } satisfies RunResult); + + await expect( + readJsonFile( + path.join(repo.baseDir, 'packages/cli/.code-pushup/report.json'), + ), + ).resolves.toEqual( + expect.objectContaining({ + plugins: [ + expect.objectContaining({ + audits: [ + expect.objectContaining({ + score: 0, + displayValue: '0% converted', + }), + ], + }), + ], + }), + ); + }); + }); + + describe('pull request event', () => { + let refs: GitRefs; + + beforeEach(async () => { + await git.checkoutLocalBranch('feature-1'); + + await rename( + path.join(repo.baseDir, 'packages/cli/src/bin.js'), + path.join(repo.baseDir, 'packages/cli/src/bin.ts'), + ); + await rename( + path.join(repo.baseDir, 'packages/core/src/index.js'), + path.join(repo.baseDir, 'packages/core/src/index.ts'), + ); + await rename( + path.join(repo.baseDir, 'packages/core/code-pushup.config.js'), + path.join(repo.baseDir, 'packages/core/code-pushup.config.ts'), + ); + + await git.add('.'); + await git.commit('Convert JS files to TS'); + + refs = { + head: { ref: 'feature-1', sha: await git.revparse('feature-1') }, + base: { ref: 'main', sha: await git.revparse('main') }, + }; + }); + + it('should compare reports for all packages and merge into Markdown comment', async () => { + await expect(runInCI(refs, MOCK_API, options, git)).resolves.toEqual({ + mode: 'monorepo', + commentId: MOCK_COMMENT.id, + diffPath: path.join(repo.baseDir, '.code-pushup/merged-report-diff.md'), + projects: expect.arrayContaining([ + { + name: '@example/core', + files: { + report: { + json: path.join( + repo.baseDir, + 'packages/core/.code-pushup/report.json', + ), + md: path.join( + repo.baseDir, + 'packages/core/.code-pushup/report.md', + ), + }, + diff: { + json: path.join( + repo.baseDir, + 'packages/core/.code-pushup/report-diff.json', + ), + md: path.join( + repo.baseDir, + 'packages/core/.code-pushup/report-diff.md', + ), + }, + }, + newIssues: [], + }, + ]), + } satisfies RunResult); + + const mdPromise = readFile( + path.join(repo.baseDir, '.code-pushup/merged-report-diff.md'), + 'utf8', + ); + await expect(mdPromise).resolves.toBeTruthy(); + const md = await mdPromise; + await expect( + md.replace(/[\da-f]{40}/g, '``'), + ).toMatchFileSnapshot( + path.join(TEST_SNAPSHOTS_DIR, 'npm-workspaces-report-diff.md'), + ); + }); + }); +}); diff --git a/e2e/ci-e2e/tests/nx-monorepo.e2e.test.ts b/e2e/ci-e2e/tests/nx-monorepo.e2e.test.ts new file mode 100644 index 000000000..3338980e8 --- /dev/null +++ b/e2e/ci-e2e/tests/nx-monorepo.e2e.test.ts @@ -0,0 +1,197 @@ +import { readFile, rename, writeFile } from 'node:fs/promises'; +import path from 'node:path'; +import type { SimpleGit } from 'simple-git'; +import { afterEach } from 'vitest'; +import { + type GitRefs, + type Options, + type ProjectRunResult, + type RunResult, + runInCI, +} from '@code-pushup/ci'; +import { TEST_SNAPSHOTS_DIR } from '@code-pushup/test-utils'; +import { readJsonFile } from '@code-pushup/utils'; +import { MOCK_API, MOCK_COMMENT } from '../mocks/api.js'; +import { type TestRepo, setupTestRepo } from '../mocks/setup.js'; + +describe('CI - monorepo mode (Nx)', () => { + let repo: TestRepo; + let git: SimpleGit; + let options: Options; + + beforeEach(async () => { + repo = await setupTestRepo('nx-monorepo'); + git = repo.git; + options = { + monorepo: true, + directory: repo.baseDir, + parallel: true, + silent: true, // comment out for debugging + }; + }); + + afterEach(async () => { + await repo.cleanup(); + }); + + describe('push event', () => { + beforeEach(async () => { + await git.checkout('main'); + }); + + it('should collect reports for all projects', async () => { + await expect( + runInCI( + { head: { ref: 'main', sha: await git.revparse('main') } }, + MOCK_API, + options, + git, + ), + ).resolves.toEqual({ + mode: 'monorepo', + projects: expect.arrayContaining([ + { + name: 'api', + files: { + report: { + json: path.join( + repo.baseDir, + 'apps/api/.code-pushup/report.json', + ), + md: path.join(repo.baseDir, 'apps/api/.code-pushup/report.md'), + }, + }, + }, + ]), + } satisfies RunResult); + + await expect( + readJsonFile( + path.join(repo.baseDir, 'apps/api/.code-pushup/report.json'), + ), + ).resolves.toEqual( + expect.objectContaining({ + plugins: [ + expect.objectContaining({ + audits: [ + expect.objectContaining({ + score: 0, + displayValue: '0% converted', + }), + ], + }), + ], + }), + ); + await expect( + readJsonFile( + path.join(repo.baseDir, 'libs/ui/.code-pushup/report.json'), + ), + ).resolves.toEqual( + expect.objectContaining({ + plugins: [ + expect.objectContaining({ + audits: [ + expect.objectContaining({ + score: expect.closeTo(0.666), + displayValue: '67% converted', + }), + ], + }), + ], + }), + ); + }); + }); + + describe('pull request event', () => { + let refs: GitRefs; + + beforeEach(async () => { + await git.checkoutLocalBranch('feature-1'); + + await rename( + path.join(repo.baseDir, 'apps/api/src/index.js'), + path.join(repo.baseDir, 'apps/api/src/index.ts'), + ); + await rename( + path.join(repo.baseDir, 'apps/web/src/index.ts'), + path.join(repo.baseDir, 'apps/web/src/index.js'), + ); + await rename( + path.join(repo.baseDir, 'libs/ui/code-pushup.config.js'), + path.join(repo.baseDir, 'libs/ui/code-pushup.config.ts'), + ); + await writeFile( + path.join(repo.baseDir, 'libs/ui/project.json'), + ( + await readFile( + path.join(repo.baseDir, 'libs/ui/project.json'), + 'utf8', + ) + ).replace('code-pushup.config.js', 'code-pushup.config.ts'), + ); + + await git.add('.'); + await git.commit('Convert JS->TS for api and ui, TS->JS for web'); + + refs = { + head: { ref: 'feature-1', sha: await git.revparse('feature-1') }, + base: { ref: 'main', sha: await git.revparse('main') }, + }; + }); + + it('should compare reports for all projects, detect new issues and merge into Markdown comment', async () => { + await expect(runInCI(refs, MOCK_API, options, git)).resolves.toEqual({ + mode: 'monorepo', + commentId: MOCK_COMMENT.id, + diffPath: path.join(repo.baseDir, '.code-pushup/merged-report-diff.md'), + projects: expect.arrayContaining([ + { + name: 'web', + files: { + report: { + json: path.join( + repo.baseDir, + 'apps/web/.code-pushup/report.json', + ), + md: path.join(repo.baseDir, 'apps/web/.code-pushup/report.md'), + }, + diff: { + json: path.join( + repo.baseDir, + 'apps/web/.code-pushup/report-diff.json', + ), + md: path.join( + repo.baseDir, + 'apps/web/.code-pushup/report-diff.md', + ), + }, + }, + newIssues: [ + { + message: 'Use .ts file extension instead of .js', + severity: 'warning', + source: { file: 'apps/web/src/index.js' }, + plugin: expect.objectContaining({ slug: 'ts-migration' }), + audit: expect.objectContaining({ slug: 'ts-files' }), + }, + ], + }, + ]), + } satisfies RunResult); + + const mdPromise = readFile( + path.join(repo.baseDir, '.code-pushup/merged-report-diff.md'), + 'utf8', + ); + await expect(mdPromise).resolves.toBeTruthy(); + const md = await mdPromise; + await expect( + md.replace(/[\da-f]{40}/g, '``'), + ).toMatchFileSnapshot( + path.join(TEST_SNAPSHOTS_DIR, 'nx-monorepo-report-diff.md'), + ); + }); + }); +}); diff --git a/e2e/ci-e2e/vite.config.e2e.ts b/e2e/ci-e2e/vite.config.e2e.ts index ff6c2e67f..fe5496790 100644 --- a/e2e/ci-e2e/vite.config.e2e.ts +++ b/e2e/ci-e2e/vite.config.e2e.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/ci-e2e', diff --git a/e2e/cli-e2e/.eslintrc.json b/e2e/cli-e2e/.eslintrc.json deleted file mode 100644 index 1e0f5f7ec..000000000 --- a/e2e/cli-e2e/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "code-pushup.config*.ts"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["e2e/cli-e2e/tsconfig.*?.json"] - } - } - ] -} diff --git a/e2e/cli-e2e/eslint.config.js b/e2e/cli-e2e/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/e2e/cli-e2e/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.js b/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.js index 26928cba2..31a99f0be 100644 --- a/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.js +++ b/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.js @@ -1,4 +1,4 @@ -import dummyPlugin, { dummyCategory } from './dummy.plugin'; +import dummyPlugin, { dummyCategory } from './dummy.plugin.js'; export default { plugins: [dummyPlugin()], diff --git a/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.mjs b/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.mjs index 26928cba2..31a99f0be 100644 --- a/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.mjs +++ b/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.mjs @@ -1,4 +1,4 @@ -import dummyPlugin, { dummyCategory } from './dummy.plugin'; +import dummyPlugin, { dummyCategory } from './dummy.plugin.js'; export default { plugins: [dummyPlugin()], diff --git a/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.ts b/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.ts index 26928cba2..31a99f0be 100644 --- a/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.ts +++ b/e2e/cli-e2e/mocks/fixtures/dummy-setup/code-pushup.config.ts @@ -1,4 +1,4 @@ -import dummyPlugin, { dummyCategory } from './dummy.plugin'; +import dummyPlugin, { dummyCategory } from './dummy.plugin.js'; export default { plugins: [dummyPlugin()], diff --git a/e2e/cli-e2e/mocks/fixtures/dummy-setup/dummy.plugin.ts b/e2e/cli-e2e/mocks/fixtures/dummy-setup/dummy.plugin.ts index 8ff5ebd18..702967e60 100644 --- a/e2e/cli-e2e/mocks/fixtures/dummy-setup/dummy.plugin.ts +++ b/e2e/cli-e2e/mocks/fixtures/dummy-setup/dummy.plugin.ts @@ -1,5 +1,5 @@ import { readFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import type { PluginConfig } from '@code-pushup/models'; export const dummyPluginSlug = 'dummy-plugin'; @@ -32,7 +32,7 @@ export function create(): PluginConfig { description: 'A dummy plugin to test the cli.', runner: async () => { const itemCount = JSON.parse( - await readFile(join('src', 'items.json'), 'utf-8'), + await readFile(path.join('src', 'items.json'), 'utf-8'), ).length; return [ { diff --git a/e2e/cli-e2e/mocks/fixtures/existing-reports/code-pushup.config.ts b/e2e/cli-e2e/mocks/fixtures/existing-reports/code-pushup.config.ts index 26928cba2..31a99f0be 100644 --- a/e2e/cli-e2e/mocks/fixtures/existing-reports/code-pushup.config.ts +++ b/e2e/cli-e2e/mocks/fixtures/existing-reports/code-pushup.config.ts @@ -1,4 +1,4 @@ -import dummyPlugin, { dummyCategory } from './dummy.plugin'; +import dummyPlugin, { dummyCategory } from './dummy.plugin.js'; export default { plugins: [dummyPlugin()], diff --git a/e2e/cli-e2e/mocks/fixtures/existing-reports/dummy.plugin.ts b/e2e/cli-e2e/mocks/fixtures/existing-reports/dummy.plugin.ts index 8ff5ebd18..702967e60 100644 --- a/e2e/cli-e2e/mocks/fixtures/existing-reports/dummy.plugin.ts +++ b/e2e/cli-e2e/mocks/fixtures/existing-reports/dummy.plugin.ts @@ -1,5 +1,5 @@ import { readFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import type { PluginConfig } from '@code-pushup/models'; export const dummyPluginSlug = 'dummy-plugin'; @@ -32,7 +32,7 @@ export function create(): PluginConfig { description: 'A dummy plugin to test the cli.', runner: async () => { const itemCount = JSON.parse( - await readFile(join('src', 'items.json'), 'utf-8'), + await readFile(path.join('src', 'items.json'), 'utf-8'), ).length; return [ { diff --git a/e2e/cli-e2e/tests/collect.e2e.test.ts b/e2e/cli-e2e/tests/collect.e2e.test.ts index 707ae96bc..4a0f9d9fb 100644 --- a/e2e/cli-e2e/tests/collect.e2e.test.ts +++ b/e2e/cli-e2e/tests/collect.e2e.test.ts @@ -1,5 +1,5 @@ import { cp } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { afterEach, beforeAll, describe, expect, it } from 'vitest'; import { nxTargetProject } from '@code-pushup/test-nx-utils'; import { teardownTestFolder } from '@code-pushup/test-setup'; @@ -9,21 +9,21 @@ import { executeProcess, readTextFile } from '@code-pushup/utils'; describe('CLI collect', () => { const dummyPluginTitle = 'Dummy Plugin'; const dummyAuditTitle = 'Dummy Audit'; - const fixtureDummyDir = join( + const fixtureDummyDir = path.join( 'e2e', nxTargetProject(), 'mocks', 'fixtures', 'dummy-setup', ); - const testFileDir = join( + const testFileDir = path.join( E2E_ENVIRONMENTS_DIR, nxTargetProject(), TEST_OUTPUT_DIR, 'collect', ); - const dummyDir = join(testFileDir, 'dummy-setup'); - const dummyOutputDir = join(dummyDir, '.code-pushup'); + const dummyDir = path.join(testFileDir, 'dummy-setup'); + const dummyOutputDir = path.join(dummyDir, '.code-pushup'); beforeAll(async () => { await cp(fixtureDummyDir, dummyDir, { recursive: true }); @@ -52,7 +52,7 @@ describe('CLI collect', () => { expect(code).toBe(0); expect(stderr).toBe(''); - const md = await readTextFile(join(dummyOutputDir, 'report.md')); + const md = await readTextFile(path.join(dummyOutputDir, 'report.md')); expect(md).toContain('# Code PushUp Report'); expect(md).toContain(dummyPluginTitle); diff --git a/e2e/cli-e2e/tests/compare.e2e.test.ts b/e2e/cli-e2e/tests/compare.e2e.test.ts index 73d08b6b2..0d1140ebc 100644 --- a/e2e/cli-e2e/tests/compare.e2e.test.ts +++ b/e2e/cli-e2e/tests/compare.e2e.test.ts @@ -1,5 +1,5 @@ import { cp } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { beforeAll } from 'vitest'; import type { ReportsDiff } from '@code-pushup/models'; import { nxTargetProject } from '@code-pushup/test-nx-utils'; @@ -8,7 +8,7 @@ import { E2E_ENVIRONMENTS_DIR, TEST_OUTPUT_DIR } from '@code-pushup/test-utils'; import { executeProcess, readJsonFile, readTextFile } from '@code-pushup/utils'; describe('CLI compare', () => { - const fixtureDummyDir = join( + const fixtureDummyDir = path.join( 'e2e', nxTargetProject(), 'mocks', @@ -16,14 +16,14 @@ describe('CLI compare', () => { 'existing-reports', ); - const testFileDir = join( + const testFileDir = path.join( E2E_ENVIRONMENTS_DIR, nxTargetProject(), TEST_OUTPUT_DIR, 'compare', ); - const existingDir = join(testFileDir, 'existing-reports'); - const existingOutputDir = join(existingDir, '.code-pushup'); + const existingDir = path.join(testFileDir, 'existing-reports'); + const existingOutputDir = path.join(existingDir, '.code-pushup'); beforeAll(async () => { await cp(fixtureDummyDir, existingDir, { recursive: true }); @@ -39,14 +39,14 @@ describe('CLI compare', () => { args: [ '@code-pushup/cli', 'compare', - `--before=${join('.code-pushup', 'source-report.json')}`, - `--after=${join('.code-pushup', 'target-report.json')}`, + `--before=${path.join('.code-pushup', 'source-report.json')}`, + `--after=${path.join('.code-pushup', 'target-report.json')}`, ], cwd: existingDir, }); const reportsDiff = await readJsonFile( - join(existingOutputDir, 'report-diff.json'), + path.join(existingOutputDir, 'report-diff.json'), ); expect(reportsDiff).toMatchSnapshot({ commits: expect.any(Object), @@ -56,7 +56,7 @@ describe('CLI compare', () => { }); const reportsDiffMd = await readTextFile( - join(existingOutputDir, 'report-diff.md'), + path.join(existingOutputDir, 'report-diff.md'), ); // commits are variable, replace SHAs with placeholders const sanitizedMd = reportsDiffMd.replace(/[\da-f]{40}/g, '``'); diff --git a/e2e/cli-e2e/tests/help.e2e.test.ts b/e2e/cli-e2e/tests/help.e2e.test.ts index ec2390c98..63533b51c 100644 --- a/e2e/cli-e2e/tests/help.e2e.test.ts +++ b/e2e/cli-e2e/tests/help.e2e.test.ts @@ -1,4 +1,4 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { nxTargetProject } from '@code-pushup/test-nx-utils'; import { E2E_ENVIRONMENTS_DIR, @@ -7,7 +7,7 @@ import { import { executeProcess } from '@code-pushup/utils'; describe('CLI help', () => { - const envRoot = join(E2E_ENVIRONMENTS_DIR, nxTargetProject()); + const envRoot = path.join(E2E_ENVIRONMENTS_DIR, nxTargetProject()); it('should print help with help command', async () => { const { code, stdout, stderr } = await executeProcess({ diff --git a/e2e/cli-e2e/tests/print-config.e2e.test.ts b/e2e/cli-e2e/tests/print-config.e2e.test.ts index 7f8a06ae1..e29230721 100644 --- a/e2e/cli-e2e/tests/print-config.e2e.test.ts +++ b/e2e/cli-e2e/tests/print-config.e2e.test.ts @@ -1,5 +1,5 @@ import { cp } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { beforeAll, expect } from 'vitest'; import { nxTargetProject } from '@code-pushup/test-nx-utils'; import { teardownTestFolder } from '@code-pushup/test-setup'; @@ -8,7 +8,7 @@ import { executeProcess } from '@code-pushup/utils'; describe('CLI print-config', () => { const extensions = ['js', 'mjs', 'ts'] as const; - const fixtureDummyDir = join( + const fixtureDummyDir = path.join( 'e2e', nxTargetProject(), 'mocks', @@ -16,15 +16,15 @@ describe('CLI print-config', () => { 'dummy-setup', ); - const testFileDir = join( + const testFileDir = path.join( E2E_ENVIRONMENTS_DIR, nxTargetProject(), TEST_OUTPUT_DIR, 'print-config', ); - const testFileDummySetup = join(testFileDir, 'dummy-setup'); + const testFileDummySetup = path.join(testFileDir, 'dummy-setup'); const configFilePath = (ext: (typeof extensions)[number]) => - join(process.cwd(), testFileDummySetup, `code-pushup.config.${ext}`); + path.join(process.cwd(), testFileDummySetup, `code-pushup.config.${ext}`); beforeAll(async () => { await cp(fixtureDummyDir, testFileDummySetup, { recursive: true }); diff --git a/e2e/cli-e2e/vite.config.e2e.ts b/e2e/cli-e2e/vite.config.e2e.ts index 2514c0209..bf0ff7b5c 100644 --- a/e2e/cli-e2e/vite.config.e2e.ts +++ b/e2e/cli-e2e/vite.config.e2e.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/cli-e2e', diff --git a/e2e/create-cli-e2e/.eslintrc.json b/e2e/create-cli-e2e/.eslintrc.json deleted file mode 100644 index 8cc915b39..000000000 --- a/e2e/create-cli-e2e/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "code-pushup.config*.ts"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["e2e/create-cli-e2e/tsconfig.*?.json"] - } - } - ] -} diff --git a/e2e/create-cli-e2e/eslint.config.js b/e2e/create-cli-e2e/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/e2e/create-cli-e2e/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/e2e/create-cli-e2e/project.json b/e2e/create-cli-e2e/project.json index ecb0d138f..aa2fb00ae 100644 --- a/e2e/create-cli-e2e/project.json +++ b/e2e/create-cli-e2e/project.json @@ -14,6 +14,7 @@ "e2e": { "executor": "@nx/vite:test", "options": { + "keepServerRunning": true, "configFile": "e2e/create-cli-e2e/vite.config.e2e.ts" } } diff --git a/e2e/create-cli-e2e/tests/init.e2e.test.ts b/e2e/create-cli-e2e/tests/init.e2e.test.ts index 9077d9b49..c926e0c7b 100644 --- a/e2e/create-cli-e2e/tests/init.e2e.test.ts +++ b/e2e/create-cli-e2e/tests/init.e2e.test.ts @@ -1,4 +1,4 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { afterEach, expect } from 'vitest'; import { nxTargetProject } from '@code-pushup/test-nx-utils'; import { teardownTestFolder } from '@code-pushup/test-setup'; @@ -10,20 +10,28 @@ import { } from '@code-pushup/test-utils'; import { executeProcess, readJsonFile, readTextFile } from '@code-pushup/utils'; -describe('create-cli-inti', () => { - const workspaceRoot = join(E2E_ENVIRONMENTS_DIR, nxTargetProject()); - const testFileDir = join(workspaceRoot, TEST_OUTPUT_DIR, 'init'); +const fakeCacheFolderName = () => + `fake-cache-${new Date().toISOString().replace(/[:.]/g, '-')}`; + +describe('create-cli-init', () => { + const workspaceRoot = path.join(E2E_ENVIRONMENTS_DIR, nxTargetProject()); + const testFileDir = path.join(workspaceRoot, TEST_OUTPUT_DIR, 'init'); afterEach(async () => { await teardownTestFolder(testFileDir); }); it('should execute package correctly over npm exec', async () => { - const cwd = join(testFileDir, 'npm-exec'); + const cwd = path.join(testFileDir, 'npm-exec'); await createNpmWorkspace(cwd); const { code, stdout } = await executeProcess({ command: 'npm', - args: ['exec', '@code-pushup/create-cli'], + args: [ + 'exec', + '--yes', + `--cache=${fakeCacheFolderName()}`, + '@code-pushup/create-cli', + ], cwd, }); @@ -34,7 +42,7 @@ describe('create-cli-inti', () => { ); await expect( - readJsonFile(join(cwd, 'package.json')), + readJsonFile(path.join(cwd, 'package.json')), ).resolves.toStrictEqual( expect.objectContaining({ devDependencies: { @@ -46,19 +54,24 @@ describe('create-cli-inti', () => { }), ); await expect( - readTextFile(join(cwd, 'code-pushup.config.ts')), + readTextFile(path.join(cwd, 'code-pushup.config.ts')), ).resolves.toContain( "import type { CoreConfig } from '@code-pushup/models';", ); }); it('should execute package correctly over npm init', async () => { - const cwd = join(testFileDir, 'npm-init-setup'); + const cwd = path.join(testFileDir, 'npm-init-setup'); await createNpmWorkspace(cwd); const { code, stdout } = await executeProcess({ command: 'npm', - args: ['init', '@code-pushup/cli'], + args: [ + 'init', + '--yes', + `--cache=${fakeCacheFolderName()}`, + '@code-pushup/cli', + ], cwd, }); @@ -69,7 +82,7 @@ describe('create-cli-inti', () => { ); await expect( - readJsonFile(join(cwd, 'package.json')), + readJsonFile(path.join(cwd, 'package.json')), ).resolves.toStrictEqual( expect.objectContaining({ devDependencies: { @@ -81,19 +94,24 @@ describe('create-cli-inti', () => { }), ); await expect( - readTextFile(join(cwd, 'code-pushup.config.ts')), + readTextFile(path.join(cwd, 'code-pushup.config.ts')), ).resolves.toContain( "import type { CoreConfig } from '@code-pushup/models';", ); }); - it('should produce an executable setup when running npm init', async () => { - const cwd = join(testFileDir, 'npm-init-executable'); + it('should produce an executable setup when running npm exec', async () => { + const cwd = path.join(testFileDir, 'npm-executable'); await createNpmWorkspace(cwd); await executeProcess({ command: 'npm', - args: ['init', '@code-pushup/cli'], + args: [ + 'exec', + '--yes', + `--cache=${fakeCacheFolderName()}`, + '@code-pushup/create-cli', + ], cwd, }); diff --git a/e2e/create-cli-e2e/vite.config.e2e.ts b/e2e/create-cli-e2e/vite.config.e2e.ts index 6d47f697d..8df1f0c24 100644 --- a/e2e/create-cli-e2e/vite.config.e2e.ts +++ b/e2e/create-cli-e2e/vite.config.e2e.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/create-cli-e2e', diff --git a/e2e/nx-plugin-e2e/.eslintrc.json b/e2e/nx-plugin-e2e/.eslintrc.json deleted file mode 100644 index 0889e94c9..000000000 --- a/e2e/nx-plugin-e2e/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "code-pushup.config*.ts"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["e2e/nx-plugin-e2e/tsconfig.*?.json"] - } - } - ] -} diff --git a/e2e/nx-plugin-e2e/eslint.config.js b/e2e/nx-plugin-e2e/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/e2e/nx-plugin-e2e/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/e2e/nx-plugin-e2e/tests/__snapshots__/plugin-create-nodes.e2e.test.ts.snap b/e2e/nx-plugin-e2e/tests/__snapshots__/plugin-create-nodes.e2e.test.ts.snap index d1599c84c..66639fa2d 100644 --- a/e2e/nx-plugin-e2e/tests/__snapshots__/plugin-create-nodes.e2e.test.ts.snap +++ b/e2e/nx-plugin-e2e/tests/__snapshots__/plugin-create-nodes.e2e.test.ts.snap @@ -6,6 +6,7 @@ exports[`nx-plugin > should NOT add config targets dynamically if the project is "configurations": {}, "executor": "@code-pushup/nx-plugin:cli", "options": {}, + "parallelism": true, }, } `; @@ -18,6 +19,7 @@ exports[`nx-plugin > should add configuration target dynamically 1`] = ` "options": { "command": "nx g @code-pushup/nx-plugin:configuration --skipTarget --targetName="code-pushup" --project="my-lib"", }, + "parallelism": true, }, } `; @@ -28,6 +30,7 @@ exports[`nx-plugin > should add executor target dynamically if the project is co "configurations": {}, "executor": "@code-pushup/nx-plugin:cli", "options": {}, + "parallelism": true, }, } `; diff --git a/e2e/nx-plugin-e2e/tests/executor-cli.e2e.test.ts b/e2e/nx-plugin-e2e/tests/executor-cli.e2e.test.ts index dadac76ac..369c0852f 100644 --- a/e2e/nx-plugin-e2e/tests/executor-cli.e2e.test.ts +++ b/e2e/nx-plugin-e2e/tests/executor-cli.e2e.test.ts @@ -1,5 +1,5 @@ import { type Tree, updateProjectConfiguration } from '@nx/devkit'; -import { join, relative } from 'node:path'; +import path from 'node:path'; import { readProjectConfiguration } from 'nx/src/generators/utils/project-configuration'; import { afterEach, expect } from 'vitest'; import { generateCodePushupConfig } from '@code-pushup/nx-plugin'; @@ -12,45 +12,32 @@ import { teardownTestFolder } from '@code-pushup/test-setup'; import { E2E_ENVIRONMENTS_DIR, TEST_OUTPUT_DIR, - osAgnosticPath, removeColorCodes, } from '@code-pushup/test-utils'; import { executeProcess, readJsonFile } from '@code-pushup/utils'; - -function relativePathToCwd(testDir: string): string { - return relative(join(process.cwd(), testDir), process.cwd()); -} +import { INLINE_PLUGIN } from './inline-plugin.js'; async function addTargetToWorkspace( tree: Tree, options: { cwd: string; project: string }, ) { const { cwd, project } = options; - const pathRelativeToPackage = relative(join(cwd, 'libs', project), cwd); const projectCfg = readProjectConfiguration(tree, project); updateProjectConfiguration(tree, project, { ...projectCfg, targets: { ...projectCfg.targets, - ['code-pushup']: { + 'code-pushup': { executor: '@code-pushup/nx-plugin:cli', }, }, }); const { root } = projectCfg; generateCodePushupConfig(tree, root, { - fileImports: `import type {CoreConfig} from "@code-pushup/models";`, plugins: [ { - // @TODO replace with inline plugin - fileImports: `import {customPlugin} from "${osAgnosticPath( - join( - relativePathToCwd(cwd), - pathRelativeToPackage, - 'dist/testing/test-utils', - ), - )}";`, - codeStrings: 'customPlugin()', + fileImports: '', + codeStrings: INLINE_PLUGIN, }, ], }); @@ -60,7 +47,7 @@ async function addTargetToWorkspace( describe('executor command', () => { let tree: Tree; const project = 'my-lib'; - const testFileDir = join( + const testFileDir = path.join( E2E_ENVIRONMENTS_DIR, nxTargetProject(), TEST_OUTPUT_DIR, @@ -76,7 +63,7 @@ describe('executor command', () => { }); it('should execute no specific command by default', async () => { - const cwd = join(testFileDir, 'execute-default-command'); + const cwd = path.join(testFileDir, 'execute-default-command'); await addTargetToWorkspace(tree, { cwd, project }); const { stdout, code } = await executeProcess({ command: 'npx', @@ -90,7 +77,7 @@ describe('executor command', () => { }); it('should execute print-config executor', async () => { - const cwd = join(testFileDir, 'execute-print-config-command'); + const cwd = path.join(testFileDir, 'execute-print-config-command'); await addTargetToWorkspace(tree, { cwd, project }); const { stdout, code } = await executeProcess({ @@ -104,12 +91,12 @@ describe('executor command', () => { expect(cleanStdout).toContain('nx run my-lib:code-pushup print-config'); await expect(() => - readJsonFile(join(cwd, '.code-pushup', project, 'report.json')), + readJsonFile(path.join(cwd, '.code-pushup', project, 'report.json')), ).rejects.toThrow(''); }); it('should execute collect executor and add report to sub folder named by project', async () => { - const cwd = join(testFileDir, 'execute-collect-command'); + const cwd = path.join(testFileDir, 'execute-collect-command'); await addTargetToWorkspace(tree, { cwd, project }); const { stdout, code } = await executeProcess({ @@ -123,7 +110,7 @@ describe('executor command', () => { expect(cleanStdout).toContain('nx run my-lib:code-pushup collect'); const report = await readJsonFile( - join(cwd, '.code-pushup', project, 'report.json'), + path.join(cwd, '.code-pushup', project, 'report.json'), ); expect(report).toStrictEqual( expect.objectContaining({ diff --git a/e2e/nx-plugin-e2e/tests/generator-configuration.e2e.test.ts b/e2e/nx-plugin-e2e/tests/generator-configuration.e2e.test.ts index 4ad65594f..6237a9212 100644 --- a/e2e/nx-plugin-e2e/tests/generator-configuration.e2e.test.ts +++ b/e2e/nx-plugin-e2e/tests/generator-configuration.e2e.test.ts @@ -1,6 +1,6 @@ import type { Tree } from '@nx/devkit'; import { readFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { afterEach, expect } from 'vitest'; import { generateCodePushupConfig } from '@code-pushup/nx-plugin'; import { @@ -19,8 +19,8 @@ import { executeProcess } from '@code-pushup/utils'; describe('nx-plugin g configuration', () => { let tree: Tree; const project = 'my-lib'; - const projectRoot = join('libs', project); - const testFileDir = join( + const projectRoot = path.join('libs', project); + const testFileDir = path.join( E2E_ENVIRONMENTS_DIR, nxTargetProject(), TEST_OUTPUT_DIR, @@ -36,7 +36,7 @@ describe('nx-plugin g configuration', () => { }); it('should generate code-pushup.config.ts file and add target to project.json', async () => { - const cwd = join(testFileDir, 'configure'); + const cwd = path.join(testFileDir, 'configure'); await materializeTree(tree, cwd); const { code, stdout, stderr } = await executeProcess({ @@ -67,7 +67,7 @@ describe('nx-plugin g configuration', () => { expect(cleanedStdout).toMatch(/^UPDATE.*project.json/m); const projectJson = await readFile( - join(cwd, 'libs', project, 'project.json'), + path.join(cwd, 'libs', project, 'project.json'), 'utf8', ); @@ -81,12 +81,15 @@ describe('nx-plugin g configuration', () => { }), ); await expect( - readFile(join(cwd, 'libs', project, 'code-pushup.config.ts'), 'utf8'), + readFile( + path.join(cwd, 'libs', project, 'code-pushup.config.ts'), + 'utf8', + ), ).resolves.not.toThrow(); }); it('should NOT create a code-pushup.config.ts file if one already exists', async () => { - const cwd = join(testFileDir, 'configure-config-existing'); + const cwd = path.join(testFileDir, 'configure-config-existing'); generateCodePushupConfig(tree, projectRoot); await materializeTree(tree, cwd); @@ -111,7 +114,7 @@ describe('nx-plugin g configuration', () => { expect(cleanedStdout).toMatch(/^UPDATE.*project.json/m); const projectJson = await readFile( - join(cwd, 'libs', project, 'project.json'), + path.join(cwd, 'libs', project, 'project.json'), 'utf8', ); expect(JSON.parse(projectJson)).toStrictEqual( @@ -126,7 +129,7 @@ describe('nx-plugin g configuration', () => { }); it('should NOT create a code-pushup.config.ts file if skipConfig is given', async () => { - const cwd = join(testFileDir, 'configure-skip-config'); + const cwd = path.join(testFileDir, 'configure-skip-config'); await materializeTree(tree, cwd); const { code, stdout } = await executeProcess({ @@ -152,7 +155,7 @@ describe('nx-plugin g configuration', () => { expect(cleanedStdout).toMatch(/^UPDATE.*project.json/m); const projectJson = await readFile( - join(cwd, 'libs', project, 'project.json'), + path.join(cwd, 'libs', project, 'project.json'), 'utf8', ); expect(JSON.parse(projectJson)).toStrictEqual( @@ -166,12 +169,15 @@ describe('nx-plugin g configuration', () => { ); await expect( - readFile(join(cwd, 'libs', project, 'code-pushup.config.ts'), 'utf8'), + readFile( + path.join(cwd, 'libs', project, 'code-pushup.config.ts'), + 'utf8', + ), ).rejects.toThrow('no such file or directory'); }); it('should NOT add target to project.json if skipTarget is given', async () => { - const cwd = join(testFileDir, 'configure-skip-target'); + const cwd = path.join(testFileDir, 'configure-skip-target'); await materializeTree(tree, cwd); const { code, stdout } = await executeProcess({ @@ -196,7 +202,7 @@ describe('nx-plugin g configuration', () => { expect(cleanedStdout).not.toMatch(/^UPDATE.*project.json/m); const projectJson = await readFile( - join(cwd, 'libs', project, 'project.json'), + path.join(cwd, 'libs', project, 'project.json'), 'utf8', ); expect(JSON.parse(projectJson)).toStrictEqual( @@ -210,12 +216,15 @@ describe('nx-plugin g configuration', () => { ); await expect( - readFile(join(cwd, 'libs', project, 'code-pushup.config.ts'), 'utf8'), + readFile( + path.join(cwd, 'libs', project, 'code-pushup.config.ts'), + 'utf8', + ), ).resolves.toStrictEqual(expect.any(String)); }); it('should inform about dry run', async () => { - const cwd = join(testFileDir, 'configure'); + const cwd = path.join(testFileDir, 'configure'); await materializeTree(tree, cwd); const { stderr } = await executeProcess({ diff --git a/e2e/nx-plugin-e2e/tests/generator-init.e2e.test.ts b/e2e/nx-plugin-e2e/tests/generator-init.e2e.test.ts index 4070fd4d5..c3ea4c895 100644 --- a/e2e/nx-plugin-e2e/tests/generator-init.e2e.test.ts +++ b/e2e/nx-plugin-e2e/tests/generator-init.e2e.test.ts @@ -1,6 +1,6 @@ import type { Tree } from '@nx/devkit'; import { readFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { afterEach, expect } from 'vitest'; import { generateWorkspaceAndProject, @@ -18,7 +18,7 @@ import { executeProcess } from '@code-pushup/utils'; describe('nx-plugin g init', () => { let tree: Tree; const project = 'my-lib'; - const testFileDir = join( + const testFileDir = path.join( E2E_ENVIRONMENTS_DIR, nxTargetProject(), TEST_OUTPUT_DIR, @@ -34,7 +34,7 @@ describe('nx-plugin g init', () => { }); it('should inform about dry run when used on init generator', async () => { - const cwd = join(testFileDir, 'dry-run'); + const cwd = path.join(testFileDir, 'dry-run'); await materializeTree(tree, cwd); const { stderr } = await executeProcess({ @@ -50,7 +50,7 @@ describe('nx-plugin g init', () => { }); it('should update packages.json and configure nx.json', async () => { - const cwd = join(testFileDir, 'nx-update'); + const cwd = path.join(testFileDir, 'nx-update'); await materializeTree(tree, cwd); const { code, stdout } = await executeProcess({ @@ -73,8 +73,8 @@ describe('nx-plugin g init', () => { expect(cleanedStdout).toMatch(/^UPDATE package.json/m); expect(cleanedStdout).toMatch(/^UPDATE nx.json/m); - const packageJson = await readFile(join(cwd, 'package.json'), 'utf8'); - const nxJson = await readFile(join(cwd, 'nx.json'), 'utf8'); + const packageJson = await readFile(path.join(cwd, 'package.json'), 'utf8'); + const nxJson = await readFile(path.join(cwd, 'nx.json'), 'utf8'); expect(JSON.parse(packageJson)).toStrictEqual( expect.objectContaining({ @@ -99,7 +99,7 @@ describe('nx-plugin g init', () => { }); it('should skip packages.json update if --skipPackageJson is given', async () => { - const cwd = join(testFileDir, 'skip-packages'); + const cwd = path.join(testFileDir, 'skip-packages'); await materializeTree(tree, cwd); const { code, stdout } = await executeProcess({ @@ -123,8 +123,8 @@ describe('nx-plugin g init', () => { expect(cleanedStdout).not.toMatch(/^UPDATE package.json/m); expect(cleanedStdout).toMatch(/^UPDATE nx.json/m); - const packageJson = await readFile(join(cwd, 'package.json'), 'utf8'); - const nxJson = await readFile(join(cwd, 'nx.json'), 'utf8'); + const packageJson = await readFile(path.join(cwd, 'package.json'), 'utf8'); + const nxJson = await readFile(path.join(cwd, 'nx.json'), 'utf8'); expect(JSON.parse(packageJson)).toStrictEqual( expect.objectContaining({ diff --git a/e2e/nx-plugin-e2e/tests/inline-plugin.ts b/e2e/nx-plugin-e2e/tests/inline-plugin.ts new file mode 100644 index 000000000..ac0b08b12 --- /dev/null +++ b/e2e/nx-plugin-e2e/tests/inline-plugin.ts @@ -0,0 +1,21 @@ +export const INLINE_PLUGIN = ` + { + slug: 'good-feels', + title: 'Good feels', + icon: 'javascript', + audits: [ + { + slug: 'always-perfect', + title: 'Always perfect', + }, + ], + runner: () => [ + { + slug: 'always-perfect', + score: 1, + value: 100, + displayValue: '✅ Perfect! 👌', + }, + ], + } +`; diff --git a/e2e/nx-plugin-e2e/tests/plugin-create-nodes.e2e.test.ts b/e2e/nx-plugin-e2e/tests/plugin-create-nodes.e2e.test.ts index 163ba1a11..9ded9aab0 100644 --- a/e2e/nx-plugin-e2e/tests/plugin-create-nodes.e2e.test.ts +++ b/e2e/nx-plugin-e2e/tests/plugin-create-nodes.e2e.test.ts @@ -1,5 +1,5 @@ import type { Tree } from '@nx/devkit'; -import { join, relative } from 'node:path'; +import path from 'node:path'; import { readProjectConfiguration } from 'nx/src/generators/utils/project-configuration'; import { afterEach, expect } from 'vitest'; import { generateCodePushupConfig } from '@code-pushup/nx-plugin'; @@ -17,12 +17,13 @@ import { removeColorCodes, } from '@code-pushup/test-utils'; import { executeProcess, readTextFile } from '@code-pushup/utils'; +import { INLINE_PLUGIN } from './inline-plugin.js'; describe('nx-plugin', () => { let tree: Tree; const project = 'my-lib'; - const projectRoot = join('libs', project); - const testFileDir = join( + const projectRoot = path.join('libs', project); + const testFileDir = path.join( E2E_ENVIRONMENTS_DIR, nxTargetProject(), TEST_OUTPUT_DIR, @@ -38,20 +39,21 @@ describe('nx-plugin', () => { }); it('should add configuration target dynamically', async () => { - const cwd = join(testFileDir, 'add-configuration-dynamically'); + const cwd = path.join(testFileDir, 'add-configuration-dynamically'); registerPluginInWorkspace(tree, '@code-pushup/nx-plugin'); await materializeTree(tree, cwd); const { code, projectJson } = await nxShowProjectJson(cwd, project); expect(code).toBe(0); - expect(projectJson.targets).toStrictEqual({ - ['code-pushup--configuration']: { + expect(projectJson.targets).toEqual({ + 'code-pushup--configuration': { configurations: {}, executor: 'nx:run-commands', options: { command: `nx g @code-pushup/nx-plugin:configuration --skipTarget --targetName="code-pushup" --project="${project}"`, }, + parallelism: true, }, }); @@ -59,7 +61,7 @@ describe('nx-plugin', () => { }); it('should execute dynamic configuration target', async () => { - const cwd = join(testFileDir, 'execute-dynamic-configuration'); + const cwd = path.join(testFileDir, 'execute-dynamic-configuration'); registerPluginInWorkspace(tree, { plugin: '@code-pushup/nx-plugin', }); @@ -75,15 +77,15 @@ describe('nx-plugin', () => { const cleanStdout = removeColorCodes(stdout); expect(cleanStdout).toContain( - `> NX Successfully ran target code-pushup--configuration for project ${project}`, + `Successfully ran target code-pushup--configuration for project ${project}`, ); await expect( - readTextFile(join(cwd, projectRoot, 'code-pushup.config.ts')), + readTextFile(path.join(cwd, projectRoot, 'code-pushup.config.ts')), ).resolves.toMatchSnapshot(); }); it('should consider plugin option targetName in configuration target', async () => { - const cwd = join(testFileDir, 'configuration-option-target-name'); + const cwd = path.join(testFileDir, 'configuration-option-target-name'); registerPluginInWorkspace(tree, { plugin: '@code-pushup/nx-plugin', options: { @@ -97,12 +99,12 @@ describe('nx-plugin', () => { expect(code).toBe(0); expect(projectJson.targets).toStrictEqual({ - ['cp--configuration']: expect.any(Object), + 'cp--configuration': expect.any(Object), }); }); it('should consider plugin option bin in configuration target', async () => { - const cwd = join(testFileDir, 'configuration-option-bin'); + const cwd = path.join(testFileDir, 'configuration-option-bin'); registerPluginInWorkspace(tree, { plugin: '@code-pushup/nx-plugin', options: { @@ -116,7 +118,7 @@ describe('nx-plugin', () => { expect(code).toBe(0); expect(projectJson.targets).toStrictEqual({ - ['code-pushup--configuration']: expect.objectContaining({ + 'code-pushup--configuration': expect.objectContaining({ options: { command: `nx g XYZ:configuration --skipTarget --targetName="code-pushup" --project="${project}"`, }, @@ -125,7 +127,7 @@ describe('nx-plugin', () => { }); it('should NOT add config targets dynamically if the project is configured', async () => { - const cwd = join(testFileDir, 'configuration-already-configured'); + const cwd = path.join(testFileDir, 'configuration-already-configured'); registerPluginInWorkspace(tree, '@code-pushup/nx-plugin'); const { root } = readProjectConfiguration(tree, project); generateCodePushupConfig(tree, root); @@ -137,14 +139,14 @@ describe('nx-plugin', () => { expect(projectJson.targets).toStrictEqual( expect.not.objectContaining({ - ['code-pushup--configuration']: expect.any(Object), + 'code-pushup--configuration': expect.any(Object), }), ); expect(projectJson.targets).toMatchSnapshot(); }); it('should add executor target dynamically if the project is configured', async () => { - const cwd = join(testFileDir, 'add-executor-dynamically'); + const cwd = path.join(testFileDir, 'add-executor-dynamically'); registerPluginInWorkspace(tree, '@code-pushup/nx-plugin'); const { root } = readProjectConfiguration(tree, project); generateCodePushupConfig(tree, root); @@ -154,10 +156,11 @@ describe('nx-plugin', () => { expect(code).toBe(0); expect(projectJson.targets).toStrictEqual({ - ['code-pushup']: { + 'code-pushup': { configurations: {}, executor: `@code-pushup/nx-plugin:cli`, options: {}, + parallelism: true, }, }); @@ -165,29 +168,22 @@ describe('nx-plugin', () => { }); it('should execute dynamic executor target', async () => { - const cwd = join(testFileDir, 'execute-dynamic-executor'); - const pathRelativeToPackage = relative(join(cwd, 'libs', project), cwd); + const cwd = path.join(testFileDir, 'execute-dynamic-executor'); registerPluginInWorkspace(tree, { plugin: '@code-pushup/nx-plugin', }); const { root } = readProjectConfiguration(tree, project); generateCodePushupConfig(tree, root, { - fileImports: `import type {CoreConfig} from "@code-pushup/models";`, plugins: [ { - // @TODO replace with inline plugin - fileImports: `import {customPlugin} from "${join( - relative(join(process.cwd(), cwd), process.cwd()), - pathRelativeToPackage, - 'dist/testing/test-utils', - )}";`, - codeStrings: 'customPlugin()', + fileImports: '', + codeStrings: INLINE_PLUGIN, }, ], upload: { - server: 'http://staging.code-pushup.dev', + server: 'https://api.staging.code-pushup.dev/graphql', organization: 'code-pushup', - apiKey: '12345678', + apiKey: 'cp_12345678', }, }); @@ -210,7 +206,7 @@ describe('nx-plugin', () => { }); it('should consider plugin option bin in executor target', async () => { - const cwd = join(testFileDir, 'configuration-option-bin'); + const cwd = path.join(testFileDir, 'configuration-option-bin'); registerPluginInWorkspace(tree, { plugin: '@code-pushup/nx-plugin', options: { @@ -226,14 +222,14 @@ describe('nx-plugin', () => { expect(code).toBe(0); expect(projectJson.targets).toStrictEqual({ - ['code-pushup']: expect.objectContaining({ + 'code-pushup': expect.objectContaining({ executor: 'XYZ:cli', }), }); }); it('should consider plugin option projectPrefix in executor target', async () => { - const cwd = join(testFileDir, 'configuration-option-bin'); + const cwd = path.join(testFileDir, 'configuration-option-bin'); registerPluginInWorkspace(tree, { plugin: '@code-pushup/nx-plugin', options: { @@ -249,7 +245,7 @@ describe('nx-plugin', () => { expect(code).toBe(0); expect(projectJson.targets).toStrictEqual({ - ['code-pushup']: expect.objectContaining({ + 'code-pushup': expect.objectContaining({ executor: `@code-pushup/nx-plugin:cli`, options: { projectPrefix: 'cli', @@ -259,7 +255,7 @@ describe('nx-plugin', () => { }); it('should NOT add targets dynamically if plugin is not registered', async () => { - const cwd = join(testFileDir, 'plugin-not-registered'); + const cwd = path.join(testFileDir, 'plugin-not-registered'); await materializeTree(tree, cwd); const { code, projectJson } = await nxShowProjectJson(cwd, project); diff --git a/e2e/nx-plugin-e2e/vite.config.e2e.ts b/e2e/nx-plugin-e2e/vite.config.e2e.ts index abdc3d2e2..c333587b5 100644 --- a/e2e/nx-plugin-e2e/vite.config.e2e.ts +++ b/e2e/nx-plugin-e2e/vite.config.e2e.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/nx-plugin-e2e', diff --git a/e2e/nx-plugin-nx18-e2e/tests/plugin-create-nodes.e2e.test.ts b/e2e/nx-plugin-nx18-e2e/tests/plugin-create-nodes.e2e.test.ts index 378dba362..c5c74629f 100644 --- a/e2e/nx-plugin-nx18-e2e/tests/plugin-create-nodes.e2e.test.ts +++ b/e2e/nx-plugin-nx18-e2e/tests/plugin-create-nodes.e2e.test.ts @@ -1,8 +1,11 @@ -import {join} from 'node:path'; -import {afterEach, expect} from 'vitest'; -import {nxShowProjectJson, registerPluginInNxJson,} from '@code-pushup/test-nx-utils'; -import {teardownTestFolder} from '@code-pushup/test-setup'; -import {executeProcess} from '@code-pushup/utils'; +import { join } from 'node:path'; +import { afterEach, expect } from 'vitest'; +import { + nxShowProjectJson, + registerPluginInNxJson, +} from '@code-pushup/test-nx-utils'; +import { teardownTestFolder } from '@code-pushup/test-setup'; +import { executeProcess } from '@code-pushup/utils'; describe('nx-plugin-nx18', () => { const project = 'my-lib'; @@ -24,8 +27,11 @@ describe('nx-plugin-nx18', () => { '--ci=skip', ], cwd: envRoot, - }) - await registerPluginInNxJson(join(envRoot, 'code-pushup.config.ts'), '@code-pushup/nx-plugin'); + }); + await registerPluginInNxJson( + join(envRoot, 'code-pushup.config.ts'), + '@code-pushup/nx-plugin', + ); }); afterEach(async () => { @@ -33,7 +39,6 @@ describe('nx-plugin-nx18', () => { }); it('should add configuration target dynamically in nx18', async () => { - const { code, projectJson } = await nxShowProjectJson(envRoot, project); expect(code).toBe(0); @@ -49,5 +54,4 @@ describe('nx-plugin-nx18', () => { expect(projectJson.targets).toMatchSnapshot(); }); - }, 300000); diff --git a/e2e/plugin-coverage-e2e/.eslintrc.json b/e2e/plugin-coverage-e2e/.eslintrc.json deleted file mode 100644 index 7ef7b6dc8..000000000 --- a/e2e/plugin-coverage-e2e/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "code-pushup.config*.ts"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["e2e/plugin-coverage-e2e/tsconfig.*?.json"] - } - } - ] -} diff --git a/e2e/plugin-coverage-e2e/eslint.config.js b/e2e/plugin-coverage-e2e/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/e2e/plugin-coverage-e2e/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/e2e/plugin-coverage-e2e/mocks/fixtures/existing-report/code-pushup.config.ts b/e2e/plugin-coverage-e2e/mocks/fixtures/existing-report/code-pushup.config.ts index d955bbba0..41c688012 100644 --- a/e2e/plugin-coverage-e2e/mocks/fixtures/existing-report/code-pushup.config.ts +++ b/e2e/plugin-coverage-e2e/mocks/fixtures/existing-report/code-pushup.config.ts @@ -1,11 +1,11 @@ -import { join } from 'node:path'; +import path from 'node:path'; import coveragePlugin from '@code-pushup/coverage-plugin'; import type { CoreConfig } from '@code-pushup/models'; export default { plugins: [ await coveragePlugin({ - reports: [join('coverage', 'lcov.info')], + reports: [path.join('coverage', 'lcov.info')], }), ], categories: [ diff --git a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts index 9dd257adf..09bc75e96 100644 --- a/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts +++ b/e2e/plugin-coverage-e2e/tests/collect.e2e.test.ts @@ -1,5 +1,5 @@ import { cp } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { afterAll, afterEach, beforeAll } from 'vitest'; import { type Report, reportSchema } from '@code-pushup/models'; import { nxTargetProject } from '@code-pushup/test-nx-utils'; @@ -12,23 +12,26 @@ import { import { executeProcess, readJsonFile } from '@code-pushup/utils'; describe('PLUGIN collect report with coverage-plugin NPM package', () => { - const envRoot = join(E2E_ENVIRONMENTS_DIR, nxTargetProject()); - const testFileDir = join(envRoot, TEST_OUTPUT_DIR, 'collect'); + const envRoot = path.join(E2E_ENVIRONMENTS_DIR, nxTargetProject()); + const testFileDir = path.join(envRoot, TEST_OUTPUT_DIR, 'collect'); - const basicDir = join(testFileDir, 'basic-setup'); - const existingDir = join(testFileDir, 'existing-report'); + const basicDir = path.join(testFileDir, 'basic-setup'); + const existingDir = path.join(testFileDir, 'existing-report'); + + const fixtureDir = path.join('e2e', nxTargetProject(), 'mocks', 'fixtures'); - const fixtureDir = join('e2e', nxTargetProject(), 'mocks', 'fixtures'); beforeAll(async () => { await cp(fixtureDir, testFileDir, { recursive: true }); }); + afterAll(async () => { await teardownTestFolder(basicDir); await teardownTestFolder(existingDir); }); + afterEach(async () => { - await teardownTestFolder(join(basicDir, '.code-pushup')); - await teardownTestFolder(join(existingDir, '.code-pushup')); + await teardownTestFolder(path.join(basicDir, '.code-pushup')); + await teardownTestFolder(path.join(existingDir, '.code-pushup')); }); it('should run Code coverage plugin which collects passed results and creates report.json', async () => { @@ -41,7 +44,7 @@ describe('PLUGIN collect report with coverage-plugin NPM package', () => { expect(code).toBe(0); const report = await readJsonFile( - join(basicDir, '.code-pushup', 'report.json'), + path.join(basicDir, '.code-pushup', 'report.json'), ); expect(() => reportSchema.parse(report)).not.toThrow(); @@ -58,7 +61,7 @@ describe('PLUGIN collect report with coverage-plugin NPM package', () => { expect(code).toBe(0); const report = await readJsonFile( - join(existingDir, '.code-pushup', 'report.json'), + path.join(existingDir, '.code-pushup', 'report.json'), ); expect(() => reportSchema.parse(report)).not.toThrow(); diff --git a/e2e/plugin-coverage-e2e/vite.config.e2e.ts b/e2e/plugin-coverage-e2e/vite.config.e2e.ts index 3956da52e..4f715aa2c 100644 --- a/e2e/plugin-coverage-e2e/vite.config.e2e.ts +++ b/e2e/plugin-coverage-e2e/vite.config.e2e.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/plugin-lighthouse-e2e', diff --git a/e2e/plugin-eslint-e2e/.eslintrc.json b/e2e/plugin-eslint-e2e/.eslintrc.json deleted file mode 100644 index 622f1f491..000000000 --- a/e2e/plugin-eslint-e2e/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "code-pushup.config*.ts"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["e2e/plugin-eslint-e2e/tsconfig.*?.json"] - } - } - ] -} diff --git a/e2e/plugin-eslint-e2e/eslint.config.js b/e2e/plugin-eslint-e2e/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/e2e/plugin-eslint-e2e/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/e2e/plugin-eslint-e2e/mocks/fixtures/flat-config/eslint.config.cjs b/e2e/plugin-eslint-e2e/mocks/fixtures/flat-config/eslint.config.cjs index 4bb99249e..cef1161f4 100644 --- a/e2e/plugin-eslint-e2e/mocks/fixtures/flat-config/eslint.config.cjs +++ b/e2e/plugin-eslint-e2e/mocks/fixtures/flat-config/eslint.config.cjs @@ -1,4 +1,4 @@ -/** @type {import('eslint').Linter.FlatConfig[]} */ +/** @type {import('eslint').Linter.Config[]} */ module.exports = [ { ignores: ['code-pushup.config.ts'], diff --git a/e2e/plugin-eslint-e2e/mocks/fixtures/legacy-config/.eslintrc.json b/e2e/plugin-eslint-e2e/mocks/fixtures/legacy-config/.eslintrc.json index 113136c93..f33dfda33 100644 --- a/e2e/plugin-eslint-e2e/mocks/fixtures/legacy-config/.eslintrc.json +++ b/e2e/plugin-eslint-e2e/mocks/fixtures/legacy-config/.eslintrc.json @@ -1,6 +1,6 @@ { "root": true, - "ignorePatterns": ["code-pushup.config.ts"], + "ignorePatterns": ["*.config*"], "overrides": [ { "files": ["*.js"], diff --git a/e2e/plugin-eslint-e2e/tests/collect.e2e.test.ts b/e2e/plugin-eslint-e2e/tests/collect.e2e.test.ts index 8160cf91e..7df4feb45 100644 --- a/e2e/plugin-eslint-e2e/tests/collect.e2e.test.ts +++ b/e2e/plugin-eslint-e2e/tests/collect.e2e.test.ts @@ -1,5 +1,5 @@ import { cp } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest'; import { type Report, reportSchema } from '@code-pushup/models'; import { nxTargetProject } from '@code-pushup/test-nx-utils'; @@ -12,19 +12,24 @@ import { import { executeProcess, readJsonFile } from '@code-pushup/utils'; describe('PLUGIN collect report with eslint-plugin NPM package', () => { - const fixturesDir = join('e2e', 'plugin-eslint-e2e', 'mocks', 'fixtures'); - const fixturesFlatConfigDir = join(fixturesDir, 'flat-config'); - const fixturesLegacyConfigDir = join(fixturesDir, 'legacy-config'); + const fixturesDir = path.join( + 'e2e', + 'plugin-eslint-e2e', + 'mocks', + 'fixtures', + ); + const fixturesFlatConfigDir = path.join(fixturesDir, 'flat-config'); + const fixturesLegacyConfigDir = path.join(fixturesDir, 'legacy-config'); - const envRoot = join( + const envRoot = path.join( E2E_ENVIRONMENTS_DIR, nxTargetProject(), TEST_OUTPUT_DIR, ); - const flatConfigDir = join(envRoot, 'flat-config'); - const legacyConfigDir = join(envRoot, 'legacy-config'); - const flatConfigOutputDir = join(flatConfigDir, '.code-pushup'); - const legacyConfigOutputDir = join(legacyConfigDir, '.code-pushup'); + const flatConfigDir = path.join(envRoot, 'flat-config'); + const legacyConfigDir = path.join(envRoot, 'legacy-config'); + const flatConfigOutputDir = path.join(flatConfigDir, '.code-pushup'); + const legacyConfigOutputDir = path.join(legacyConfigDir, '.code-pushup'); beforeAll(async () => { await cp(fixturesFlatConfigDir, flatConfigDir, { recursive: true }); @@ -51,7 +56,9 @@ describe('PLUGIN collect report with eslint-plugin NPM package', () => { expect(code).toBe(0); expect(stderr).toBe(''); - const report = await readJsonFile(join(flatConfigOutputDir, 'report.json')); + const report = await readJsonFile( + path.join(flatConfigOutputDir, 'report.json'), + ); expect(() => reportSchema.parse(report)).not.toThrow(); expect(omitVariableReportData(report as Report)).toMatchSnapshot(); @@ -69,7 +76,7 @@ describe('PLUGIN collect report with eslint-plugin NPM package', () => { expect(stderr).toBe(''); const report = await readJsonFile( - join(legacyConfigOutputDir, 'report.json'), + path.join(legacyConfigOutputDir, 'report.json'), ); expect(() => reportSchema.parse(report)).not.toThrow(); diff --git a/e2e/plugin-eslint-e2e/vite.config.e2e.ts b/e2e/plugin-eslint-e2e/vite.config.e2e.ts index 3956da52e..4f715aa2c 100644 --- a/e2e/plugin-eslint-e2e/vite.config.e2e.ts +++ b/e2e/plugin-eslint-e2e/vite.config.e2e.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/plugin-lighthouse-e2e', diff --git a/e2e/plugin-lighthouse-e2e/.eslintrc.json b/e2e/plugin-lighthouse-e2e/.eslintrc.json deleted file mode 100644 index 606c55d0f..000000000 --- a/e2e/plugin-lighthouse-e2e/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "code-pushup.config*.ts"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["e2e/plugin-lighthouse-e2e/tsconfig.*?.json"] - } - } - ] -} diff --git a/e2e/plugin-lighthouse-e2e/eslint.config.js b/e2e/plugin-lighthouse-e2e/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/e2e/plugin-lighthouse-e2e/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/e2e/plugin-lighthouse-e2e/tests/collect.e2e.test.ts b/e2e/plugin-lighthouse-e2e/tests/collect.e2e.test.ts index 22f9ecb73..0614fcf22 100644 --- a/e2e/plugin-lighthouse-e2e/tests/collect.e2e.test.ts +++ b/e2e/plugin-lighthouse-e2e/tests/collect.e2e.test.ts @@ -1,5 +1,5 @@ import { cp } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { afterAll, beforeAll, expect } from 'vitest'; import { type Report, reportSchema } from '@code-pushup/models'; import { nxTargetProject } from '@code-pushup/test-nx-utils'; @@ -13,15 +13,16 @@ import { import { executeProcess, readJsonFile } from '@code-pushup/utils'; describe('PLUGIN collect report with lighthouse-plugin NPM package', () => { - const testFileDir = join( + const testFileDir = path.join( E2E_ENVIRONMENTS_DIR, nxTargetProject(), TEST_OUTPUT_DIR, 'collect', ); - const defaultSetupDir = join(testFileDir, 'default-setup'); + const defaultSetupDir = path.join(testFileDir, 'default-setup'); + + const fixturesDir = path.join('e2e', nxTargetProject(), 'mocks/fixtures'); - const fixturesDir = join('e2e', nxTargetProject(), 'mocks/fixtures'); beforeAll(async () => { await cp(fixturesDir, testFileDir, { recursive: true }); }); @@ -43,7 +44,7 @@ describe('PLUGIN collect report with lighthouse-plugin NPM package', () => { expect(cleanStdout).toContain('● Largest Contentful Paint'); const report = await readJsonFile( - join(defaultSetupDir, '.code-pushup', 'report.json'), + path.join(defaultSetupDir, '.code-pushup', 'report.json'), ); expect(() => reportSchema.parse(report)).not.toThrow(); expect( diff --git a/e2e/plugin-lighthouse-e2e/vite.config.e2e.ts b/e2e/plugin-lighthouse-e2e/vite.config.e2e.ts index 3956da52e..4f715aa2c 100644 --- a/e2e/plugin-lighthouse-e2e/vite.config.e2e.ts +++ b/e2e/plugin-lighthouse-e2e/vite.config.e2e.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/plugin-lighthouse-e2e', diff --git a/esbuild.config.js b/esbuild.config.js deleted file mode 100644 index a41c78d51..000000000 --- a/esbuild.config.js +++ /dev/null @@ -1,57 +0,0 @@ -const { exec } = require('node:child_process'); -const { promisify } = require('node:util'); - -const { createProjectGraphAsync } = require('@nx/devkit'); - -const { NX_TASK_TARGET_PROJECT, NX_TASK_TARGET_TARGET } = process.env; -if (!NX_TASK_TARGET_PROJECT) { - throw new Error('Missing NX_TASK_TARGET_PROJECT environment variable'); -} -if (!NX_TASK_TARGET_TARGET) { - throw new Error('Missing NX_TASK_TARGET_TARGET environment variable'); -} - -const getNxProject = async () => { - const graph = await createProjectGraphAsync(); - return graph.nodes[NX_TASK_TARGET_PROJECT]; -}; - -/** - * @param {import('@nx/devkit').ProjectGraphProjectNode} project - * @returns {import('@nx/esbuild/src/executors/esbuild/schema').EsBuildExecutorOptions} - */ -const getESBuildExecutorOptions = project => { - const target = project.data.targets[NX_TASK_TARGET_TARGET]; - if (target.executor !== '@nx/esbuild:esbuild') { - throw new Error( - `Unexpected ${target.executor} executor for ${NX_TASK_TARGET_TARGET} target, expected @nx/esbuild:esbuild`, - ); - } - return target.options; -}; - -/** @type {import('esbuild').BuildOptions} */ -module.exports = { - plugins: [ - { - name: 'TypeScriptDeclarations', - setup(build) { - build.onEnd(async result => { - if (result.errors.length > 0) return; - - const project = await getNxProject(); - const { tsConfig } = getESBuildExecutorOptions(project); - - try { - await promisify(exec)( - `npx tsc --emitDeclarationOnly --project ${tsConfig} --outDir dist`, - ); - } catch (err) { - console.error(err); - throw err; - } - }); - }, - }, - ], -}; diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 000000000..a9bff8986 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,121 @@ +import nxEslintPlugin from '@nx/eslint-plugin'; +import jsoncParser from 'jsonc-eslint-parser'; +import tseslint from 'typescript-eslint'; +import node from '@code-pushup/eslint-config/node.js'; +import typescript from '@code-pushup/eslint-config/typescript.js'; +import vitest from '@code-pushup/eslint-config/vitest.js'; + +export default tseslint.config( + ...typescript, + ...node, + ...vitest, + { + settings: { + 'import/resolver': { typescript: { project: 'tsconfig.base.json' } }, + }, + }, + { plugins: { '@nx': nxEslintPlugin } }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + rules: { + '@nx/enforce-module-boundaries': [ + 'error', + { + enforceBuildableLibDependency: true, + allow: [ + String.raw`^.*/eslint(\.base)?\.config\.[cm]?js$`, + String.raw`^.*/code-pushup\.(config|preset)(\.m?[jt]s)?$`, + '^[./]+/tools/.*$', + ], + depConstraints: [ + { + sourceTag: 'scope:shared', + onlyDependOnLibsWithTags: ['scope:shared'], + }, + { + sourceTag: 'scope:core', + onlyDependOnLibsWithTags: ['scope:core', 'scope:shared'], + }, + { + sourceTag: 'scope:plugin', + onlyDependOnLibsWithTags: ['scope:shared'], + }, + { + sourceTag: 'scope:tooling', + onlyDependOnLibsWithTags: ['scope:tooling', 'scope:shared'], + }, + { + sourceTag: 'type:e2e', + onlyDependOnLibsWithTags: [ + 'type:app', + 'type:feature', + 'type:util', + 'type:testing', + ], + }, + { + sourceTag: 'type:app', + onlyDependOnLibsWithTags: [ + 'type:feature', + 'type:util', + 'type:testing', + ], + }, + { + sourceTag: 'type:feature', + onlyDependOnLibsWithTags: [ + 'type:feature', + 'type:util', + 'type:testing', + ], + }, + { + sourceTag: 'type:util', + onlyDependOnLibsWithTags: ['type:util', 'type:testing'], + }, + { + sourceTag: 'type:testing', + onlyDependOnLibsWithTags: ['type:util', 'type:testing'], + }, + ], + }, + ], + }, + }, + { + files: ['**/*.test.ts', '**/*.spec.ts'], + rules: { + 'vitest/consistent-test-filename': [ + 'warn', + { pattern: String.raw`.*\.(unit|integration|e2e)\.test\.[tj]sx?$` }, + ], + }, + }, + { + files: ['**/*.json'], + languageOptions: { parser: jsoncParser }, + }, + { + files: ['**/*.ts', '**/*.js'], + rules: { + 'n/file-extension-in-import': ['error', 'always'], + }, + }, + { + files: ['**/perf/**/*.ts'], + rules: { + '@typescript-eslint/no-magic-numbers': 'off', + 'sonarjs/no-duplicate-string': 'off', + }, + }, + { + ignores: [ + '**/*.mock.*', + '**/code-pushup.config.ts', + '**/mocks/fixtures/**', + '**/__snapshots__/**', + '**/dist', + '**/*.md', + ], + }, +); diff --git a/examples/plugins/.eslintrc.json b/examples/plugins/.eslintrc.json deleted file mode 100644 index f40c6ab71..000000000 --- a/examples/plugins/.eslintrc.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "code-pushup.config.ts"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["examples/plugins/tsconfig.*?.json"] - } - }, - { - "files": ["*.test.ts"], - "parserOptions": { - "project": ["examples/plugins/tsconfig.*?.json"] - }, - "rules": { - "no-magic-numbers": "off", - "max-lines": "off" - } - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": ["error"] - } - } - ] -} diff --git a/examples/plugins/code-pushup.config.ts b/examples/plugins/code-pushup.config.ts index ad61ae851..4d3d19abe 100644 --- a/examples/plugins/code-pushup.config.ts +++ b/examples/plugins/code-pushup.config.ts @@ -1,4 +1,4 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { LIGHTHOUSE_OUTPUT_FILE_DEFAULT, fileSizePlugin, @@ -9,7 +9,7 @@ import { packageJsonPerformanceGroupRef, packageJsonPlugin, packageJsonVersionControlGroupRef, -} from '../../dist/examples/plugins'; +} from '../../dist/examples/plugins/index.js'; /** * Run it with: @@ -38,7 +38,7 @@ const config = { }), await lighthousePlugin({ url: 'https://staging.code-pushup.dev/login', - outputPath: join('.code-pushup', LIGHTHOUSE_OUTPUT_FILE_DEFAULT), + outputPath: path.join('.code-pushup', LIGHTHOUSE_OUTPUT_FILE_DEFAULT), headless: false, verbose: true, }), diff --git a/examples/plugins/eslint.config.js b/examples/plugins/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/examples/plugins/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/examples/plugins/mocks/constants.ts b/examples/plugins/mocks/constants.ts index 90c12e637..b85f2374a 100644 --- a/examples/plugins/mocks/constants.ts +++ b/examples/plugins/mocks/constants.ts @@ -1,7 +1,7 @@ import type { PackageJson, SourceResult, -} from '../src/package-json/src/integration/types'; +} from '../src/package-json/src/integration/types.js'; export const packageJsonName = 'package.json'; export const packageJson: PackageJson = { diff --git a/examples/plugins/project.json b/examples/plugins/project.json index 540db1eb3..c939f536f 100644 --- a/examples/plugins/project.json +++ b/examples/plugins/project.json @@ -5,14 +5,13 @@ "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/examples/plugins", "main": "examples/plugins/src/index.ts", "tsConfig": "examples/plugins/tsconfig.lib.json", - "assets": ["examples/plugins/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["examples/plugins/*.md"] } }, "lint": { diff --git a/examples/plugins/src/file-size/src/file-size.plugin.integration.test.ts b/examples/plugins/src/file-size/src/file-size.plugin.integration.test.ts index 6e9e85d9e..e647be9c6 100644 --- a/examples/plugins/src/file-size/src/file-size.plugin.integration.test.ts +++ b/examples/plugins/src/file-size/src/file-size.plugin.integration.test.ts @@ -13,7 +13,7 @@ import { create, recommendedRefs, pluginSlug as slug, -} from './file-size.plugin'; +} from './file-size.plugin.js'; const projectJson = JSON.stringify( { diff --git a/examples/plugins/src/file-size/src/file-size.plugin.ts b/examples/plugins/src/file-size/src/file-size.plugin.ts index b17b144fe..38a8bd449 100644 --- a/examples/plugins/src/file-size/src/file-size.plugin.ts +++ b/examples/plugins/src/file-size/src/file-size.plugin.ts @@ -1,5 +1,5 @@ import { stat } from 'node:fs/promises'; -import { basename } from 'node:path'; +import path from 'node:path'; import type { AuditOutput, AuditOutputs, @@ -59,7 +59,7 @@ export const recommendedRefs: CategoryRef[] = Object.values(auditsMap).map( * }, * plugins: [ * await fileSizePlugin({ - * directory: join(process.cwd(), './dist/packages/utils'), + * directory: path.join(process.cwd(), './dist/packages/utils'), * pattern: /\.js$/, * budget: 4200 * }) @@ -136,7 +136,7 @@ export function fileSizeIssues(options: { pattern, fileTransform: async (file: string) => { // get size of file - // const filePath = join(directory, file); + // const filePath = path.join(directory, file); const stats = await stat(file); return assertFileSize(file, stats.size, budget); @@ -145,14 +145,14 @@ export function fileSizeIssues(options: { } export function infoMessage(filePath: string, size: number) { - return `File ${basename(filePath)} is OK. (size: ${formatBytes(size)})`; + return `File ${path.basename(filePath)} is OK. (size: ${formatBytes(size)})`; } export function errorMessage(filePath: string, size: number, budget: number) { const sizeDifference = formatBytes(size - budget); const byteSize = formatBytes(size); const byteBudget = formatBytes(budget); - return `File ${basename( + return `File ${path.basename( filePath, )} has ${byteSize}, this is ${sizeDifference} too big. (budget: ${byteBudget})`; } diff --git a/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts b/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts index 09ec33359..7ed289eed 100644 --- a/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts +++ b/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts @@ -1,6 +1,6 @@ import { vol } from 'memfs'; import { unlink } from 'node:fs/promises'; -import { basename, join } from 'node:path'; +import path from 'node:path'; import { beforeEach, describe, expect, it } from 'vitest'; import { formatBytes } from '@code-pushup/utils'; import { @@ -10,7 +10,7 @@ import { fileSizeIssues, infoMessage, runnerFunction, -} from './file-size.plugin'; +} from './file-size.plugin.js'; const outputDir = 'test'; const projectJson = JSON.stringify( @@ -29,11 +29,11 @@ const testJs = ` `; describe('infoMessage', () => { - it.each([['index.js'], [join('src', 'index.js')]])( + it.each([['index.js'], [path.join('src', 'index.js')]])( 'should return info message', file => { expect(infoMessage(file, 12)).toBe( - `File ${basename(file)} is OK. (size: ${formatBytes(12)})`, + `File ${path.basename(file)} is OK. (size: ${formatBytes(12)})`, ); }, ); @@ -198,7 +198,7 @@ describe('runnerFunction', () => { }, outputDir, ); - await unlink(join(outputDir, 'm.js')); + await unlink(path.join(outputDir, 'm.js')); await expect(runnerFunction(baseOptions)).resolves.toEqual([ filesizeAuditOutputBase, diff --git a/examples/plugins/src/index.ts b/examples/plugins/src/index.ts index f6f676ccd..ed62fc922 100644 --- a/examples/plugins/src/index.ts +++ b/examples/plugins/src/index.ts @@ -3,16 +3,16 @@ export { audits as fileSizeAudits, recommendedRefs as fileSizeRecommendedRefs, type PluginOptions as FileSizePluginOptions, -} from './file-size/src/file-size.plugin'; +} from './file-size/src/file-size.plugin.js'; export { recommendedRefs as packageJsonRecommendedRefs, versionControlGroupRef as packageJsonVersionControlGroupRef, documentationGroupRef as packageJsonDocumentationGroupRef, performanceGroupRef as packageJsonPerformanceGroupRef, -} from './package-json/src/scoring'; -export { create as packageJsonPlugin } from './package-json/src/package-json.plugin'; +} from './package-json/src/scoring.js'; +export { create as packageJsonPlugin } from './package-json/src/package-json.plugin.js'; export { create as lighthousePlugin, LIGHTHOUSE_OUTPUT_FILE_DEFAULT, recommendedRefs as lighthouseCorePerfGroupRefs, -} from './lighthouse/src/index'; +} from './lighthouse/src/index.js'; diff --git a/examples/plugins/src/lighthouse/README.md b/examples/plugins/src/lighthouse/README.md index a950a019e..5febe372c 100644 --- a/examples/plugins/src/lighthouse/README.md +++ b/examples/plugins/src/lighthouse/README.md @@ -30,7 +30,7 @@ You can configure the plugin with the following options: Pass in the path on the directory to crawl (relative to `process.cwd()`), as well as patterns and a budget. ```js - import { join } from 'node:path'; + import path from 'node:path'; import { LIGHTHOUSE_OUTPUT_FILE_DEFAULT } from './lighthouse-plugin.constants'; import lighthousePlugin from './lighthouse.plugin'; @@ -40,7 +40,7 @@ You can configure the plugin with the following options: // ... lighthousePlugin({ url: 'https://example.com', - outputPath: join('.code-pushup', LIGHTHOUSE_OUTPUT_FILE_DEFAULT), + outputPath: path.join('.code-pushup', LIGHTHOUSE_OUTPUT_FILE_DEFAULT), }), ], }; diff --git a/examples/plugins/src/lighthouse/src/constants.ts b/examples/plugins/src/lighthouse/src/constants.ts index c6b791b16..330aecca1 100644 --- a/examples/plugins/src/lighthouse/src/constants.ts +++ b/examples/plugins/src/lighthouse/src/constants.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-magic-numbers */ import type { Audit, CategoryRef, Group } from '@code-pushup/models'; export const LIGHTHOUSE_OUTPUT_FILE_DEFAULT = 'lighthouse-report.json'; @@ -77,6 +76,7 @@ export const categoryCorePerfGroup: Group = { slug: LIGHTHOUSE_PERFORMANCE_CORE_GROUP_SLUG, title: 'performance-core', refs: [ + /* eslint-disable @typescript-eslint/no-magic-numbers */ // web vitals { slug: fcpSlug, @@ -111,6 +111,7 @@ export const categoryCorePerfGroup: Group = { slug: 'user-timings', weight: 0, }, + /* eslint-enable @typescript-eslint/no-magic-numbers */ ], }; @@ -119,6 +120,7 @@ export const categoryCorePerfGroup2: Group = { title: 'performance-core-2', refs: [ // web vitals + /* eslint-disable @typescript-eslint/no-magic-numbers */ { slug: 'first-contentful-paint', weight: 10, @@ -139,5 +141,6 @@ export const categoryCorePerfGroup2: Group = { slug: 'speed-index', weight: 10, }, + /* eslint-enable @typescript-eslint/no-magic-numbers */ ], }; diff --git a/examples/plugins/src/lighthouse/src/index.ts b/examples/plugins/src/lighthouse/src/index.ts index 8bb1ea7ee..0f487ec82 100644 --- a/examples/plugins/src/lighthouse/src/index.ts +++ b/examples/plugins/src/lighthouse/src/index.ts @@ -1,7 +1,7 @@ -export { create } from './lighthouse.plugin'; +export { create } from './lighthouse.plugin.js'; export { LIGHTHOUSE_OUTPUT_FILE_DEFAULT, corePerfGroupRefs as recommendedRefs, PLUGIN_SLUG, audits, -} from './constants'; +} from './constants.js'; diff --git a/examples/plugins/src/lighthouse/src/lighthouse.plugin.integration.test.ts b/examples/plugins/src/lighthouse/src/lighthouse.plugin.integration.test.ts index bf4c6e6ef..f233a2c83 100644 --- a/examples/plugins/src/lighthouse/src/lighthouse.plugin.integration.test.ts +++ b/examples/plugins/src/lighthouse/src/lighthouse.plugin.integration.test.ts @@ -1,13 +1,13 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { describe, expect, it } from 'vitest'; import { auditSchema, categoryRefSchema, pluginConfigSchema, } from '@code-pushup/models'; -import { corePerfGroupRefs } from './constants'; -import { audits, PLUGIN_SLUG as slug } from './index'; -import { create } from './lighthouse.plugin'; +import { corePerfGroupRefs } from './constants.js'; +import { audits, PLUGIN_SLUG as slug } from './index.js'; +import { create } from './lighthouse.plugin.js'; describe('lighthouse-create-export-config', () => { it('should return valid PluginConfig if create is called', async () => { @@ -89,7 +89,7 @@ describe('lighthouse-create-export-config', () => { it('should use onlyAudits', async () => { const pluginConfig = await create({ url: 'http://localhost:8080', - outputPath: `${join('tmp', 'lighthouse-report.json')}`, + outputPath: `${path.join('tmp', 'lighthouse-report.json')}`, onlyAudits: 'largest-contentful-paint', }); expect(pluginConfig.runner.args).toEqual( diff --git a/examples/plugins/src/lighthouse/src/lighthouse.plugin.ts b/examples/plugins/src/lighthouse/src/lighthouse.plugin.ts index a520eba60..d8ae99d3e 100644 --- a/examples/plugins/src/lighthouse/src/lighthouse.plugin.ts +++ b/examples/plugins/src/lighthouse/src/lighthouse.plugin.ts @@ -1,5 +1,5 @@ import type Result from 'lighthouse/types/lhr/lhr'; -import { dirname } from 'node:path'; +import path from 'node:path'; import type { AuditOutput, AuditOutputs, @@ -16,9 +16,12 @@ import { PLUGIN_SLUG, audits, categoryCorePerfGroup, -} from './constants'; -import type { LighthouseCliOptions, PluginOptions } from './types'; -import { getLighthouseCliArguments, lhrDetailsToIssueDetails } from './utils'; +} from './constants.js'; +import type { LighthouseCliOptions, PluginOptions } from './types.js'; +import { + getLighthouseCliArguments, + lhrDetailsToIssueDetails, +} from './utils.js'; /** * @example @@ -57,7 +60,7 @@ export async function create(options: PluginOptions) { // ensure output dir if (outputPath !== undefined) { - await ensureDirectoryExists(dirname(outputPath)); + await ensureDirectoryExists(path.dirname(outputPath)); } return { @@ -118,7 +121,7 @@ function lhrToAuditOutputs(lhr: Result): AuditOutputs { slug, score: score ?? 0, // score can be null value: Number.parseInt(value.toString(), 10), - displayValue: displayValue, + displayValue, }; const issues = lhrDetailsToIssueDetails(details); diff --git a/examples/plugins/src/lighthouse/src/lighthouse.plugin.unit.test.ts b/examples/plugins/src/lighthouse/src/lighthouse.plugin.unit.test.ts index 831421ce6..0e807dab9 100644 --- a/examples/plugins/src/lighthouse/src/lighthouse.plugin.unit.test.ts +++ b/examples/plugins/src/lighthouse/src/lighthouse.plugin.unit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { LIGHTHOUSE_OUTPUT_FILE_DEFAULT } from './constants'; -import { runnerConfig } from './lighthouse.plugin'; +import { LIGHTHOUSE_OUTPUT_FILE_DEFAULT } from './constants.js'; +import { runnerConfig } from './lighthouse.plugin.js'; describe('lighthouse-runnerConfig', () => { it('should execute if url is given', () => { diff --git a/examples/plugins/src/lighthouse/src/utils.ts b/examples/plugins/src/lighthouse/src/utils.ts index d478805ba..5b5ae6f08 100644 --- a/examples/plugins/src/lighthouse/src/utils.ts +++ b/examples/plugins/src/lighthouse/src/utils.ts @@ -1,8 +1,8 @@ import type Result from 'lighthouse/types/lhr/lhr'; import { type Issue, MAX_ISSUE_MESSAGE_LENGTH } from '@code-pushup/models'; import { objectToCliArgs, toArray } from '@code-pushup/utils'; -import { LIGHTHOUSE_REPORT_NAME } from './constants'; -import type { LighthouseCliOptions } from './types'; +import { LIGHTHOUSE_REPORT_NAME } from './constants.js'; +import type { LighthouseCliOptions } from './types.js'; export function getLighthouseCliArguments( options: LighthouseCliOptions, @@ -33,7 +33,7 @@ export function getLighthouseCliArguments( // handle chrome flags // eslint-disable-next-line functional/no-let - let chromeFlags: Array = []; + let chromeFlags: string[] = []; if (headless) { chromeFlags = [...chromeFlags, `--headless=${headless}`]; } @@ -43,7 +43,7 @@ export function getLighthouseCliArguments( if (chromeFlags.length > 0) { argsObj = { ...argsObj, - ['chrome-flags']: chromeFlags.join(' '), + 'chrome-flags': chromeFlags.join(' '), }; } diff --git a/examples/plugins/src/lighthouse/src/utils.unit.test.ts b/examples/plugins/src/lighthouse/src/utils.unit.test.ts index 5c82d0ce0..6af526196 100644 --- a/examples/plugins/src/lighthouse/src/utils.unit.test.ts +++ b/examples/plugins/src/lighthouse/src/utils.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { getLighthouseCliArguments } from './utils'; +import { getLighthouseCliArguments } from './utils.js'; describe('getLighthouseCliArguments', () => { it('should parse valid options', () => { diff --git a/examples/plugins/src/package-json/src/constants.ts b/examples/plugins/src/package-json/src/constants.ts index a8f47059f..9cc6a8a13 100644 --- a/examples/plugins/src/package-json/src/constants.ts +++ b/examples/plugins/src/package-json/src/constants.ts @@ -1,6 +1,6 @@ -import { dependenciesAuditMeta } from './integration/dependencies.audit'; -import { licenseAuditMeta } from './integration/license.audit'; -import { typeAuditInfoMeta } from './integration/type.audit'; +import { dependenciesAuditMeta } from './integration/dependencies.audit.js'; +import { licenseAuditMeta } from './integration/license.audit.js'; +import { typeAuditInfoMeta } from './integration/type.audit.js'; export const pluginSlug = 'package-json'; export const audits = [ diff --git a/examples/plugins/src/package-json/src/index.ts b/examples/plugins/src/package-json/src/index.ts index 15efb8a7f..bf2ea8e26 100644 --- a/examples/plugins/src/package-json/src/index.ts +++ b/examples/plugins/src/package-json/src/index.ts @@ -1,8 +1,8 @@ -export { pluginSlug, audits } from './constants'; +export { pluginSlug, audits } from './constants.js'; export { performanceGroupRef, documentationGroupRef, versionControlGroupRef, recommendedRefs, -} from './scoring'; -export { create, type PluginOptions } from './package-json.plugin'; +} from './scoring.js'; +export { create, type PluginOptions } from './package-json.plugin.js'; diff --git a/examples/plugins/src/package-json/src/integration/dependencies.audit.ts b/examples/plugins/src/package-json/src/integration/dependencies.audit.ts index ce22f6b53..e21d5ed91 100644 --- a/examples/plugins/src/package-json/src/integration/dependencies.audit.ts +++ b/examples/plugins/src/package-json/src/integration/dependencies.audit.ts @@ -5,8 +5,8 @@ import type { DependencyType, SourceResult, SourceResults, -} from './types'; -import { filterSeverityError, pluralizePackage } from './utils'; +} from './types.js'; +import { filterSeverityError, pluralizePackage } from './utils.js'; export type RequiredDependencies = DependencyMap; diff --git a/examples/plugins/src/package-json/src/integration/dependencies.audit.unit.test.ts b/examples/plugins/src/package-json/src/integration/dependencies.audit.unit.test.ts index caba3ecf9..00621aefa 100644 --- a/examples/plugins/src/package-json/src/integration/dependencies.audit.unit.test.ts +++ b/examples/plugins/src/package-json/src/integration/dependencies.audit.unit.test.ts @@ -1,11 +1,11 @@ import { describe, expect, it } from 'vitest'; import type { AuditOutput } from '@code-pushup/models'; -import { packageJson, packageResult } from '../../../../mocks/constants'; +import { packageJson, packageResult } from '../../../../mocks/constants.js'; import { assertDependency, dependenciesAudit, packageNotInstalledIssue, -} from './dependencies.audit'; +} from './dependencies.audit.js'; describe('packageNotInstalledIssue', () => { it.each([ diff --git a/examples/plugins/src/package-json/src/integration/license.audit.ts b/examples/plugins/src/package-json/src/integration/license.audit.ts index 1b301ccd1..a82683be3 100644 --- a/examples/plugins/src/package-json/src/integration/license.audit.ts +++ b/examples/plugins/src/package-json/src/integration/license.audit.ts @@ -1,11 +1,11 @@ import type { Audit, AuditOutput, Issue } from '@code-pushup/models'; -import type { SourceResults } from './types'; +import type { SourceResults } from './types.js'; import { assertPropertyEmpty, assertPropertyEqual, baseAuditOutput, scoreByErrorIssues, -} from './utils'; +} from './utils.js'; const licenseAuditSlug = 'package-license'; export const licenseAuditMeta: Audit = { diff --git a/examples/plugins/src/package-json/src/integration/license.audit.unit.test.ts b/examples/plugins/src/package-json/src/integration/license.audit.unit.test.ts index d3e00926a..3fe3c4562 100644 --- a/examples/plugins/src/package-json/src/integration/license.audit.unit.test.ts +++ b/examples/plugins/src/package-json/src/integration/license.audit.unit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { packageResult } from '../../../../mocks/constants'; -import { licenseAudit } from './license.audit'; +import { packageResult } from '../../../../mocks/constants.js'; +import { licenseAudit } from './license.audit.js'; describe('licenseAudit', () => { it('should pass if not configured', () => { diff --git a/examples/plugins/src/package-json/src/integration/type.audit.ts b/examples/plugins/src/package-json/src/integration/type.audit.ts index 2a6a2bb56..65b0322f2 100644 --- a/examples/plugins/src/package-json/src/integration/type.audit.ts +++ b/examples/plugins/src/package-json/src/integration/type.audit.ts @@ -1,11 +1,11 @@ import type { AuditOutput, Issue } from '@code-pushup/models'; -import type { PackageJson, SourceResult, SourceResults } from './types'; +import type { PackageJson, SourceResult, SourceResults } from './types.js'; import { assertPropertyEmpty, assertPropertyEqual, baseAuditOutput, scoreByErrorIssues, -} from './utils'; +} from './utils.js'; const typeAuditSlug = 'package-type'; export const typeAuditInfoMeta = { diff --git a/examples/plugins/src/package-json/src/integration/type.audit.unit.test.ts b/examples/plugins/src/package-json/src/integration/type.audit.unit.test.ts index 3e0ecc0e0..68d0e2526 100644 --- a/examples/plugins/src/package-json/src/integration/type.audit.unit.test.ts +++ b/examples/plugins/src/package-json/src/integration/type.audit.unit.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { packageResult } from '../../../../mocks/constants'; -import { typeAudit } from './type.audit'; -import type { PackageJson } from './types'; +import { packageResult } from '../../../../mocks/constants.js'; +import { typeAudit } from './type.audit.js'; +import type { PackageJson } from './types.js'; describe('typeAudit', () => { it('should pass if not configured', () => { diff --git a/examples/plugins/src/package-json/src/integration/utils.ts b/examples/plugins/src/package-json/src/integration/utils.ts index 5e088d7fd..9ad74981b 100644 --- a/examples/plugins/src/package-json/src/integration/utils.ts +++ b/examples/plugins/src/package-json/src/integration/utils.ts @@ -1,6 +1,6 @@ import type { AuditOutput, Issue } from '@code-pushup/models'; import { factorOf, pluralizeToken } from '@code-pushup/utils'; -import type { PackageJson, SourceResult } from './types'; +import type { PackageJson, SourceResult } from './types.js'; export function baseAuditOutput(slug: string): AuditOutput { return { diff --git a/examples/plugins/src/package-json/src/package-json.plugin.integration.test.ts b/examples/plugins/src/package-json/src/package-json.plugin.integration.test.ts index a76265391..634ec9653 100644 --- a/examples/plugins/src/package-json/src/package-json.plugin.integration.test.ts +++ b/examples/plugins/src/package-json/src/package-json.plugin.integration.test.ts @@ -8,14 +8,14 @@ import { pluginReportSchema, } from '@code-pushup/models'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; -import { audits, pluginSlug as slug } from './constants'; -import { type PluginOptions, create } from './package-json.plugin'; +import { audits, pluginSlug as slug } from './constants.js'; +import { type PluginOptions, create } from './package-json.plugin.js'; import { documentationGroupRef, performanceGroupRef, recommendedRefs, versionControlGroupRef, -} from './scoring'; +} from './scoring.js'; describe('create-package-json', () => { const baseOptions: PluginOptions = { diff --git a/examples/plugins/src/package-json/src/package-json.plugin.ts b/examples/plugins/src/package-json/src/package-json.plugin.ts index 10e49d9b6..3c75ed6f5 100644 --- a/examples/plugins/src/package-json/src/package-json.plugin.ts +++ b/examples/plugins/src/package-json/src/package-json.plugin.ts @@ -8,24 +8,24 @@ import { readJsonFile, readTextFile, } from '@code-pushup/utils'; -import { pluginSlug } from './constants'; +import { pluginSlug } from './constants.js'; import { type RequiredDependencies, dependenciesAudit, dependenciesAuditMeta, -} from './integration/dependencies.audit'; -import { licenseAudit, licenseAuditMeta } from './integration/license.audit'; -import { typeAudit, typeAuditInfoMeta } from './integration/type.audit'; +} from './integration/dependencies.audit.js'; +import { licenseAudit, licenseAuditMeta } from './integration/license.audit.js'; +import { typeAudit, typeAuditInfoMeta } from './integration/type.audit.js'; import type { PackageJson, SourceResult, SourceResults, -} from './integration/types'; +} from './integration/types.js'; import { documentationGroup, performanceGroup, versionControlGroup, -} from './scoring'; +} from './scoring.js'; export type PluginOptions = { directory: string; diff --git a/examples/plugins/src/package-json/src/scoring.ts b/examples/plugins/src/package-json/src/scoring.ts index c2843a909..9745657be 100644 --- a/examples/plugins/src/package-json/src/scoring.ts +++ b/examples/plugins/src/package-json/src/scoring.ts @@ -1,8 +1,8 @@ import type { CategoryRef, Group } from '@code-pushup/models'; -import { pluginSlug } from './constants'; -import { dependenciesAuditMeta } from './integration/dependencies.audit'; -import { licenseAuditMeta } from './integration/license.audit'; -import { typeAuditInfoMeta } from './integration/type.audit'; +import { pluginSlug } from './constants.js'; +import { dependenciesAuditMeta } from './integration/dependencies.audit.js'; +import { licenseAuditMeta } from './integration/license.audit.js'; +import { typeAuditInfoMeta } from './integration/type.audit.js'; const documentationGroupSlug = 'documentation'; export const documentationGroup: Group = { diff --git a/examples/plugins/vite.config.integration.ts b/examples/plugins/vite.config.integration.ts index ffbbb0491..5859ca287 100644 --- a/examples/plugins/vite.config.integration.ts +++ b/examples/plugins/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/examples-plugins', diff --git a/examples/plugins/vite.config.unit.ts b/examples/plugins/vite.config.unit.ts index 2260796b7..a39e779dc 100644 --- a/examples/plugins/vite.config.unit.ts +++ b/examples/plugins/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/examples-plugins', diff --git a/knip.config.ts b/knip.config.ts index 9f753c273..ece4aba2d 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -70,7 +70,6 @@ const withNxStandards = (): KnipConfigPlugin => () => { '**/code-pushup.*.{js,mjs,ts,cjs,mts,cts}', '**/vite.config.*.ts', '**/*.d.ts', - 'esbuild.config.js', 'tools/**/*.{js,mjs,ts,cjs,mts,cts}', ], ignoreDependencies: [ diff --git a/nx.json b/nx.json index 23a1511fb..4bb5b7b02 100644 --- a/nx.json +++ b/nx.json @@ -6,22 +6,10 @@ "inputs": ["production", "^production"], "cache": true }, - "@nx/esbuild:esbuild": { - "inputs": [ - "production", - "^production", - "{workspaceRoot}/esbuild.config.js" - ] - }, "lint": { - "inputs": [ - "default", - "{workspaceRoot}/.eslintrc.json", - "{workspaceRoot}/.eslintignore" - ], + "inputs": ["default", "{workspaceRoot}/eslint.config.?(c)js"], "options": { - "maxWarnings": 0, - "reportUnusedDisableDirectives": "warn" + "maxWarnings": 0 }, "cache": true }, @@ -49,7 +37,7 @@ "default": ["{projectRoot}/**/*", "sharedGlobals"], "production": [ "default", - "!{projectRoot}/.eslintrc.json", + "!{projectRoot}/eslint.config.?(c)js", "!{projectRoot}/**/?(*.)test.[jt]s?(x)?(.snap)", "!{projectRoot}/tsconfig.test.json", "!{projectRoot}/src/test-setup.[jt]s", diff --git a/package-lock.json b/package-lock.json index 359050ce9..0459e1180 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,79 +11,78 @@ "dependencies": { "@code-pushup/portal-client": "^0.9.0", "@isaacs/cliui": "^8.0.2", - "@nx/devkit": "18.3.5", - "@poppinss/cliui": "^6.4.0", - "@swc/helpers": "0.5.3", - "ansis": "^3.3.0", + "@nx/devkit": "19.8.13", + "@poppinss/cliui": "^6.4.1", + "@swc/helpers": "0.5.13", + "ansis": "^3.3.2", "build-md": "^0.4.2", "bundle-require": "^4.0.1", "esbuild": "^0.19.12", - "eslint": "~8.56.0", + "eslint": "^9.16.0", "glob": "^10.4.5", "lighthouse": "^12.0.0", "lighthouse-logger": "2.0.1", "multi-progress-bars": "^5.0.3", - "nx": "18.3.5", + "nx": "19.8.13", "parse-lcov": "^1.0.4", - "semver": "^7.6.0", - "simple-git": "^3.20.0", + "semver": "^7.6.3", + "simple-git": "^3.26.0", "tslib": "^2.6.2", - "vscode-material-icons": "^0.1.0", + "vscode-material-icons": "^0.1.1", "yaml": "^2.5.1", "yargs": "^17.7.2", - "zod": "^3.22.4" + "zod": "^3.23.8", + "zod-validation-error": "^3.4.0" }, "devDependencies": { - "@beaussan/nx-knip": "0.0.5-15", - "@code-pushup/eslint-config": "^0.2.1", + "@beaussan/nx-knip": "^0.0.5-15", + "@code-pushup/eslint-config": "^0.10.7", "@commitlint/cli": "^19.5.0", "@commitlint/config-conventional": "^19.5.0", "@commitlint/config-nx-scopes": "^19.5.0", "@commitlint/cz-commitlint": "^19.5.0", "@commitlint/types": "^19.5.0", "@nodelib/fs.walk": "^2.0.0", - "@nx/esbuild": "18.3.5", - "@nx/eslint-plugin": "18.3.5", - "@nx/js": "18.3.5", - "@nx/plugin": "18.3.5", - "@nx/react": "18.3.5", - "@nx/vite": "18.3.5", - "@nx/workspace": "18.3.5", + "@nx/eslint-plugin": "19.8.13", + "@nx/js": "19.8.13", + "@nx/plugin": "19.8.13", + "@nx/react": "19.8.13", + "@nx/vite": "19.8.13", + "@nx/workspace": "19.8.13", "@push-based/nx-verdaccio": "0.0.0-alpha.26", - "@swc-node/register": "1.8.0", - "@swc/cli": "~0.1.62", - "@swc/core": "^1.3.99", + "@swc-node/register": "1.9.2", + "@swc/cli": "0.3.14", + "@swc/core": "1.5.7", "@testing-library/jest-dom": "^6.4.2", - "@testing-library/react": "^14.0.0", + "@testing-library/react": "15.0.6", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/benchmark": "^2.1.5", "@types/debug": "^4.1.12", "@types/eslint": "^8.44.2", "@types/node": "18.19.21", - "@types/react": "18.2.24", - "@types/react-dom": "18.2.9", - "@typescript-eslint/eslint-plugin": "6.13.2", - "@typescript-eslint/parser": "6.13.2", + "@types/react": "18.3.1", + "@types/react-dom": "18.3.0", "@vitejs/plugin-react": "4.2.1", - "@vitest/coverage-v8": "1.6.0", - "@vitest/ui": "1.6.0", + "@vitest/coverage-v8": "1.3.1", + "@vitest/ui": "1.3.1", "benchmark": "^2.1.4", - "chrome-launcher": "^1.1.1", + "chrome-launcher": "^1.1.2", "chromium": "^3.0.3", "commitizen": "^4.3.1", "commitlint-plugin-tense": "^1.0.3", - "dotenv": "^16.3.1", + "dotenv": "^16.4.5", "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-deprecation": "^2.0.0", - "eslint-plugin-functional": "^6.0.0", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-n": "^16.3.1", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-sonarjs": "^0.22.0", - "eslint-plugin-unicorn": "^48.0.1", - "eslint-plugin-vitest": "^0.3.8", + "eslint-plugin-functional": "^7.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jest-formatting": "^3.1.0", + "eslint-plugin-n": "^17.15.0", + "eslint-plugin-promise": "^7.2.1", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-sonarjs": "^1.0.4", + "eslint-plugin-unicorn": "^56.0.1", + "eslint-plugin-vitest": "^0.5.4", + "globals": "^15.13.0", "husky": "^8.0.0", "inquirer": "^9.3.7", "jsdom": "~24.0.0", @@ -91,24 +90,32 @@ "knip": "^5.33.3", "memfs": "^4.5.0", "minimatch": "^10.0.1", - "moment": "^2.29.4", - "prettier": "^3.3.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "moment": "^2.30.1", + "prettier": "^3.4.1", + "react": "18.3.1", + "react-dom": "18.3.1", "tsconfig-paths": "^4.2.0", - "tsx": "^4.1.2", + "tsx": "^4.19.0", "type-fest": "^4.26.1", - "typescript": "5.4.5", - "verdaccio": "^5.0.4", - "vite": "^5.2.13", - "vitest": "1.6.0", - "zod2md": "^0.1.1" + "typescript": "5.5.4", + "typescript-eslint": "^8.18.0", + "verdaccio": "^5.32.2", + "vite": "^5.4.8", + "vitest": "1.3.1", + "zod2md": "^0.1.3" + }, + "engines": { + "node": ">=22.10" }, "optionalDependencies": { - "@esbuild/darwin-arm64": "^0.19.4", - "@nx/nx-darwin-arm64": "^16.9.1", - "@nx/nx-darwin-x64": "^16.10.0", - "@nx/nx-linux-x64-gnu": "16.7.4" + "@esbuild/darwin-arm64": "^0.19.12", + "@nx/nx-darwin-arm64": "19.8.13", + "@nx/nx-darwin-x64": "19.8.13", + "@nx/nx-linux-x64-gnu": "19.8.13", + "@rollup/rollup-darwin-arm64": "^4.0.0", + "@rollup/rollup-darwin-x64": "^4.0.0", + "@rollup/rollup-linux-x64-gnu": "^4.0.0", + "@rollup/rollup-win32-x64-msvc": "^4.0.0" } }, "node_modules/@adobe/css-tools": { @@ -131,12 +138,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.9.tgz", - "integrity": "sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.25.9", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -144,30 +151,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.9.tgz", - "integrity": "sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.9.tgz", - "integrity": "sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helpers": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -192,54 +199,54 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.9.tgz", - "integrity": "sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dev": true, "dependencies": { - "@babel/types": "^7.25.9", + "@babel/types": "^7.25.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", - "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -257,17 +264,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.4", "semver": "^6.3.1" }, "engines": { @@ -287,13 +294,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", - "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.1.1", + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, "engines": { @@ -366,41 +373,41 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz", - "integrity": "sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-simple-access": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -410,35 +417,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -448,14 +455,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -465,26 +472,26 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", - "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -507,6 +514,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -516,53 +524,54 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.9.tgz", - "integrity": "sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", "dev": true, "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -619,12 +628,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz", - "integrity": "sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.26.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -634,13 +644,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.3" }, "engines": { "node": ">=6.9.0" @@ -650,12 +660,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -665,12 +675,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -680,14 +690,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -697,13 +707,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -713,14 +723,14 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", - "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz", + "integrity": "sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-decorators": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-decorators": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -793,12 +803,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", - "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz", + "integrity": "sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -807,13 +817,37 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.9.tgz", - "integrity": "sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -823,12 +857,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.9.tgz", - "integrity": "sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -862,12 +896,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -979,12 +1013,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1010,12 +1044,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1025,14 +1059,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", + "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.4" }, "engines": { "node": ">=6.9.0" @@ -1042,14 +1077,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1059,12 +1094,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1074,12 +1109,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1089,13 +1124,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1105,13 +1140,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.9.tgz", - "integrity": "sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1121,16 +1157,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.4", "globals": "^11.1.0" }, "engines": { @@ -1140,14 +1176,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1157,12 +1202,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1172,13 +1217,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1188,12 +1233,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1203,13 +1248,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1219,12 +1264,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1234,13 +1280,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", - "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1250,12 +1296,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1265,13 +1312,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1281,14 +1328,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -1298,12 +1345,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1313,12 +1361,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1328,12 +1376,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1343,12 +1392,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1358,13 +1407,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1374,14 +1423,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", - "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-simple-access": "^7.25.9" + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1391,15 +1440,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1409,13 +1458,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1425,13 +1474,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1441,12 +1490,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1456,12 +1505,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1471,12 +1521,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1486,14 +1537,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1503,13 +1555,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1519,12 +1571,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1534,13 +1587,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1550,12 +1604,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1565,13 +1619,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1581,14 +1635,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1598,12 +1653,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1613,12 +1668,12 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz", - "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.1.tgz", + "integrity": "sha512-SLV/giH/V4SmloZ6Dt40HjTGTAIkxn33TVIHxNGNvo8ezMhrxBkzisj4op1KZYPIOHFLqhv60OHvX+YRu4xbmQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1628,12 +1683,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", - "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1643,16 +1698,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -1662,12 +1717,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", - "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", "dev": true, "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.9" + "@babel/plugin-transform-react-jsx": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1677,12 +1732,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1692,12 +1747,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1707,13 +1762,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", - "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", + "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1723,12 +1778,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1739,12 +1794,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1754,13 +1809,13 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz", + "integrity": "sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -1783,12 +1838,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1798,13 +1853,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1814,12 +1869,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1829,12 +1884,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1844,12 +1899,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1859,16 +1914,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", - "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1878,12 +1933,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1893,13 +1948,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1909,13 +1964,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1925,13 +1980,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1941,78 +1996,93 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.9.tgz", - "integrity": "sha512-XqDEt+hfsQukahSX9JOBDHhpUHDhj2zGSxoqWQFCMajOSBnbhBdgON/bU/5PkBA1yX5tqW6tTzuIPVsZTQ7h5Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", + "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.4", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.25.9", - "@babel/plugin-syntax-import-attributes": "^7.25.9", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.25.9", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.25.4", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "core-js-compat": "^3.37.1", "semver": "^6.3.1" }, "engines": { @@ -2046,17 +2116,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz", - "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", + "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-react-display-name": "^7.25.9", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/plugin-transform-react-jsx-development": "^7.25.9", - "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.24.7", + "@babel/plugin-transform-react-jsx-development": "^7.24.7", + "@babel/plugin-transform-react-pure-annotations": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2066,16 +2136,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.9.tgz", - "integrity": "sha512-XWxw1AcKk36kgxf4C//fl0ikjLeqGUWn062/Fd8GtpTfDJOX6Ud95FK+4JlDA36BX4bNGndXi3a6Vr4Jo5/61A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-typescript": "^7.25.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2084,10 +2154,16 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, "node_modules/@babel/runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.9.tgz", - "integrity": "sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2097,30 +2173,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2128,11 +2204,21 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", - "integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -2162,65 +2248,58 @@ } }, "node_modules/@code-pushup/eslint-config": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@code-pushup/eslint-config/-/eslint-config-0.2.1.tgz", - "integrity": "sha512-32GXt3bg2FA6/tvTNpgQBrDNAW6ZKauDH4lvXQj8EDr56ghBaZbZHZ8aSzWw9Ke+RNPGO28spHGYP/GKLZppnw==", + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@code-pushup/eslint-config/-/eslint-config-0.10.7.tgz", + "integrity": "sha512-KlzMFRyi5ifZaNPyijM03PCC1kSkzcrF04L+2zAGg3KvEHLULg2aCkXo4qJeJVTH9DaMbRLW3/qY00eMYmb9tw==", "dev": true, "peerDependencies": { - "@angular-eslint/eslint-plugin": "^17.0.0", - "@angular-eslint/eslint-plugin-template": "^17.0.0", - "@angular-eslint/template-parser": "^17.0.0", + "@eslint/js": "^9.0.0", "@graphql-eslint/eslint-plugin": "^3.0.0", - "@ngrx/eslint-plugin": "^17.0.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "eslint": "^8.0.0", + "@ngrx/eslint-plugin": "^18.0.0", + "angular-eslint": "^18.0.0", + "eslint": "^9.0.0", "eslint-import-resolver-typescript": "^3.0.0", - "eslint-plugin-cypress": "^2.0.0", - "eslint-plugin-deprecation": "^2.0.0", - "eslint-plugin-functional": "^6.0.0", - "eslint-plugin-import": "^2.25.0", - "eslint-plugin-jest": "^27.0.0", - "eslint-plugin-n": "^16.0.0", - "eslint-plugin-promise": "^6.0.0", - "eslint-plugin-rxjs": "^5.0.0", - "eslint-plugin-sonarjs": ">=0.22.0", - "eslint-plugin-storybook": "^0.6.0", - "eslint-plugin-unicorn": ">=48.0.0", - "eslint-plugin-vitest": "^0.3.0" + "eslint-plugin-cypress": ">=3.3.0", + "eslint-plugin-functional": "^7.0.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jest": "^28.8.0", + "eslint-plugin-jest-formatting": "^3.0.0", + "eslint-plugin-n": ">=17.0.0", + "eslint-plugin-promise": ">=6.4.0", + "eslint-plugin-rxjs-x": ">=0.2.4", + "eslint-plugin-sonarjs": "^1.0.4", + "eslint-plugin-storybook": ">=0.10.0", + "eslint-plugin-unicorn": ">=50.0.0", + "eslint-plugin-vitest": ">=0.5.0", + "globals": ">=14.0.0", + "typescript-eslint": "^8.0.0" }, "peerDependenciesMeta": { - "@angular-eslint/eslint-plugin": { - "optional": true - }, - "@angular-eslint/eslint-plugin-template": { - "optional": true - }, - "@angular-eslint/template-parser": { - "optional": true - }, "@graphql-eslint/eslint-plugin": { "optional": true }, "@ngrx/eslint-plugin": { "optional": true }, + "angular-eslint": { + "optional": true + }, "eslint-import-resolver-typescript": { "optional": true }, "eslint-plugin-cypress": { "optional": true }, - "eslint-plugin-deprecation": { + "eslint-plugin-jest": { "optional": true }, - "eslint-plugin-jest": { + "eslint-plugin-jest-formatting": { "optional": true }, "eslint-plugin-n": { "optional": true }, - "eslint-plugin-rxjs": { + "eslint-plugin-rxjs-x": { "optional": true }, "eslint-plugin-storybook": { @@ -2252,13 +2331,13 @@ } }, "node_modules/@commitlint/cli": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.5.0.tgz", - "integrity": "sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==", + "version": "19.6.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.6.0.tgz", + "integrity": "sha512-v17BgGD9w5KnthaKxXnEg6KLq6DYiAxyiN44TpiRtqyW8NSq+Kx99mkEG8Qo6uu6cI5eMzMojW2muJxjmPnF8w==", "dev": true, "dependencies": { "@commitlint/format": "^19.5.0", - "@commitlint/lint": "^19.5.0", + "@commitlint/lint": "^19.6.0", "@commitlint/load": "^19.5.0", "@commitlint/read": "^19.5.0", "@commitlint/types": "^19.5.0", @@ -2273,9 +2352,9 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.5.0.tgz", - "integrity": "sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==", + "version": "19.6.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.6.0.tgz", + "integrity": "sha512-DJT40iMnTYtBtUfw9ApbsLZFke1zKh6llITVJ+x9mtpHD08gsNXaIRqHTmwTZL3dNX5+WoyK7pCN/5zswvkBCQ==", "dev": true, "dependencies": { "@commitlint/types": "^19.5.0", @@ -2379,9 +2458,9 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.5.0.tgz", - "integrity": "sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==", + "version": "19.6.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.6.0.tgz", + "integrity": "sha512-Ov6iBgxJQFR9koOupDPHvcHU9keFupDgtB3lObdEZDroiG4jj1rzky60fbQozFKVYRTUdrBGICHG0YVmRuAJmw==", "dev": true, "dependencies": { "@commitlint/types": "^19.5.0", @@ -2392,14 +2471,14 @@ } }, "node_modules/@commitlint/lint": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.5.0.tgz", - "integrity": "sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==", + "version": "19.6.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.6.0.tgz", + "integrity": "sha512-LRo7zDkXtcIrpco9RnfhOKeg8PAnE3oDDoalnrVU/EVaKHYBWYL1DlRR7+3AWn0JiBqD8yKOfetVxJGdEtZ0tg==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^19.5.0", + "@commitlint/is-ignored": "^19.6.0", "@commitlint/parse": "^19.5.0", - "@commitlint/rules": "^19.5.0", + "@commitlint/rules": "^19.6.0", "@commitlint/types": "^19.5.0" }, "engines": { @@ -2484,9 +2563,9 @@ } }, "node_modules/@commitlint/rules": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.5.0.tgz", - "integrity": "sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==", + "version": "19.6.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.6.0.tgz", + "integrity": "sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==", "dev": true, "dependencies": { "@commitlint/ensure": "^19.5.0", @@ -2555,9 +2634,9 @@ } }, "node_modules/@cypress/request": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", - "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.6.tgz", + "integrity": "sha512-fi0eVdCOtKu5Ed6+E8mYxUF6ZTFJDZvHogCBelM0xVXmrDEkyM22gRArQzq1YcHPm1V47Vf/iAD+WgVdUlJCGg==", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", @@ -2566,16 +2645,16 @@ "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", + "form-data": "~4.0.0", + "http-signature": "~1.4.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "6.10.4", + "qs": "6.13.0", "safe-buffer": "^5.1.2", - "tough-cookie": "^4.1.3", + "tough-cookie": "^5.0.0", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" }, @@ -2583,93 +2662,120 @@ "node": ">= 6" } }, - "node_modules/@cypress/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/@cypress/request/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 0.12" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@cypress/request/node_modules/qs": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", - "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "node_modules/@cypress/request/node_modules/tough-cookie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "tldts": "^6.1.32" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16" + } + }, + "node_modules/@emnapi/core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.2.0.tgz", + "integrity": "sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==", + "dependencies": { + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", "cpu": [ "ppc64" ], + "dev": true, "optional": true, "os": [ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { @@ -2688,198 +2794,211 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", "cpu": [ "loong64" ], + "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", "cpu": [ "mips64el" ], + "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", "cpu": [ "ppc64" ], + "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", "cpu": [ "riscv64" ], + "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", "cpu": [ "s390x" ], + "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { @@ -2899,63 +3018,67 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { @@ -2974,65 +3097,44 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@eslint/config-array": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "node_modules/@eslint/config-array/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", @@ -3041,98 +3143,94 @@ "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "type-fest": "^0.20.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "node_modules/@eslint/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/@eslint/js": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", + "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "dependencies": { + "levn": "^0.4.1" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@formatjs/ecma402-abstract": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.0.tgz", - "integrity": "sha512-IpM+ev1E4QLtstniOE29W1rqH9eTdx5hQdNL8pzrflMj/gogfaoONZqL83LUeQScHAvyMbpqP5C9MzNf+fFwhQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz", + "integrity": "sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==", "dependencies": { - "@formatjs/fast-memoize": "2.2.1", - "@formatjs/intl-localematcher": "0.5.5", - "tslib": "^2.7.0" + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" } }, "node_modules/@formatjs/fast-memoize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.1.tgz", - "integrity": "sha512-XS2RcOSyWxmUB7BUjj3mlPH0exsUzlf6QfhhijgI941WaJhVxXQ6mEWkdUFIdnKi3TuTYxRdelsgv3mjieIGIA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", + "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", "dependencies": { - "tslib": "^2.7.0" + "tslib": "^2.4.0" } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.8.0.tgz", - "integrity": "sha512-r2un3fmF9oJv3mOkH+wwQZ037VpqmdfahbcCZ9Lh+p6Sx+sNsonI7Zcr6jNMm1s+Si7ejQORS4Ezlh05mMPAXA==", + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz", + "integrity": "sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/icu-skeleton-parser": "1.8.4", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.0.0", + "@formatjs/icu-skeleton-parser": "1.8.2", + "tslib": "^2.4.0" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.4.tgz", - "integrity": "sha512-LMQ1+Wk1QSzU4zpd5aSu7+w5oeYhupRwZnMQckLPRYhSjf2/8JWQ882BauY9NyHxs5igpuQIXZDgfkaH3PoATg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz", + "integrity": "sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.0.0", + "tslib": "^2.4.0" } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.5.tgz", - "integrity": "sha512-t5tOGMgZ/i5+ALl2/offNqAQq/lfUnKLEw0mXQI4N4bqpedhrSE+fyKLpwnd22sK0dif6AV+ufQcTsKShB9J1g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", + "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", "dependencies": { - "tslib": "^2.7.0" + "tslib": "^2.4.0" } }, "node_modules/@graphql-typed-document-node/core": { @@ -3143,38 +3241,36 @@ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "engines": { - "node": "*" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -3189,16 +3285,22 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead" + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@inquirer/figures": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz", - "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", + "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", "dev": true, "engines": { "node": ">=18" @@ -3236,15 +3338,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3267,19 +3360,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -3934,6 +4014,17 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -3989,9 +4080,9 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", - "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz", + "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==", "dev": true, "engines": { "node": ">=10.0" @@ -4017,213 +4108,81 @@ "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" }, - "node_modules/@mole-inc/bin-wrapper": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@mole-inc/bin-wrapper/-/bin-wrapper-8.0.1.tgz", - "integrity": "sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==", + "node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.6.16.tgz", + "integrity": "sha512-AQj20lUL5fmdz4un56W3VF8naZaRDmztczl+/j4Qa69JAaUbbZK6zZJ3NEjx0cNzpiq/mGmG9Vik3V4rI/4BUA==", "dev": true, "dependencies": { - "bin-check": "^4.1.0", - "bin-version-check": "^5.0.0", - "content-disposition": "^0.5.4", - "ext-name": "^5.0.0", - "file-type": "^17.1.6", - "filenamify": "^5.0.2", - "got": "^11.8.5", - "os-filter-obj": "^2.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "@module-federation/sdk": "0.6.16", + "@types/semver": "7.5.8", + "semver": "7.6.3" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-3.0.0.tgz", - "integrity": "sha512-ktI9+PxfHYtKjF3cLTUAh2N+b8MijCRPNwKJNqTVdL0gB0QxLU2rIRaZ1t71oEa3YBDE6bukH1sR0+CDnpp/Mg==", + "node_modules/@module-federation/data-prefetch": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.6.16.tgz", + "integrity": "sha512-m5SNKlAkB2FFCs2cl6LWqo6s2NZ7HuCrp6QrrMzuKjB6EddvKojVQxOzrWdcMLs1vESy6fyU4M4U7PxSojw6Ww==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "3.0.0", - "run-parallel": "^1.2.0" + "@module-federation/runtime": "0.6.16", + "@module-federation/sdk": "0.6.16", + "fs-extra": "9.1.0" }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-3.0.0.tgz", - "integrity": "sha512-2tQOI38s19P9i7X/Drt0v8iMA+KMsgdhB/dyPER+e+2Y8L1Z7QvnuRdW/uLuf5YRFUYmnj4bMA6qCuZHFI1GDQ==", - "dev": true, - "engines": { - "node": ">=16.14.0" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-2.0.0.tgz", - "integrity": "sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A==", + "node_modules/@module-federation/data-prefetch/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "3.0.0", - "fastq": "^1.15.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@nrwl/devkit": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-18.3.5.tgz", - "integrity": "sha512-DIvChKMe4q8CtIsbrumL/aYgf85H5vlT6eF3jnCCWORj6LTwoHtK8Q9ky1+uM82KIM0gaKd32NVDw+w64scHyg==", - "dependencies": { - "@nx/devkit": "18.3.5" - } - }, - "node_modules/@nrwl/esbuild": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/esbuild/-/esbuild-18.3.5.tgz", - "integrity": "sha512-WB6Ot2vVTAyBucO0wCDIBjv6BWmc9s9BBZYLY/lK/oVtxvUspLX7pn+ZaM+cTi0U2BuC+pDU1hwkZxayg4evvQ==", - "dev": true, - "dependencies": { - "@nx/esbuild": "18.3.5" - } - }, - "node_modules/@nrwl/eslint-plugin-nx": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-18.3.5.tgz", - "integrity": "sha512-E3ysbO3BT/bx8gZJQX65YsU/MvsuLP/+gL7Xnm0lEOfm9rIdwY6iRRTmQNUIExDBzVlleLruqIPBK11Dr5H/lA==", - "dev": true, - "dependencies": { - "@nx/eslint-plugin": "18.3.5" - } - }, - "node_modules/@nrwl/jest": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-18.3.5.tgz", - "integrity": "sha512-/BvFmOO9lX8DviHP8+ZO9/gsdMhCXpA/gDeboBHiQMrKP6RXKiOdJZbHPpEkIJVIcfu/fTfBG4EvH5tBEbyrBw==", - "dev": true, - "dependencies": { - "@nx/jest": "18.3.5" - } - }, - "node_modules/@nrwl/js": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-18.3.5.tgz", - "integrity": "sha512-Eoxkx60L/uuX33ll341PRfNMhrkO7KySCaLCLP8XWe0AZu3k1qNGyb0iTh6bsxn+5n1Zd2tkRkZ3RUYyPwyrbQ==", - "dev": true, - "dependencies": { - "@nx/js": "18.3.5" - } - }, - "node_modules/@nrwl/nx-plugin": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/nx-plugin/-/nx-plugin-18.3.5.tgz", - "integrity": "sha512-hQJi/3YAGr2DoxmIoHLrTL0eQJNHUb+AT4+qGdljvR1htA0/sCvsvZ1/GTDcYmVQHYPh6S5RiJVH+o5CGKl3JA==", - "dev": true, - "dependencies": { - "@nx/plugin": "18.3.5" - } - }, - "node_modules/@nrwl/react": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/react/-/react-18.3.5.tgz", - "integrity": "sha512-pheEHhKihcc2b99HP/0kBC+KYtcrfKElCMMb6HOtY98vZ2vln3ab0pFOBS3Y0Kjbyd8Z1cLEUUIzSxYzCz0fdw==", - "dev": true, - "dependencies": { - "@nx/react": "18.3.5" - } - }, - "node_modules/@nrwl/tao": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-18.3.5.tgz", - "integrity": "sha512-gB7Vxa6FReZZEGva03Eh+84W8BSZOjsNyXboglOINu6d8iZZ0eotSXGziKgjpkj3feZ1ofKZMs0PRObVAOROVw==", - "dependencies": { - "nx": "18.3.5", - "tslib": "^2.3.0" - }, - "bin": { - "tao": "index.js" - } - }, - "node_modules/@nrwl/vite": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/vite/-/vite-18.3.5.tgz", - "integrity": "sha512-kzJ7xFqt9ji6jae4plmgozFrBnFoX8fnF4vWUVJ7NdoYEH/RbsIuPCsjH3Mf5XHY9wSluYycd+6LYGyl+efV2g==", - "dev": true, - "dependencies": { - "@nx/vite": "18.3.5" - } - }, - "node_modules/@nrwl/web": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/web/-/web-18.3.5.tgz", - "integrity": "sha512-KPKnFRv2EqrcKglyAjVCWgjhjYJTfbhXJzLsSceBHbAJniyrEE20oRqzYZJOftGoAghNZbJdVpB7Xwdl11ZKiQ==", - "dev": true, - "dependencies": { - "@nx/web": "18.3.5" - } - }, - "node_modules/@nrwl/workspace": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-18.3.5.tgz", - "integrity": "sha512-2njrwfPT6AYgGdCNeZl/s4i6Sodq0z2YBtjyWtIi+2NTznK4pyHo9E4yL+NygGyJ0vVAToKURvYYQCtPHax0pw==", - "dev": true, - "dependencies": { - "@nx/workspace": "18.3.5" - } - }, - "node_modules/@nx/devkit": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-18.3.5.tgz", - "integrity": "sha512-9I0L17t0MN87fL4m4MjDiBxJIx7h5RQY/pTYtt5TBjye0ANb165JeE4oh3ibzfjMzXv42Aej2Gm+cOuSPwzT9g==", - "dependencies": { - "@nrwl/devkit": "18.3.5", - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": ">= 16 <= 19" + "node": ">=10" } }, - "node_modules/@nx/esbuild": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/esbuild/-/esbuild-18.3.5.tgz", - "integrity": "sha512-xW9w8qwPJUMA+nNzIE6LkgXBjtJa15VrMNZk1V8R1V72eoehyzCPgr7sfV1Fk5uQulL0N8E6+z/dPWBxv1u6rQ==", + "node_modules/@module-federation/dts-plugin": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.6.16.tgz", + "integrity": "sha512-XM6+EYVrS2Q/ZW0u9cH0sJT5t5SQHRjzmW7JWdPv0+wKGCA15WtRMc55boM4Wan7jXJZf+JeD5QLXWiSjaJdnw==", "dev": true, "dependencies": { - "@nrwl/esbuild": "18.3.5", - "@nx/devkit": "18.3.5", - "@nx/js": "18.3.5", - "chalk": "^4.1.0", - "fast-glob": "3.2.7", - "fs-extra": "^11.1.0", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0" + "@module-federation/error-codes": "0.6.14", + "@module-federation/managers": "0.6.16", + "@module-federation/sdk": "0.6.16", + "@module-federation/third-party-dts-extractor": "0.6.16", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.7.4", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "2.15.3", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" }, "peerDependencies": { - "esbuild": "~0.19.2" + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" }, "peerDependenciesMeta": { - "esbuild": { + "vue-tsc": { "optional": true } } }, - "node_modules/@nx/esbuild/node_modules/ansi-styles": { + "node_modules/@module-federation/dts-plugin/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -4238,23 +4197,20 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/esbuild/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@module-federation/dts-plugin/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/@nx/esbuild/node_modules/color-convert": { + "node_modules/@module-federation/dts-plugin/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -4266,13 +4222,28 @@ "node": ">=7.0.0" } }, - "node_modules/@nx/esbuild/node_modules/color-name": { + "node_modules/@module-federation/dts-plugin/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@nx/esbuild/node_modules/has-flag": { + "node_modules/@module-federation/dts-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@module-federation/dts-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -4281,7 +4252,7 @@ "node": ">=8" } }, - "node_modules/@nx/esbuild/node_modules/supports-color": { + "node_modules/@module-federation/dts-plugin/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -4293,153 +4264,86 @@ "node": ">=8" } }, - "node_modules/@nx/eslint": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-18.3.5.tgz", - "integrity": "sha512-QLT6nEi7nLMLtKSmpWMCpE3SaRfFYqCcovOzhQpXPcjSUdL2q/zajO7zKE7OlFUkqulUMV+zYre1aK2MrQWzJQ==", + "node_modules/@module-federation/enhanced": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.6.16.tgz", + "integrity": "sha512-5MqA35WGvPmCScT/xNnheR4RBa2oYHkLpeVjOA0xg0PeUTC7aSfGRLsntzFeyzLITSjbVTupK2YwmjiZr3Z0LQ==", "dev": true, "dependencies": { - "@nx/devkit": "18.3.5", - "@nx/js": "18.3.5", - "@nx/linter": "18.3.5", - "eslint": "^8.0.0", - "tslib": "^2.3.0", - "typescript": "~5.4.2" + "@module-federation/bridge-react-webpack-plugin": "0.6.16", + "@module-federation/data-prefetch": "0.6.16", + "@module-federation/dts-plugin": "0.6.16", + "@module-federation/managers": "0.6.16", + "@module-federation/manifest": "0.6.16", + "@module-federation/rspack": "0.6.16", + "@module-federation/runtime-tools": "0.6.16", + "@module-federation/sdk": "0.6.16", + "btoa": "^1.2.1", + "upath": "2.0.1" }, "peerDependencies": { - "js-yaml": "4.1.0" + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "js-yaml": { + "typescript": { "optional": true - } - } - }, - "node_modules/@nx/eslint-plugin": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-18.3.5.tgz", - "integrity": "sha512-34UymkcA9RzmLsOUe0w8R4NF975NfXKR88/LFDtbMfhUzn23P6P8tIO/WfT305Qh2Ubaz6VWLR/XiGWV3y37QQ==", - "dev": true, - "dependencies": { - "@nrwl/eslint-plugin-nx": "18.3.5", - "@nx/devkit": "18.3.5", - "@nx/js": "18.3.5", - "@typescript-eslint/type-utils": "^7.3.0", - "@typescript-eslint/utils": "^7.3.0", - "chalk": "^4.1.0", - "confusing-browser-globals": "^1.0.9", - "jsonc-eslint-parser": "^2.1.0", - "semver": "^7.5.3", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.13.2 || ^7.0.0", - "eslint-config-prettier": "^9.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { + }, + "vue-tsc": { + "optional": true + }, + "webpack": { "optional": true } } }, - "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "node_modules/@module-federation/error-codes": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.6.14.tgz", + "integrity": "sha512-ik+ezloFkxmE5atqTUG9lRr9xV5EcKDjH+MZba2IJQT5cZIM6o2ThTC45E013N4SCleaGxBtIGoPLZJzT4xa0Q==", + "dev": true }, - "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "node_modules/@module-federation/managers": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.6.16.tgz", + "integrity": "sha512-9oqJT0F61GhaFE4EFgJjVyQlD8ohXxMJBS9UGCKC6nHd3+PI4NBWGN2D+alBOwvwtt3LhtssbVH8H8HZEM1GnQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@module-federation/sdk": "0.6.16", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" } }, - "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "node_modules/@module-federation/managers/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" + "node": ">=10" } }, - "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "node_modules/@module-federation/manifest": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.6.16.tgz", + "integrity": "sha512-YjOk+1uR6E5qIEWiy35IrMyEy+rDGI5nJd+6MQobkXG40DK94mdPxJ7TSCozj/bpZ9SadCxXRCkMiE/gTkryAQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@module-federation/dts-plugin": "0.6.16", + "@module-federation/managers": "0.6.16", + "@module-federation/sdk": "0.6.16", + "chalk": "3.0.0", + "find-pkg": "2.0.0" } }, - "node_modules/@nx/eslint-plugin/node_modules/ansi-styles": { + "node_modules/@module-federation/manifest/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -4454,23 +4358,20 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/eslint-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@module-federation/manifest/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/@nx/eslint-plugin/node_modules/color-convert": { + "node_modules/@module-federation/manifest/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -4482,13 +4383,13 @@ "node": ">=7.0.0" } }, - "node_modules/@nx/eslint-plugin/node_modules/color-name": { + "node_modules/@module-federation/manifest/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@nx/eslint-plugin/node_modules/has-flag": { + "node_modules/@module-federation/manifest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -4497,22 +4398,7 @@ "node": ">=8" } }, - "node_modules/@nx/eslint-plugin/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/supports-color": { + "node_modules/@module-federation/manifest/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -4524,223 +4410,285 @@ "node": ">=8" } }, - "node_modules/@nx/jest": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-18.3.5.tgz", - "integrity": "sha512-gWVTpSih3w258oYJGu1ELRoiRWleM1cke8OpB5mXjbtHszY0j7lK7gyTFg6rbuXSBB3dLlcgNLdY/vrvx5pzOQ==", + "node_modules/@module-federation/rspack": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.6.16.tgz", + "integrity": "sha512-9nQAyw7QvgXJYPTQseyQ31qQtSlo0VsppQOyFLstLITzgWWugN7cN8cGAriUKYBI78THuX+lp1mdgsNTBvxJPA==", "dev": true, "dependencies": { - "@jest/reporters": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@nrwl/jest": "18.3.5", - "@nx/devkit": "18.3.5", - "@nx/js": "18.3.5", - "@phenomnomnominal/tsquery": "~5.0.1", - "chalk": "^4.1.0", - "identity-obj-proxy": "3.0.0", - "jest-config": "^29.4.1", - "jest-resolve": "^29.4.1", - "jest-util": "^29.4.1", - "minimatch": "9.0.3", - "resolve.exports": "1.1.0", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "@module-federation/bridge-react-webpack-plugin": "0.6.16", + "@module-federation/dts-plugin": "0.6.16", + "@module-federation/managers": "0.6.16", + "@module-federation/manifest": "0.6.16", + "@module-federation/runtime-tools": "0.6.16", + "@module-federation/sdk": "0.6.16" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } } }, - "node_modules/@nx/jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@module-federation/runtime": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.6.16.tgz", + "integrity": "sha512-3oFDRkolGwiXuQz+wzX3YzBWI9so0+K05YRf0TEdJguj3W/v/AMrBCz7W4c4O/wSK45Kuqd4lHKhCyKWRPyhOw==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@module-federation/error-codes": "0.6.14", + "@module-federation/sdk": "0.6.16" } }, - "node_modules/@nx/jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@module-federation/runtime-tools": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.6.16.tgz", + "integrity": "sha512-AIaxnx99tVYppYCgdJQz43mrGZ2pPJtC7YEIjuQV+UnSORj+d/GOIqF88MDx3i7siFcQ4zrT5BVtEWhXcJdv0g==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@module-federation/runtime": "0.6.16", + "@module-federation/webpack-bundler-runtime": "0.6.16" } }, - "node_modules/@nx/jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@module-federation/sdk": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.6.16.tgz", + "integrity": "sha512-rzQH/v9bVc032lzV4j1IGYRc5gszwzBevYBBDJf3oNLwkY2kIDUJ99OWvq3aaPJoE0jEWPVe3K5iNc+dZe4tMQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "isomorphic-rslog": "0.0.5" } }, - "node_modules/@nx/jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@nx/jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.6.16.tgz", + "integrity": "sha512-F4W8QBlPLNY22TGjUWA+FyFYN6wVgGKhefd170A8BOqv2gB1yhm6OIEmDnO6TwfDfQQebVCcAu23AzLzgS5eCg==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" } }, - "node_modules/@nx/jest/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@module-federation/third-party-dts-extractor/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, - "node_modules/@nx/jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.6.16", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.6.16.tgz", + "integrity": "sha512-Tpi251DApEaQ62KCaJCh1RU1SZTUcVh8lx2zotn/YOMZdw83IzYu3PYYA1V0Eg5jVe6I2GmGH52pJPCtwbgjqA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@module-federation/runtime": "0.6.16", + "@module-federation/sdk": "0.6.16" + } + }, + "node_modules/@mole-inc/bin-wrapper": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@mole-inc/bin-wrapper/-/bin-wrapper-8.0.1.tgz", + "integrity": "sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==", + "dev": true, + "dependencies": { + "bin-check": "^4.1.0", + "bin-version-check": "^5.0.0", + "content-disposition": "^0.5.4", + "ext-name": "^5.0.0", + "file-type": "^17.1.6", + "filenamify": "^5.0.2", + "got": "^11.8.5", + "os-filter-obj": "^2.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/@nx/js": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-18.3.5.tgz", - "integrity": "sha512-fewtQXzDPZh+CcS2sfbSBgdx5tOXU/NbdUEwC8ZVlDZmuqIXW68Vh7mIgO7wJAY4Do3NHlL0ybz/Au0CNZE27g==", - "dev": true, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nrwl/js": "18.3.5", - "@nx/devkit": "18.3.5", - "@nx/workspace": "18.3.5", - "@phenomnomnominal/tsquery": "~5.0.1", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "fast-glob": "3.2.7", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "minimatch": "9.0.3", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "ts-node": "10.9.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "verdaccio": "^5.0.4" - }, - "peerDependenciesMeta": { - "verdaccio": { - "optional": true - } + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" } }, - "node_modules/@nx/js/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@nodelib/fs.scandir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-3.0.0.tgz", + "integrity": "sha512-ktI9+PxfHYtKjF3cLTUAh2N+b8MijCRPNwKJNqTVdL0gB0QxLU2rIRaZ1t71oEa3YBDE6bukH1sR0+CDnpp/Mg==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@nodelib/fs.stat": "3.0.0", + "run-parallel": "^1.2.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=16.14.0" } }, - "node_modules/@nx/js/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@nodelib/fs.stat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-3.0.0.tgz", + "integrity": "sha512-2tQOI38s19P9i7X/Drt0v8iMA+KMsgdhB/dyPER+e+2Y8L1Z7QvnuRdW/uLuf5YRFUYmnj4bMA6qCuZHFI1GDQ==", + "dev": true, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-2.0.0.tgz", + "integrity": "sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@nodelib/fs.scandir": "3.0.0", + "fastq": "^1.15.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=16.14.0" } }, - "node_modules/@nx/js/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", "dev": true, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@nrwl/devkit": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.8.13.tgz", + "integrity": "sha512-M7QhASAczxZWgVbHPdG5XLJ3Xg/frNNC3Op5BxThe3L4dBblFWpAAAgqxhwVLxbkgxdsfp+HDFnFzHRfAp1DCQ==", "dependencies": { - "color-name": "~1.1.4" + "@nx/devkit": "19.8.13" + } + }, + "node_modules/@nrwl/eslint-plugin-nx": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-19.8.13.tgz", + "integrity": "sha512-U9iDSGN0dkJq/vM1jCTrZk/n68wGoyzo9rWpdBCJd33IIE6PofiEoqVls6u9t586PI38jWDE1/agCbFCPEYDvw==", + "dev": true, + "dependencies": { + "@nx/eslint-plugin": "19.8.13" + } + }, + "node_modules/@nrwl/jest": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-19.8.13.tgz", + "integrity": "sha512-JDi0WFhhyRA8PQv3p0Dz0ASetAzIR8SL4v4ho2Q3zZxGuCz7wqmWopSvKorJYKUWQ/YYUlGG+3TTl2pVZ4K15A==", + "dev": true, + "dependencies": { + "@nx/jest": "19.8.13" + } + }, + "node_modules/@nrwl/js": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-19.8.13.tgz", + "integrity": "sha512-K7siaowQaE1glvdEdeV0pz2l9GPEKhBwgRopMBARq4xCd/rd8aq7Bi9srx6yt4aVsuzRkSY2GdiFf3p4TtzVIg==", + "dev": true, + "dependencies": { + "@nx/js": "19.8.13" + } + }, + "node_modules/@nrwl/nx-plugin": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nrwl/nx-plugin/-/nx-plugin-19.8.13.tgz", + "integrity": "sha512-9bTJe5FbtZt98MZPwQXFpQsyoOFBLdh17QPI/H+uaiA9ZB7fbRaTiFUF4iS7zC6C/fMJY3uIRXNv+JFiU16nNw==", + "dev": true, + "dependencies": { + "@nx/plugin": "19.8.13" + } + }, + "node_modules/@nrwl/react": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nrwl/react/-/react-19.8.13.tgz", + "integrity": "sha512-UZkePxApI8AxXaZ+jbu8F+vcTDsegrLRMLAqKWTaUwh67gl5i50iRL7Woi1+vd6gl0kKhowUDlKIDOG5rXn6kQ==", + "dev": true, + "dependencies": { + "@nx/react": "19.8.13" + } + }, + "node_modules/@nrwl/tao": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.8.13.tgz", + "integrity": "sha512-IhVvo6GMyR1AjDETZxEL29ox75ARiXx8ao5tBxZKgQgGM1vpkkkYQkKJEP6jFYPBKYA7rEYnSkXi1tBrhwBbGQ==", + "dependencies": { + "nx": "19.8.13", + "tslib": "^2.3.0" }, - "engines": { - "node": ">=7.0.0" + "bin": { + "tao": "index.js" } }, - "node_modules/@nx/js/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@nrwl/vite": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nrwl/vite/-/vite-19.8.13.tgz", + "integrity": "sha512-CYpgEJ0Nk9IU+Byzr5LzqpuWR9tGazDxUQfPDv631EHJ01KK0bpOXcU9vuzHOrLyUOuNP7x9O1WOVjNXt9crqg==", + "dev": true, + "dependencies": { + "@nx/vite": "19.8.13" + } }, - "node_modules/@nx/js/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@nrwl/web": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nrwl/web/-/web-19.8.13.tgz", + "integrity": "sha512-q4tbWyTzJq/SkXizzXs7S/0tVa2P8dP4BiCTYlxbim6l6zNiZlHI8p03q6uBUjjS7nCsdeyAj8HwhLlYARCHFw==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "@nx/web": "19.8.13" } }, - "node_modules/@nx/js/node_modules/minimatch": { + "node_modules/@nrwl/workspace": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-19.8.13.tgz", + "integrity": "sha512-NT9bnVx4GR1H7NyO7b043G2PeEa+9LKrZvjpHCop1nxuOeFiFv48Y/o6Msl2oFDFF4/sAo5XcqgEv6PE2EoncA==", + "dev": true, + "dependencies": { + "@nx/workspace": "19.8.13" + } + }, + "node_modules/@nx/devkit": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.8.13.tgz", + "integrity": "sha512-CoLDFhKGHmark+ZHBXauZLcFynA0JFg5e2+SPNWBZgmsba/KY2ffd7V6P7IGbG8sGgZLZtZliiaRpHVk7cge9g==", + "dependencies": { + "@nrwl/devkit": "19.8.13", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 19 <= 21" + } + }, + "node_modules/@nx/devkit/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4751,213 +4699,178 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@nx/js/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@nx/eslint": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-19.8.13.tgz", + "integrity": "sha512-t0iI921sw1wHhrIitDMLYhMD+RjRSQtdJc1ksbdXDSdUW1TpZ3q1KMHg3vJLKZFNHQAsxR4/Iqwj1WwqaF5Dfw==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@nx/devkit": "19.8.13", + "@nx/js": "19.8.13", + "@nx/linter": "19.8.13", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "typescript": "~5.4.2" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } } }, - "node_modules/@nx/linter": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/linter/-/linter-18.3.5.tgz", - "integrity": "sha512-jCnJdLXvcmXdmw4gyHOETz6Kzwb5EHnnDpTSDW4zvzo7Fpf/Qnf+4AZRd7Uxcdt4Wbo5Yc/QuXUUIMnaNoi6UQ==", + "node_modules/@nx/eslint-plugin": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-19.8.13.tgz", + "integrity": "sha512-VzsfySQ4nIXSOERNdAKFbSllDI8x8RdDDxcqG6WTpQrkb4fzg2yWZqkyeIluurdiciP4658+czH7LNHGZMuWHw==", "dev": true, "dependencies": { - "@nx/eslint": "18.3.5" - } - }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.10.0.tgz", - "integrity": "sha512-YF+MIpeuwFkyvM5OwgY/rTNRpgVAI/YiR0yTYCZR+X3AAvP775IVlusNgQ3oedTBRUzyRnI4Tknj1WniENFsvQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "@eslint/compat": "^1.1.1", + "@nrwl/eslint-plugin-nx": "19.8.13", + "@nx/devkit": "19.8.13", + "@nx/js": "19.8.13", + "@typescript-eslint/type-utils": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0", + "chalk": "^4.1.0", + "confusing-browser-globals": "^1.0.9", + "globals": "^15.9.0", + "jsonc-eslint-parser": "^2.1.0", + "semver": "^7.5.3", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.13.2 || ^7.0.0 || ^8.0.0", + "eslint-config-prettier": "^9.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/@nx/nx-darwin-x64": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.10.0.tgz", - "integrity": "sha512-ypi6YxwXgb0kg2ixKXE3pwf5myVNUgWf1CsV5OzVccCM8NzheMO51KDXTDmEpXdzUsfT0AkO1sk5GZeCjhVONg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@nx/eslint-plugin/node_modules/@eslint/compat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.3.tgz", + "integrity": "sha512-wlZhwlDFxkxIZ571aH0FoK4h4Vwx7P3HJx62Gp8hTc10bfpwT2x0nULuAHmQSJBOWPgPeVf+9YtnD4j50zVHmA==", + "dev": true, "engines": { - "node": ">= 10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.10.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/@nx/nx-freebsd-x64": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.3.5.tgz", - "integrity": "sha512-8tA8Yw0Iir4liFjffIFS5THTS3TtWY/No2tkVj91gwy/QQ/otvKbOyc5RCIPpbZU6GS3ZWfG92VyCSm06dtMFg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz", + "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0" + }, "engines": { - "node": ">= 10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.3.5.tgz", - "integrity": "sha512-BrPGAHM9FCGkB9/hbvlJhe+qtjmvpjIjYixGIlUxL3gGc8E/ucTyCnz5pRFFPFQlBM7Z/9XmbHvGPoUi/LYn5A==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", + "dev": true, "engines": { - "node": ">= 10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.3.5.tgz", - "integrity": "sha512-/Xd0Q3LBgJeigJqXC/Jck/9l5b+fK+FCM0nRFMXgPXrhZPhoxWouFkoYl2F1Ofr+AQf4jup4DkVTB5r98uxSCA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.3.5.tgz", - "integrity": "sha512-r18qd7pUrl1haAZ/e9Q+xaFTsLJnxGARQcf/Y76q+K2psKmiUXoRlqd3HAOw43KTllaUJ5HkzLq2pIwg3p+xBw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "16.7.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.7.4.tgz", - "integrity": "sha512-4B58C/pXeuovSznBOeicsxNieBApbGMoi2du8jR6Is1gYFPv4l8fFHQHHGAa1l5XJC5JuGJqFywS4elInWprNw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.3.5.tgz", - "integrity": "sha512-6np86lcYy3+x6kkW/HrBHIdNWbUu/MIsvMuNH5UXgyFs60l5Z7Cocay2f7WOaAbTLVAr0W7p4RxRPamHLRwWFA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.3.5.tgz", - "integrity": "sha512-H3p2ZVhHV1WQWTICrQUTplOkNId0y3c23X3A2fXXFDbWSBs0UgW7m55LhMcA9p0XZ7wDHgh+yFtVgu55TXLjug==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.3.5.tgz", - "integrity": "sha512-xFwKVTIXSgjdfxkpriqHv5NpmmFILTrWLEkUGSoimuRaAm1u15YWx/VmaUQ+UWuJnmgqvB/so4SMHSfNkq3ijA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz", + "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, "engines": { - "node": ">= 10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@nx/plugin": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/plugin/-/plugin-18.3.5.tgz", - "integrity": "sha512-7kbQMLpfWTy/kjgV4O6wsEfu7a/5biWSlQ/CRsICFQ/PwaYAs/QF8UTdEN6gPhQDUsQMdLdO8JCB/W4bMPAEEA==", + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.15.0.tgz", + "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==", "dev": true, "dependencies": { - "@nrwl/nx-plugin": "18.3.5", - "@nx/devkit": "18.3.5", - "@nx/eslint": "18.3.5", - "@nx/jest": "18.3.5", - "@nx/js": "18.3.5", - "@phenomnomnominal/tsquery": "~5.0.1", - "fs-extra": "^11.1.0", - "tslib": "^2.3.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@nx/react": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/react/-/react-18.3.5.tgz", - "integrity": "sha512-QqTRxtbLlA9NjZx7G122kymxI500WAdyWDJGc0opB2J6UcFasNLsM+NfNePlOixrKM2QyiKWt5C1XSK9eWU3OA==", + "node_modules/@nx/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", "dev": true, "dependencies": { - "@nrwl/react": "18.3.5", - "@nx/devkit": "18.3.5", - "@nx/eslint": "18.3.5", - "@nx/js": "18.3.5", - "@nx/web": "18.3.5", - "@phenomnomnominal/tsquery": "~5.0.1", - "@svgr/webpack": "^8.0.1", - "chalk": "^4.1.0", - "file-loader": "^6.2.0", - "minimatch": "9.0.3", - "tslib": "^2.3.0" + "@typescript-eslint/types": "8.15.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@nx/react/node_modules/ansi-styles": { + "node_modules/@nx/eslint-plugin/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -4972,7 +4885,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/react/node_modules/chalk": { + "node_modules/@nx/eslint-plugin/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -4988,7 +4901,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@nx/react/node_modules/color-convert": { + "node_modules/@nx/eslint-plugin/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -5000,13 +4913,25 @@ "node": ">=7.0.0" } }, - "node_modules/@nx/react/node_modules/color-name": { + "node_modules/@nx/eslint-plugin/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@nx/react/node_modules/has-flag": { + "node_modules/@nx/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -5015,10 +4940,10 @@ "node": ">=8" } }, - "node_modules/@nx/react/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@nx/eslint-plugin/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -5030,7 +4955,7 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@nx/react/node_modules/supports-color": { + "node_modules/@nx/eslint-plugin/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -5042,41 +4967,44 @@ "node": ">=8" } }, - "node_modules/@nx/vite": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/vite/-/vite-18.3.5.tgz", - "integrity": "sha512-EJbCrvlFy0I4SVEfAyAm/wMe0sRgqKs8Q8nn9nZmZrh8hwOI6WBb9Md0t5Ubbrd8v3PbWb6kTMPWdzrOmKaMOA==", + "node_modules/@nx/eslint/node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, - "dependencies": { - "@nrwl/vite": "18.3.5", - "@nx/devkit": "18.3.5", - "@nx/js": "18.3.5", - "@phenomnomnominal/tsquery": "~5.0.1", - "@swc/helpers": "~0.5.0", - "enquirer": "~2.3.6", - "tsconfig-paths": "^4.1.2" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "peerDependencies": { - "vite": "^5.0.0", - "vitest": "^1.3.1" + "engines": { + "node": ">=14.17" } }, - "node_modules/@nx/web": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-18.3.5.tgz", - "integrity": "sha512-2A8pDN5H5NWsDcSMAtOXVEDZ5ltivZZoSYKLDzfIis/hVikJ8wI2rE1KgyoGNn5n0OTgyQYxH1HGUJ2C7Cj5xQ==", + "node_modules/@nx/jest": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-19.8.13.tgz", + "integrity": "sha512-LV3Ranbm79O+Hxs4KyHzmX70TELBwip7LA70ZSAMCA4h03PYuCixq3Q5CNXPJaFTDiPewx+wIl2Ntzu04E8niA==", "dev": true, "dependencies": { - "@nrwl/web": "18.3.5", - "@nx/devkit": "18.3.5", - "@nx/js": "18.3.5", + "@jest/reporters": "^29.4.1", + "@jest/test-result": "^29.4.1", + "@nrwl/jest": "19.8.13", + "@nx/devkit": "19.8.13", + "@nx/js": "19.8.13", + "@phenomnomnominal/tsquery": "~5.0.1", "chalk": "^4.1.0", - "detect-port": "^1.5.1", - "http-server": "^14.1.0", - "tslib": "^2.3.0" + "identity-obj-proxy": "3.0.0", + "jest-config": "^29.4.1", + "jest-resolve": "^29.4.1", + "jest-util": "^29.4.1", + "minimatch": "9.0.3", + "resolve.exports": "1.1.0", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" } }, - "node_modules/@nx/web/node_modules/ansi-styles": { + "node_modules/@nx/jest/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -5091,7 +5019,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/web/node_modules/chalk": { + "node_modules/@nx/jest/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -5107,7 +5035,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@nx/web/node_modules/color-convert": { + "node_modules/@nx/jest/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -5119,13 +5047,13 @@ "node": ">=7.0.0" } }, - "node_modules/@nx/web/node_modules/color-name": { + "node_modules/@nx/jest/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@nx/web/node_modules/has-flag": { + "node_modules/@nx/jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -5134,7 +5062,22 @@ "node": ">=8" } }, - "node_modules/@nx/web/node_modules/supports-color": { + "node_modules/@nx/jest/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/jest/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -5146,271 +5089,174 @@ "node": ">=8" } }, - "node_modules/@nx/workspace": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-18.3.5.tgz", - "integrity": "sha512-C5+IhzKx6AUu8N+yURkYfDdDlv0NHkxsI1yqQIgLmqOsZ/nTNLps052QOTb6zYejSp+DbzkZ0H7SGXNO3Cd0+g==", + "node_modules/@nx/js": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-19.8.13.tgz", + "integrity": "sha512-8xQRKp8dBQp/2TPn35tbzAgDk7qqBIfqy0780G4x8TmgI41Iu6oUqYe4tvZRxWnLKwFnjPCG30bTJ4Ak0w+B+A==", "dev": true, "dependencies": { - "@nrwl/workspace": "18.3.5", - "@nx/devkit": "18.3.5", + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nrwl/js": "19.8.13", + "@nx/devkit": "19.8.13", + "@nx/workspace": "19.8.13", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", "enquirer": "~2.3.6", - "nx": "18.3.5", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nx/workspace/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" + "fast-glob": "3.2.7", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "minimatch": "9.0.3", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "verdaccio": "^5.0.4" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } } }, - "node_modules/@nx/workspace/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@nx/js/node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 8" } }, - "node_modules/@nx/workspace/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@nx/workspace/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@nx/workspace/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@nx/js/node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/@nx/workspace/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@nx/js/node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/@paulirish/trace_engine": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.32.tgz", - "integrity": "sha512-KxWFdRNbv13U8bhYaQvH6gLG9CVEt2jKeosyOOYILVntWEVWhovbgDrbOiZ12pJO3vjZs0Zgbd3/Zgde98woEA==" - }, - "node_modules/@phenomnomnominal/tsquery": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", - "integrity": "sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==", + "node_modules/@nx/js/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "esquery": "^1.4.0" - }, - "peerDependencies": { - "typescript": "^3 || ^4 || ^5" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true - }, - "node_modules/@poppinss/cliui": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@poppinss/cliui/-/cliui-6.4.1.tgz", - "integrity": "sha512-tdV3QpAfrPFRLPOh98F8QxWBvwYF3ziWGGtpVqfZtFNTFkC7nQnVQlUW55UtQ7rkeMmFohxfDI+2JNWScGJ1jQ==", - "dependencies": { - "@poppinss/colors": "^4.1.3", - "cli-boxes": "^3.0.0", - "cli-table3": "^0.6.4", - "cli-truncate": "^4.0.0", - "log-update": "^6.0.0", - "pretty-hrtime": "^1.0.3", - "string-width": "^7.1.0", - "supports-color": "^9.4.0", - "terminal-size": "^4.0.0", - "wordwrap": "^1.0.0" - }, - "engines": { - "node": ">=18.16.0" - } - }, - "node_modules/@poppinss/cliui/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" - }, - "node_modules/@poppinss/cliui/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@poppinss/colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.3.tgz", - "integrity": "sha512-A0FjJ6x14donWDN3bHAFFjJaPWTwM2PgWT834+bPKVK6Xukf25CscoRqCPYI939a8yuJFX9PYWWnVbUVI0E2Cg==", + "node_modules/@nx/js/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "kleur": "^4.1.5" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=18.16.0" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.0.tgz", - "integrity": "sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==", - "dependencies": { - "debug": "^4.3.6", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.4.0", - "semver": "^7.6.3", - "tar-fs": "^3.0.6", - "unbzip2-stream": "^1.4.3", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" + "node": ">=10" }, - "engines": { - "node": ">=18" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@puppeteer/browsers/node_modules/extract-zip": { + "node_modules/@nx/js/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "node": ">=7.0.0" } }, - "node_modules/@puppeteer/browsers/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/@nx/js/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@nx/js/node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, "dependencies": { - "pump": "^3.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@push-based/nx-verdaccio": { - "version": "0.0.0-alpha.26", - "resolved": "https://registry.npmjs.org/@push-based/nx-verdaccio/-/nx-verdaccio-0.0.0-alpha.26.tgz", - "integrity": "sha512-Go11Dg+w5Ntl5Ig8YNzVVPbpOG85aVszjyBIK0FvVBX+/QllQY1F4fP8K8fYnMJnO9v5Tao3cryGFY5Zo9i+/g==", - "dev": true, - "dependencies": { - "@nx/devkit": "19.8.0", - "ansis": "^3.3.2", - "simple-git": "^3.27.0", - "tslib": "^2.3.0" } }, - "node_modules/@push-based/nx-verdaccio/node_modules/@nrwl/devkit": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.8.0.tgz", - "integrity": "sha512-LehpQ2D1687+JWaUpW84NPuXsQuPosmts66LShPT4+6KozB4gd0hJGAXNXpjNs9CUfLyNf8rRdEeqNjWnPYEmA==", + "node_modules/@nx/js/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "@nx/devkit": "19.8.0" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/@push-based/nx-verdaccio/node_modules/@nx/devkit": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.8.0.tgz", - "integrity": "sha512-nPaKHF0m2KONlt8GXjN9EhFo+NOvJnFcK6ujKFFLAyZ4TACY4F1FCjSHFTjYI82j+WukzuyjSmY9wzxYughWIQ==", + "node_modules/@nx/js/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@nrwl/devkit": "19.8.0", - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": ">= 17 <= 20" + "engines": { + "node": ">=8" } }, - "node_modules/@push-based/nx-verdaccio/node_modules/minimatch": { + "node_modules/@nx/js/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", @@ -5425,900 +5271,611 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "node_modules/@nx/js/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/linter": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/linter/-/linter-19.8.13.tgz", + "integrity": "sha512-byplBa+OTrSdqC02Ii1B4XVVWkPnP6Jk84Dn0zt7eOYbUGUhMMRjY1p9cLpSPdSaXq5h8BlR/1QzHarQAK7+8A==", + "dev": true, + "dependencies": { + "@nx/eslint": "19.8.13" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.13.tgz", + "integrity": "sha512-3kfEkIxqug7q3vsGvqtR4Nz5TYF2T02BXtuD0ML9xbGDfbksNrRp2c0xjPbnyvJtOdgmtx0wcguwUrm+S3uiHw==", "cpu": [ - "arm" + "arm64" ], - "dev": true, "optional": true, "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", - "cpu": [ - "arm64" + "darwin" ], - "dev": true, - "optional": true, - "os": [ - "android" - ] + "engines": { + "node": ">= 10" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "node_modules/@nx/nx-darwin-x64": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.13.tgz", + "integrity": "sha512-BXiegV6ZV/9ma31R1Kgh8CBglr3C96aBcssOSX6w91bUO08XfirLLMPQ8BpRc9AF/IGt3Y1gYRLOdHcibi36QQ==", "cpu": [ - "arm64" + "x64" ], - "dev": true, "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "node_modules/@nx/nx-freebsd-x64": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.13.tgz", + "integrity": "sha512-UUfMQyn59pl0gHV8iqn+dYPPlM0jC5SzTN0wsK83h5fzvi87iAAgnDlf9uwElj4Sjadg+gqAWi2foT9nxX+Tfg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", - "cpu": [ - "arm" + "freebsd" ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">= 10" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.13.tgz", + "integrity": "sha512-vXae2CHBInpWXdLrI/4HFQXoilOvUiQr7/b859V4tf6Zgg9GRIraxvTMR5TBH7xv9cPzEK9845gx46BQTiik/A==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", - "cpu": [ - "arm64" ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">= 10" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.13.tgz", + "integrity": "sha512-c86YY7oe/8jo1eOKe0x6zvLn9yERL+Pc2WnkGfvcIb48NGNfUbxuzgPss6ywCg4zNN1LCenmVvU0/NFV9b/YwQ==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", - "cpu": [ - "ppc64" ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">= 10" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.13.tgz", + "integrity": "sha512-VQSY5nhtUc6bfTAl1jYPuB0CdwppSee84wxT1QtXxmPzg/6QCat7ulesZOES6UQzXVSsIKInJH4KKWQ0mFwM+A==", "cpu": [ - "riscv64" + "arm64" ], - "dev": true, "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", - "cpu": [ - "s390x" ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">= 10" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.13.tgz", + "integrity": "sha512-w8F7yGuUOA+VDIf5K05e4tIExKEIuhPNS/qTea+iagdWnnnmqEm+EJpiXrf9L6TSMUxu2GgDI03DVuBck7oUgw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "node_modules/@nx/nx-linux-x64-musl": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.13.tgz", + "integrity": "sha512-PcZXN2acZ/KJLAnmVt1++qucOVamXXl4/tjVVhXD6X5mCRtyGBcO+JL7/pcaIRGuut50yEY/QHxWVA+n7Ii2Yg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.13.tgz", + "integrity": "sha512-WAtlfBggfW0MTbsaBhTyfnm1Iap+auAKpEusiFoSIhXp5Xqnvs+Zfdz8Ep3Ilc0BKIhyfyaWABJaU7QhRjYGKg==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", - "cpu": [ - "ia32" ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">= 10" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.13.tgz", + "integrity": "sha512-CLWmTRUYl7EtIu22d9Y9qpMdPOVPdh4BFmYpCa5Q+E0pk9Edd+EcQYMR0pgz8KDgbOBmRFGCr7CETVOAeTKzCw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" - ] - }, - "node_modules/@sentry/core": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", - "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", - "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/minimal": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" - }, + ], "engines": { - "node": ">=6" + "node": ">= 10" } }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/hub": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", - "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "node_modules/@nx/plugin": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/plugin/-/plugin-19.8.13.tgz", + "integrity": "sha512-46G4QqKO7TMiT9UXR7czcmY2mmGZ/rqHHh5pG9t8LqRu34JnWjRiI7qTUXoop81lYK+9z7kUKZSWXfbOeVGbpg==", + "dev": true, "dependencies": { - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" + "@nrwl/nx-plugin": "19.8.13", + "@nx/devkit": "19.8.13", + "@nx/eslint": "19.8.13", + "@nx/jest": "19.8.13", + "@nx/js": "19.8.13", + "tslib": "^2.3.0" } }, - "node_modules/@sentry/hub/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/minimal": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", - "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "node_modules/@nx/react": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/react/-/react-19.8.13.tgz", + "integrity": "sha512-Wb1dbsGuQdJgfwcQsu84BrqsKKjmnqBV197Lk79QvP2LztmLj7OJE1xeZagZ/bWw0bpcs1y5uwpWUNrzp5dY2g==", + "dev": true, "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" + "@module-federation/enhanced": "~0.6.0", + "@nrwl/react": "19.8.13", + "@nx/devkit": "19.8.13", + "@nx/eslint": "19.8.13", + "@nx/js": "19.8.13", + "@nx/web": "19.8.13", + "@phenomnomnominal/tsquery": "~5.0.1", + "@svgr/webpack": "^8.0.1", + "express": "^4.19.2", + "file-loader": "^6.2.0", + "http-proxy-middleware": "^3.0.0", + "minimatch": "9.0.3", + "picocolors": "^1.1.0", + "tslib": "^2.3.0" } }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/node": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz", - "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==", + "node_modules/@nx/react/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, "dependencies": { - "@sentry/core": "6.19.7", - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@sentry/node/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@nx/vite": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/vite/-/vite-19.8.13.tgz", + "integrity": "sha512-ke7xktDrPVuwjjSQ9gRgEV4Q5FVOOdJX0JKNkdhHn4e9wkpIw6WRndF7nX4Gb8Kxj/w/C40PXV3A2WzWh7OOiw==", + "dev": true, "dependencies": { - "debug": "4" + "@nrwl/vite": "19.8.13", + "@nx/devkit": "19.8.13", + "@nx/js": "19.8.13", + "@phenomnomnominal/tsquery": "~5.0.1", + "@swc/helpers": "~0.5.0", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "tsconfig-paths": "^4.1.2" }, - "engines": { - "node": ">= 6.0.0" + "peerDependencies": { + "vite": "^5.0.0", + "vitest": "^1.3.1 || ^2.0.0" } }, - "node_modules/@sentry/node/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/@nx/vite/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@sentry/node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/@nx/web": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-19.8.13.tgz", + "integrity": "sha512-JtOC0sAqauvaE14yFG9fUE+80etYTqg66/Hldl3H9jKxBmc2i3acrBZe2SyZUkaeJvw/8EQJaX1SMmr+rlilGg==", + "dev": true, + "dependencies": { + "@nrwl/web": "19.8.13", + "@nx/devkit": "19.8.13", + "@nx/js": "19.8.13", + "detect-port": "^1.5.1", + "http-server": "^14.1.0", + "picocolors": "^1.1.0", + "tslib": "^2.3.0" + } }, - "node_modules/@sentry/types": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", - "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", - "engines": { - "node": ">=6" + "node_modules/@nx/workspace": { + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-19.8.13.tgz", + "integrity": "sha512-sC6z7hDwFy8+g9EWOVgPlczqHkctQn/QVrwOtaxqGRfzAOvNoKE3qC24Lgk39vYZEnMERtR4D/4hYnb4KWicFw==", + "dev": true, + "dependencies": { + "@nrwl/workspace": "19.8.13", + "@nx/devkit": "19.8.13", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "19.8.13", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" } }, - "node_modules/@sentry/utils": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", - "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "node_modules/@nx/workspace/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "node_modules/@nx/workspace/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "node_modules/@nx/workspace/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "type-detect": "4.0.8" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "node_modules/@nx/workspace/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@nx/workspace/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/@snyk/github-codeowners": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@snyk/github-codeowners/-/github-codeowners-1.1.0.tgz", - "integrity": "sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==", + "node_modules/@nx/workspace/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "commander": "^4.1.1", - "ignore": "^5.1.8", - "p-map": "^4.0.0" - }, - "bin": { - "github-codeowners": "dist/cli.js" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8.10" + "node": ">=8" } }, - "node_modules/@snyk/github-codeowners/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } + "node_modules/@paulirish/trace_engine": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.32.tgz", + "integrity": "sha512-KxWFdRNbv13U8bhYaQvH6gLG9CVEt2jKeosyOOYILVntWEVWhovbgDrbOiZ12pJO3vjZs0Zgbd3/Zgde98woEA==" }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "node_modules/@phenomnomnominal/tsquery": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", + "integrity": "sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==", "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "dependencies": { + "esquery": "^1.4.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "typescript": "^3 || ^4 || ^5" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "dev": true, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, "engines": { "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "dev": true + }, + "node_modules/@poppinss/cliui": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@poppinss/cliui/-/cliui-6.4.1.tgz", + "integrity": "sha512-tdV3QpAfrPFRLPOh98F8QxWBvwYF3ziWGGtpVqfZtFNTFkC7nQnVQlUW55UtQ7rkeMmFohxfDI+2JNWScGJ1jQ==", + "dependencies": { + "@poppinss/colors": "^4.1.3", + "cli-boxes": "^3.0.0", + "cli-table3": "^0.6.4", + "cli-truncate": "^4.0.0", + "log-update": "^6.0.0", + "pretty-hrtime": "^1.0.3", + "string-width": "^7.1.0", + "supports-color": "^9.4.0", + "terminal-size": "^4.0.0", + "wordwrap": "^1.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.16.0" } }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "dev": true, + "node_modules/@poppinss/cliui/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + }, + "node_modules/@poppinss/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node_modules/@poppinss/colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.3.tgz", + "integrity": "sha512-A0FjJ6x14donWDN3bHAFFjJaPWTwM2PgWT834+bPKVK6Xukf25CscoRqCPYI939a8yuJFX9PYWWnVbUVI0E2Cg==", + "dependencies": { + "kleur": "^4.1.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.16.0" } }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "dev": true, - "engines": { - "node": ">=14" + "node_modules/@puppeteer/browsers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", + "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", + "dependencies": { + "debug": "^4.3.5", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "bin": { + "browsers": "lib/cjs/main-cli.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18" } }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "dev": true, + "node_modules/@puppeteer/browsers/node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" + "bin": { + "extract-zip": "cli.js" }, "engines": { - "node": ">=14" + "node": ">= 10.17.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, + "node_modules/@puppeteer/browsers/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "pump": "^3.0.0" }, "engines": { - "node": ">=14" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "node_modules/@push-based/nx-verdaccio": { + "version": "0.0.0-alpha.26", + "resolved": "https://registry.npmjs.org/@push-based/nx-verdaccio/-/nx-verdaccio-0.0.0-alpha.26.tgz", + "integrity": "sha512-Go11Dg+w5Ntl5Ig8YNzVVPbpOG85aVszjyBIK0FvVBX+/QllQY1F4fP8K8fYnMJnO9v5Tao3cryGFY5Zo9i+/g==", "dev": true, "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "@nx/devkit": "19.8.0", + "ansis": "^3.3.2", + "simple-git": "^3.27.0", + "tslib": "^2.3.0" } }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "node_modules/@push-based/nx-verdaccio/node_modules/@nrwl/devkit": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.8.0.tgz", + "integrity": "sha512-LehpQ2D1687+JWaUpW84NPuXsQuPosmts66LShPT4+6KozB4gd0hJGAXNXpjNs9CUfLyNf8rRdEeqNjWnPYEmA==", "dev": true, "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" + "@nx/devkit": "19.8.0" } }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "node_modules/@push-based/nx-verdaccio/node_modules/@nx/devkit": { + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.8.0.tgz", + "integrity": "sha512-nPaKHF0m2KONlt8GXjN9EhFo+NOvJnFcK6ujKFFLAyZ4TACY4F1FCjSHFTjYI82j+WukzuyjSmY9wzxYughWIQ==", "dev": true, "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "@nrwl/devkit": "19.8.0", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" }, "peerDependencies": { - "@svgr/core": "*" + "nx": ">= 17 <= 20" } }, - "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "node_modules/@push-based/nx-verdaccio/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=14" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", + "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@swc-node/core": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.13.3.tgz", - "integrity": "sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", + "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", + "cpu": [ + "arm64" + ], "dev": true, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@swc/core": ">= 1.4.13", - "@swc/types": ">= 0.1" - } - }, - "node_modules/@swc-node/register": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.8.0.tgz", - "integrity": "sha512-8K3589HoBSmVmrEVrtr4K5sWEithpGDzcFGic81OW0A9sZY38IV5EGRODQWCk0SBDyLhaF+pid120vJAtsHo1A==", - "dev": true, - "dependencies": { - "@swc-node/core": "^1.12.0", - "@swc-node/sourcemap-support": "^0.4.0", - "colorette": "^2.0.20", - "debug": "^4.3.4", - "pirates": "^4.0.6", - "tslib": "^2.6.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@swc/core": ">= 1.3", - "typescript": ">= 4.3" - } - }, - "node_modules/@swc-node/sourcemap-support": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.4.0.tgz", - "integrity": "sha512-weuRmYTO+4yOtHtPZHXlPdA1dJJJp3QOoZAFZ6uZidu992F2X5v1fQdnb26xs1o3Ex/e2sYhRyY5R6NGNuoATQ==", - "dev": true, - "dependencies": { - "source-map-support": "^0.5.21", - "tslib": "^2.6.2" - } - }, - "node_modules/@swc-node/sourcemap-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@swc-node/sourcemap-support/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@swc/cli": { - "version": "0.1.65", - "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.65.tgz", - "integrity": "sha512-4NcgsvJVHhA7trDnMmkGLLvWMHu2kSy+qHx6QwRhhJhdiYdNUrhdp+ERxen73sYtaeEOYeLJcWrQ60nzKi6rpg==", - "dev": true, - "dependencies": { - "@mole-inc/bin-wrapper": "^8.0.1", - "commander": "^7.1.0", - "fast-glob": "^3.2.5", - "minimatch": "^9.0.3", - "semver": "^7.3.8", - "slash": "3.0.0", - "source-map": "^0.7.3" - }, - "bin": { - "spack": "bin/spack.js", - "swc": "bin/swc.js", - "swcx": "bin/swcx.js" - }, - "engines": { - "node": ">= 12.13" - }, - "peerDependencies": { - "@swc/core": "^1.2.66", - "chokidar": "^3.5.1" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@swc/cli/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@swc/core": { - "version": "1.7.39", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.39.tgz", - "integrity": "sha512-jns6VFeOT49uoTKLWIEfiQqJAlyqldNAt80kAr8f7a5YjX0zgnG3RBiLMpksx4Ka4SlK4O6TJ/lumIM3Trp82g==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.13" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.39", - "@swc/core-darwin-x64": "1.7.39", - "@swc/core-linux-arm-gnueabihf": "1.7.39", - "@swc/core-linux-arm64-gnu": "1.7.39", - "@swc/core-linux-arm64-musl": "1.7.39", - "@swc/core-linux-x64-gnu": "1.7.39", - "@swc/core-linux-x64-musl": "1.7.39", - "@swc/core-win32-arm64-msvc": "1.7.39", - "@swc/core-win32-ia32-msvc": "1.7.39", - "@swc/core-win32-x64-msvc": "1.7.39" - }, - "peerDependencies": { - "@swc/helpers": "*" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.7.39", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.39.tgz", - "integrity": "sha512-o2nbEL6scMBMCTvY9OnbyVXtepLuNbdblV9oNJEFia5v5eGj9WMrnRQiylH3Wp/G2NYkW7V1/ZVW+kfvIeYe9A==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz", + "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">=10" - } + ] }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.7.39", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.39.tgz", - "integrity": "sha512-qMlv3XPgtPi/Fe11VhiPDHSLiYYk2dFYl747oGsHZPq+6tIdDQjIhijXPcsUHIXYDyG7lNpODPL8cP/X1sc9MA==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz", + "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">=10" - } + ] }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.39", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.39.tgz", - "integrity": "sha512-NP+JIkBs1ZKnpa3Lk2W1kBJMwHfNOxCUJXuTa2ckjFsuZ8OUu2gwdeLFkTHbR43dxGwH5UzSmuGocXeMowra/Q==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", + "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", "cpu": [ "arm" ], @@ -6326,15 +5883,25 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", + "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", + "cpu": [ + "arm" ], - "engines": { - "node": ">=10" - } + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.39", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.39.tgz", - "integrity": "sha512-cPc+/HehyHyHcvAsk3ML/9wYcpWVIWax3YBaA+ScecJpSE04l/oBHPfdqKUPslqZ+Gcw0OWnIBGJT/fBZW2ayw==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", + "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", "cpu": [ "arm64" ], @@ -6342,15 +5909,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=10" - } + ] }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.39", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.39.tgz", - "integrity": "sha512-8RxgBC6ubFem66bk9XJ0vclu3exJ6eD7x7CwDhp5AD/tulZslTYXM7oNPjEtje3xxabXuj/bEUMNvHZhQRFdqA==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", + "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", "cpu": [ "arm64" ], @@ -6358,31 +5922,63 @@ "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", + "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", + "cpu": [ + "ppc64" ], - "engines": { - "node": ">=10" - } + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", + "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.39", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.39.tgz", - "integrity": "sha512-3gtCPEJuXLQEolo9xsXtuPDocmXQx12vewEyFFSMSjOfakuPOBmOQMa0sVL8Wwius8C1eZVeD1fgk0omMqeC+Q==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", + "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", "cpu": [ - "x64" + "s390x" ], "dev": true, "optional": true, "os": [ "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz", + "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==", + "cpu": [ + "x64" ], - "engines": { - "node": ">=10" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.39", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.39.tgz", - "integrity": "sha512-mg39pW5x/eqqpZDdtjZJxrUvQNSvJF4O8wCl37fbuFUqOtXs4TxsjZ0aolt876HXxxhsQl7rS+N4KioEMSgTZw==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", + "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", "cpu": [ "x64" ], @@ -6390,15 +5986,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=10" - } + ] }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.39", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.39.tgz", - "integrity": "sha512-NZwuS0mNJowH3e9bMttr7B1fB8bW5svW/yyySigv9qmV5VcQRNz1kMlCvrCLYRsa93JnARuiaBI6FazSeG8mpA==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", + "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", "cpu": [ "arm64" ], @@ -6406,15 +5999,12 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=10" - } + ] }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.39", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.39.tgz", - "integrity": "sha512-qFmvv5UExbJPXhhvCVDBnjK5Duqxr048dlVB6ZCgGzbRxuarOlawCzzLK4N172230pzlAWGLgn9CWl3+N6zfHA==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", + "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", "cpu": [ "ia32" ], @@ -6422,3377 +6012,3158 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=10" - } + ] }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.39", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.39.tgz", - "integrity": "sha512-o+5IMqgOtj9+BEOp16atTfBgCogVak9svhBpwsbcJQp67bQbxGYhAPPDW/hZ2rpSSF7UdzbY9wudoX9G4trcuQ==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", + "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=10" - } + ] }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true }, - "node_modules/@swc/helpers": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", - "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", + "node_modules/@sentry/core": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", + "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", "dependencies": { - "tslib": "^2.4.0" + "@sentry/hub": "6.19.7", + "@sentry/minimal": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@swc/types": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.13.tgz", - "integrity": "sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==", - "dev": true, - "dependencies": { - "@swc/counter": "^0.1.3" - } + "node_modules/@sentry/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, + "node_modules/@sentry/hub": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", + "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", "dependencies": { - "defer-to-connect": "^2.0.0" + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@sentry/minimal": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", + "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", "dependencies": { - "color-convert": "^2.0.1" + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6" } }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/node": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz", + "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==", "dependencies": { - "deep-equal": "^2.0.5" + "@sentry/core": "6.19.7", + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/@sentry/node/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "debug": "4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 6.0.0" } }, - "node_modules/@testing-library/dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "node_modules/@sentry/node/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { - "color-name": "~1.1.4" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=7.0.0" + "node": ">= 6" } }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true + "node_modules/@sentry/node/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "node_modules/@sentry/types": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", + "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/@sentry/utils": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", + "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", "dependencies": { - "has-flag": "^4.0.0" + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/@testing-library/jest-dom": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.2.tgz", - "integrity": "sha512-P6GJD4yqc9jZLbe98j/EkyQDTPgqftohZF5FBkHY5BUERZmcf4HeO2k0XaefEg329ux2p21i1A1DmyQ1kKw2Jw==", + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", - "redent": "^3.0.0" - }, "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type-detect": "4.0.8" } }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@testing-library/jest-dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@snyk/github-codeowners": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@snyk/github-codeowners/-/github-codeowners-1.1.0.tgz", + "integrity": "sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "commander": "^4.1.1", + "ignore": "^5.1.8", + "p-map": "^4.0.0" + }, + "bin": { + "github-codeowners": "dist/cli.js" }, "engines": { - "node": ">=7.0.0" + "node": ">=8.10" } }, - "node_modules/@testing-library/jest-dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@testing-library/jest-dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@snyk/github-codeowners/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/@testing-library/jest-dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@testing-library/react": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", - "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^9.0.0", - "@types/react-dom": "^18.0.0" - }, "engines": { "node": ">=14" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "dev": true - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" - }, - "node_modules/@trivago/prettier-plugin-sort-imports": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz", - "integrity": "sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==", + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "dev": true, - "dependencies": { - "@babel/generator": "7.17.7", - "@babel/parser": "^7.20.5", - "@babel/traverse": "7.23.2", - "@babel/types": "7.17.0", - "javascript-natural-sort": "0.7.1", - "lodash": "^4.17.21" + "engines": { + "node": ">=14" }, - "peerDependencies": { - "@vue/compiler-sfc": "3.x", - "prettier": "2.x - 3.x" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, - "peerDependenciesMeta": { - "@vue/compiler-sfc": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "dev": true, - "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.9.tgz", - "integrity": "sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==", + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "dev": true, - "dependencies": { - "@babel/types": "^7.25.9", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, "engines": { - "node": ">=6.9.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse/node_modules/@babel/types": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", - "integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==", + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "engines": { - "node": ">=6" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/@svgr/core/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "node_modules/@svgr/core/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "dev": true, + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, "engines": { - "node": ">=10.13.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "dev": true, "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "dev": true, "dependencies": { - "@babel/types": "^7.0.0" + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } + "node_modules/@svgr/plugin-svgo/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@types/benchmark": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-2.1.5.tgz", - "integrity": "sha512-cKio2eFB3v7qmKcvIHLUMw/dIx/8bhWPuzpzRT4unCPRTD8VdA9Zb0afxpcxOqR4PixRS7yT42FqGS8BYL8g1w==", - "dev": true - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "node_modules/@svgr/plugin-svgo/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@types/conventional-commits-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", - "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==", + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "dev": true, "dependencies": { - "@types/node": "*" + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "dependencies": { - "@types/ms": "*" + "node_modules/@swc-node/core": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.13.3.tgz", + "integrity": "sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA==", + "devOptional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@swc/core": ">= 1.4.13", + "@swc/types": ">= 0.1" } }, - "node_modules/@types/eslint": { - "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", - "dev": true, + "node_modules/@swc-node/register": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.9.2.tgz", + "integrity": "sha512-BBjg0QNuEEmJSoU/++JOXhrjWdu3PTyYeJWsvchsI0Aqtj8ICkz/DqlwtXbmZVZ5vuDPpTfFlwDBZe81zgShMA==", + "devOptional": true, "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@swc-node/core": "^1.13.1", + "@swc-node/sourcemap-support": "^0.5.0", + "colorette": "^2.0.20", + "debug": "^4.3.4", + "pirates": "^4.0.6", + "tslib": "^2.6.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@swc/core": ">= 1.4.13", + "typescript": ">= 4.3" } }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, + "node_modules/@swc-node/sourcemap-support": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.5.1.tgz", + "integrity": "sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==", + "devOptional": true, "dependencies": { - "@types/node": "*" + "source-map-support": "^0.5.21", + "tslib": "^2.6.3" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "node_modules/@swc-node/sourcemap-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, + "node_modules/@swc-node/sourcemap-support/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "devOptional": true, "dependencies": { - "@types/istanbul-lib-coverage": "*" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/@swc/cli": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.3.14.tgz", + "integrity": "sha512-0vGqD6FSW67PaZUZABkA+ADKsX7OUY/PwNEz1SbQdCvVk/e4Z36Gwh7mFVBQH9RIsMonTyhV1RHkwkGnEfR3zQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" + "@mole-inc/bin-wrapper": "^8.0.1", + "@swc/counter": "^0.1.3", + "commander": "^8.3.0", + "fast-glob": "^3.2.5", + "minimatch": "^9.0.3", + "piscina": "^4.3.0", + "semver": "^7.3.8", + "slash": "3.0.0", + "source-map": "^0.7.3" + }, + "bin": { + "spack": "bin/spack.js", + "swc": "bin/swc.js", + "swcx": "bin/swcx.js" + }, + "engines": { + "node": ">= 16.14.0" + }, + "peerDependencies": { + "@swc/core": "^1.2.66", + "chokidar": "^3.5.1" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.19.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz", - "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==", + "node_modules/@swc/cli/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.24", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.24.tgz", - "integrity": "sha512-Ee0Jt4sbJxMu1iDcetZEIKQr99J1Zfb6D4F3qfUWoR1JpInkY1Wdg4WwCyBjL257D0+jGqSl1twBjV8iCaC0Aw==", - "dev": true, + "node_modules/@swc/core": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.7.tgz", + "integrity": "sha512-U4qJRBefIJNJDRCCiVtkfa/hpiZ7w0R6kASea+/KLp+vkus3zcLSB8Ub8SvKgTIxjWpwsKcZlPf5nrv4ls46SQ==", + "devOptional": true, + "hasInstallScript": true, "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "@swc/counter": "^0.1.2", + "@swc/types": "0.1.7" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.5.7", + "@swc/core-darwin-x64": "1.5.7", + "@swc/core-linux-arm-gnueabihf": "1.5.7", + "@swc/core-linux-arm64-gnu": "1.5.7", + "@swc/core-linux-arm64-musl": "1.5.7", + "@swc/core-linux-x64-gnu": "1.5.7", + "@swc/core-linux-x64-musl": "1.5.7", + "@swc/core-win32-arm64-msvc": "1.5.7", + "@swc/core-win32-ia32-msvc": "1.5.7", + "@swc/core-win32-x64-msvc": "1.5.7" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } } }, - "node_modules/@types/react-dom": { - "version": "18.2.9", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.9.tgz", - "integrity": "sha512-6nNhVzZ9joQ6F7lozrASuQKC0Kf6ArYMU+DqA2ZrUbB+d+9lC6ZLn1GxiEBI1edmAwvTULtuJ6uPZpv3XudwUg==", + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.7.tgz", + "integrity": "sha512-tp43WfJLCsKLQKBmjmY/0vv1slVywR5Q4qKjF5OIY8QijaEW7/8VwPyUyVoJZEnDgv9jKtUTG5PzqtIYPZGnyg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@types/react": "*" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" } }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, + "node_modules/@swc/core/node_modules/@swc/types": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.7.tgz", + "integrity": "sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==", + "devOptional": true, "dependencies": { - "@types/node": "*" + "@swc/counter": "^0.1.3" } }, - "node_modules/@types/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "devOptional": true }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, + "node_modules/@swc/helpers": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", "dependencies": { - "@types/yargs-parser": "*" + "tslib": "^2.4.0" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "optional": true, + "node_modules/@swc/types": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz", + "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==", + "devOptional": true, + "peer": true, "dependencies": { - "@types/node": "*" + "@swc/counter": "^0.1.3" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", - "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/type-utils": "6.13.2", - "@typescript-eslint/utils": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "defer-to-connect": "^2.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=10" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", - "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.13.2", - "@typescript-eslint/utils": "6.13.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", - "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/typescript-estree": "6.13.2", - "semver": "^7.5.4" + "color-convert": "^2.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@typescript-eslint/parser": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz", - "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==", + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/typescript-estree": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", - "debug": "^4.3.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", - "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", + "node_modules/@testing-library/dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2" + "color-name": "~1.1.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=7.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "node_modules/@testing-library/dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/@testing-library/dom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "node_modules/@testing-library/dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">=8" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "node_modules/@testing-library/jest-dom": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", + "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@testing-library/jest-dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=7.0.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", - "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", + "node_modules/@testing-library/jest-dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@testing-library/jest-dom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", - "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", + "node_modules/@testing-library/jest-dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "node_modules/@testing-library/react": { + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.6.tgz", + "integrity": "sha512-UlbazRtEpQClFOiYp+1BapMT+xyqWMnE+hh9tn5DQ6gmlE7AIZWcGpzZukmDZuFk3By01oiqOf8lRedLS4k6xQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^10.0.0", + "@types/react-dom": "^18.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "node_modules/@trivago/prettier-plugin-sort-imports": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz", + "integrity": "sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" + "@babel/generator": "7.17.7", + "@babel/parser": "^7.20.5", + "@babel/traverse": "7.23.2", + "@babel/types": "7.17.0", + "javascript-natural-sort": "0.7.1", + "lodash": "^4.17.21" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@vue/compiler-sfc": "3.x", + "prettier": "2.x - 3.x" }, "peerDependenciesMeta": { - "typescript": { + "@vue/compiler-sfc": { "optional": true } } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/generator": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6.9.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", - "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.13.2", - "eslint-visitor-keys": "^3.4.1" + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" - }, - "node_modules/@verdaccio/auth": { - "version": "8.0.0-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/auth/-/auth-8.0.0-next-8.1.tgz", - "integrity": "sha512-sPmHdnYuRSMgABCsTJEfz8tb/smONsWVg0g4KK2QycyYZ/A+RwZLV1JLiQb4wzu9zvS0HSloqWqkWlyNHW3mtw==", + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dev": true, + "license": "MIT", "dependencies": { - "@verdaccio/config": "8.0.0-next-8.1", - "@verdaccio/core": "8.0.0-next-8.1", - "@verdaccio/loaders": "8.0.0-next-8.1", - "@verdaccio/logger": "8.0.0-next-8.1", - "@verdaccio/signature": "8.0.0-next-8.0", - "@verdaccio/utils": "7.0.1-next-8.1", - "debug": "4.3.7", - "lodash": "4.17.21", - "verdaccio-htpasswd": "13.0.0-next-8.1" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "node": ">=6.9.0" } }, - "node_modules/@verdaccio/commons-api": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@verdaccio/commons-api/-/commons-api-10.2.0.tgz", - "integrity": "sha512-F/YZANu4DmpcEV0jronzI7v2fGVWkQ5Mwi+bVmV+ACJ+EzR0c9Jbhtbe5QyLUuzR97t8R5E/Xe53O0cc2LukdQ==", + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, - "dependencies": { - "http-errors": "2.0.0", - "http-status-codes": "2.2.0" + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "node": ">=6" } }, - "node_modules/@verdaccio/commons-api/node_modules/http-status-codes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.2.0.tgz", - "integrity": "sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==", - "dev": true - }, - "node_modules/@verdaccio/config": { - "version": "8.0.0-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/config/-/config-8.0.0-next-8.1.tgz", - "integrity": "sha512-goDVOH4e8xMUxjHybJpi5HwIecVFqzJ9jeNFrRUgtUUn0PtFuNMHgxOeqDKRVboZhc5HK90yed8URK/1O6VsUw==", + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, + "license": "MIT", "dependencies": { - "@verdaccio/core": "8.0.0-next-8.1", - "@verdaccio/utils": "7.0.1-next-8.1", - "debug": "4.3.7", - "js-yaml": "4.1.0", - "lodash": "4.17.21", - "minimatch": "7.4.6" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "node": ">=6.9.0" } }, - "node_modules/@verdaccio/config/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/@verdaccio/core": { - "version": "8.0.0-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/core/-/core-8.0.0-next-8.1.tgz", - "integrity": "sha512-kQRCB2wgXEh8H88G51eQgAFK9IxmnBtkQ8sY5FbmB6PbBkyHrbGcCp+2mtRqqo36j0W1VAlfM3XzoknMy6qQnw==", + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, - "dependencies": { - "ajv": "8.17.1", - "core-js": "3.37.1", - "http-errors": "2.0.0", - "http-status-codes": "2.3.0", - "process-warning": "1.0.0", - "semver": "7.6.3" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "node": ">=0.10.0" } }, - "node_modules/@verdaccio/file-locking": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-10.3.1.tgz", - "integrity": "sha512-oqYLfv3Yg3mAgw9qhASBpjD50osj2AX4IwbkUtyuhhKGyoFU9eZdrbeW6tpnqUnj6yBMtAPm2eGD4BwQuX400g==", + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, - "dependencies": { - "lockfile": "1.0.4" - }, "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "node": ">=10.13.0" } }, - "node_modules/@verdaccio/loaders": { - "version": "8.0.0-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/loaders/-/loaders-8.0.0-next-8.1.tgz", - "integrity": "sha512-mqGCUBs862g8mICZwX8CG92p1EZ1Un0DJ2DB7+iVu2TYaEeKoHoIdafabVdiYrbOjLcAOOBrMKE1Wnn14eLxpA==", - "dev": true, - "dependencies": { - "@verdaccio/logger": "8.0.0-next-8.1", - "debug": "4.3.7", - "lodash": "4.17.21" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" - } + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true }, - "node_modules/@verdaccio/local-storage-legacy": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@verdaccio/local-storage-legacy/-/local-storage-legacy-11.0.2.tgz", - "integrity": "sha512-7AXG7qlcVFmF+Nue2oKaraprGRtaBvrQIOvc/E89+7hAe399V01KnZI6E/ET56u7U9fq0MSlp92HBcdotlpUXg==", - "dev": true, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "dependencies": { - "@verdaccio/commons-api": "10.2.0", - "@verdaccio/file-locking": "10.3.1", - "@verdaccio/streams": "10.2.1", - "async": "3.2.4", - "debug": "4.3.4", - "lodash": "4.17.21", - "lowdb": "1.0.0", - "mkdirp": "1.0.4" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "tslib": "^2.4.0" } }, - "node_modules/@verdaccio/local-storage-legacy/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true }, - "node_modules/@verdaccio/local-storage-legacy/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@verdaccio/local-storage-legacy/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@verdaccio/local-storage-legacy/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@verdaccio/logger": { - "version": "8.0.0-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/logger/-/logger-8.0.0-next-8.1.tgz", - "integrity": "sha512-w5kR0/umQkfH2F4PK5Fz9T6z3xz+twewawKLPTUfAgrVAOiWxcikGhhcHWhSGiJ0lPqIa+T0VYuLWMeVeDirGw==", + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { - "@verdaccio/logger-commons": "8.0.0-next-8.1", - "pino": "8.17.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "@babel/types": "^7.0.0" } }, - "node_modules/@verdaccio/logger-7": { - "version": "8.0.0-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/logger-7/-/logger-7-8.0.0-next-8.1.tgz", - "integrity": "sha512-V+/B1Wnct3IZ90q6HkI1a3dqbS0ds7s/5WPrS5cmBeLEw78/OGgF76XkhI2+lett7Un1CjVow7mcebOWcZ/Sqw==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { - "@verdaccio/logger-commons": "8.0.0-next-8.1", - "pino": "7.11.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@verdaccio/logger-7/node_modules/duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" + "@babel/types": "^7.20.7" } }, - "node_modules/@verdaccio/logger-7/node_modules/on-exit-leak-free": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", - "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==", + "node_modules/@types/benchmark": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-2.1.5.tgz", + "integrity": "sha512-cKio2eFB3v7qmKcvIHLUMw/dIx/8bhWPuzpzRT4unCPRTD8VdA9Zb0afxpcxOqR4PixRS7yT42FqGS8BYL8g1w==", "dev": true }, - "node_modules/@verdaccio/logger-7/node_modules/pino": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", - "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.0.0", - "on-exit-leak-free": "^0.2.0", - "pino-abstract-transport": "v0.5.0", - "pino-std-serializers": "^4.0.0", - "process-warning": "^1.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.1.0", - "safe-stable-stringify": "^2.1.0", - "sonic-boom": "^2.2.1", - "thread-stream": "^0.15.1" - }, - "bin": { - "pino": "bin.js" + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" } }, - "node_modules/@verdaccio/logger-7/node_modules/pino-abstract-transport": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", - "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "node_modules/@types/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==", "dev": true, "dependencies": { - "duplexify": "^4.1.2", - "split2": "^4.0.0" + "@types/node": "*" } }, - "node_modules/@verdaccio/logger-7/node_modules/pino-std-serializers": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", - "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==", - "dev": true - }, - "node_modules/@verdaccio/logger-7/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "@types/ms": "*" } }, - "node_modules/@verdaccio/logger-7/node_modules/real-require": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", - "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", "dev": true, - "engines": { - "node": ">= 12.13.0" + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@verdaccio/logger-7/node_modules/sonic-boom": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", - "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "peer": true, "dependencies": { - "atomic-sleep": "^1.0.0" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/@verdaccio/logger-7/node_modules/thread-stream": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", - "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { - "real-require": "^0.1.0" + "@types/node": "*" } }, - "node_modules/@verdaccio/logger-commons": { - "version": "8.0.0-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/logger-commons/-/logger-commons-8.0.0-next-8.1.tgz", - "integrity": "sha512-jCge//RT4uaK7MarhpzcJeJ5Uvtu/DbJ1wvJQyGiFe+9AvxDGm3EUFXvawLFZ0lzYhmLt1nvm7kevcc3vOm2ZQ==", + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "dependencies": { - "@verdaccio/core": "8.0.0-next-8.1", - "@verdaccio/logger-prettify": "8.0.0-next-8.0", - "colorette": "2.0.20", - "debug": "4.3.7" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "@types/node": "*" } }, - "node_modules/@verdaccio/logger-prettify": { - "version": "8.0.0-next-8.0", - "resolved": "https://registry.npmjs.org/@verdaccio/logger-prettify/-/logger-prettify-8.0.0-next-8.0.tgz", - "integrity": "sha512-7mAFHZF2NPTubrOXYp2+fbMjRW5MMWXMeS3LcpupMAn5uPp6jkKEM8NC4IVJEevC5Ph4vPVZqpoPDpgXHEaV3Q==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { - "colorette": "2.0.20", - "dayjs": "1.11.13", - "lodash": "4.17.21", - "pino-abstract-transport": "1.1.0", - "sonic-boom": "3.8.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/@verdaccio/middleware": { - "version": "8.0.0-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/middleware/-/middleware-8.0.0-next-8.1.tgz", - "integrity": "sha512-GpAdJYky1WmOERpxPoCkVSwTTJIsVAjqf2a2uQNvi7R3UZhs059JKhWcZjJMVCGV0uz9xgQvtb3DEuYGHqyaOg==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { - "@verdaccio/config": "8.0.0-next-8.1", - "@verdaccio/core": "8.0.0-next-8.1", - "@verdaccio/url": "13.0.0-next-8.1", - "@verdaccio/utils": "7.0.1-next-8.1", - "debug": "4.3.7", - "express": "4.21.0", - "express-rate-limit": "5.5.1", - "lodash": "4.17.21", - "lru-cache": "7.18.3", - "mime": "2.6.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "@types/istanbul-lib-report": "*" } }, - "node_modules/@verdaccio/middleware/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, - "node_modules/@verdaccio/middleware/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, - "node_modules/@verdaccio/search-indexer": { - "version": "8.0.0-next-8.0", - "resolved": "https://registry.npmjs.org/@verdaccio/search-indexer/-/search-indexer-8.0.0-next-8.0.tgz", - "integrity": "sha512-VS9axVt8XAueiPceVCgaj9nlvYj5s/T4MkAILSf2rVZeFFOMUyxU3mddUCajSHzL+YpqCuzLLL9865sRRzOJ9w==", + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "dependencies": { + "@types/node": "*" } }, - "node_modules/@verdaccio/signature": { - "version": "8.0.0-next-8.0", - "resolved": "https://registry.npmjs.org/@verdaccio/signature/-/signature-8.0.0-next-8.0.tgz", - "integrity": "sha512-klcc2UlCvQxXDV65Qewo2rZOfv7S1y8NekS/8uurSaCTjU35T+fz+Pbqz1S9XK9oQlMp4vCQ7w3iMPWQbvphEQ==", + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz", + "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", + "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", "dev": true, "dependencies": { - "debug": "4.3.7", - "jsonwebtoken": "9.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "@types/prop-types": "*", + "csstype": "^3.0.2" } }, - "node_modules/@verdaccio/streams": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@verdaccio/streams/-/streams-10.2.1.tgz", - "integrity": "sha512-OojIG/f7UYKxC4dYX8x5ax8QhRx1b8OYUAMz82rUottCuzrssX/4nn5QE7Ank0DUSX3C9l/HPthc4d9uKRJqJQ==", + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, - "engines": { - "node": ">=12", - "npm": ">=5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "dependencies": { + "@types/react": "*" } }, - "node_modules/@verdaccio/tarball": { - "version": "13.0.0-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/tarball/-/tarball-13.0.0-next-8.1.tgz", - "integrity": "sha512-58uimU2Bqt9+s+9ixy7wK/nPCqbOXhhhr/MQjl+otIlsUhSeATndhFzEctz/W+4MhUDg0tUnE9HC2yeNHHAo1Q==", + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, "dependencies": { - "@verdaccio/core": "8.0.0-next-8.1", - "@verdaccio/url": "13.0.0-next-8.1", - "@verdaccio/utils": "7.0.1-next-8.1", - "debug": "4.3.7", - "gunzip-maybe": "^1.4.2", - "lodash": "4.17.21", - "tar-stream": "^3.1.7" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "@types/node": "*" } }, - "node_modules/@verdaccio/tarball/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "@types/yargs-parser": "*" } }, - "node_modules/@verdaccio/ui-theme": { - "version": "8.0.0-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/ui-theme/-/ui-theme-8.0.0-next-8.1.tgz", - "integrity": "sha512-9PxV8+jE2Tr+iy9DQW/bzny4YqOlW0mCZ9ct6jhcUW4GdfzU//gY2fBN/DDtQVmfbTy8smuj4Enyv5f0wCsnYg==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, - "node_modules/@verdaccio/url": { - "version": "13.0.0-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/url/-/url-13.0.0-next-8.1.tgz", - "integrity": "sha512-h6pkJf+YtogImKgOrmPP9UVG3p3gtb67gqkQU0bZnK+SEKQt6Rkek/QvtJ8MbmciagYS18bDhpI8DxqLHjDfZQ==", + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.0.tgz", + "integrity": "sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==", "dev": true, "dependencies": { - "@verdaccio/core": "8.0.0-next-8.1", - "debug": "4.3.7", - "lodash": "4.17.21", - "validator": "13.12.0" + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@verdaccio/utils": { - "version": "7.0.1-next-8.1", - "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-7.0.1-next-8.1.tgz", - "integrity": "sha512-cyJdRrVa+8CS7UuIQb3K3IJFjMe64v38tYiBnohSmhRbX7dX9IT3jWbjrwkqWh4KeS1CS6BYENrGG1evJ2ggrQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", + "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", "dev": true, "dependencies": { - "@verdaccio/core": "8.0.0-next-8.1", - "lodash": "4.17.21", - "minimatch": "7.4.6", - "semver": "7.6.3" + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0" }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@verdaccio/utils/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz", + "integrity": "sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@typescript-eslint/typescript-estree": "8.18.0", + "@typescript-eslint/utils": "8.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", + "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", "dev": true, "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@vitest/coverage-v8": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", - "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", + "node_modules/@typescript-eslint/types": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", + "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", + "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@bcoe/v8-coverage": "^0.2.3", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", "debug": "^4.3.4", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.4", - "istanbul-reports": "^3.1.6", - "magic-string": "^0.30.5", - "magicast": "^0.3.3", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "test-exclude": "^6.0.0" + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "vitest": "1.6.0" + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@vitest/expect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", - "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", - "dev": true, - "dependencies": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "chai": "^4.3.10" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@vitest/runner": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", - "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", + "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", "dev": true, "dependencies": { - "@vitest/utils": "1.6.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "@typescript-eslint/types": "8.18.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "node_modules/@verdaccio/auth": { + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/auth/-/auth-8.0.0-next-8.1.tgz", + "integrity": "sha512-sPmHdnYuRSMgABCsTJEfz8tb/smONsWVg0g4KK2QycyYZ/A+RwZLV1JLiQb4wzu9zvS0HSloqWqkWlyNHW3mtw==", "dev": true, + "dependencies": { + "@verdaccio/config": "8.0.0-next-8.1", + "@verdaccio/core": "8.0.0-next-8.1", + "@verdaccio/loaders": "8.0.0-next-8.1", + "@verdaccio/logger": "8.0.0-next-8.1", + "@verdaccio/signature": "8.0.0-next-8.0", + "@verdaccio/utils": "7.0.1-next-8.1", + "debug": "4.3.7", + "lodash": "4.17.21", + "verdaccio-htpasswd": "13.0.0-next-8.1" + }, "engines": { - "node": ">=12.20" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@vitest/snapshot": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", + "node_modules/@verdaccio/commons-api": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@verdaccio/commons-api/-/commons-api-10.2.0.tgz", + "integrity": "sha512-F/YZANu4DmpcEV0jronzI7v2fGVWkQ5Mwi+bVmV+ACJ+EzR0c9Jbhtbe5QyLUuzR97t8R5E/Xe53O0cc2LukdQ==", "dev": true, "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "http-errors": "2.0.0", + "http-status-codes": "2.2.0" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@vitest/snapshot/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "node_modules/@verdaccio/commons-api/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.8" } }, - "node_modules/@vitest/snapshot/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "node_modules/@verdaccio/commons-api/node_modules/http-status-codes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.2.0.tgz", + "integrity": "sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==", "dev": true }, - "node_modules/@vitest/spy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", - "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", + "node_modules/@verdaccio/commons-api/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">= 0.8" } }, - "node_modules/@vitest/ui": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.6.0.tgz", - "integrity": "sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==", + "node_modules/@verdaccio/config": { + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/config/-/config-8.0.0-next-8.1.tgz", + "integrity": "sha512-goDVOH4e8xMUxjHybJpi5HwIecVFqzJ9jeNFrRUgtUUn0PtFuNMHgxOeqDKRVboZhc5HK90yed8URK/1O6VsUw==", "dev": true, "dependencies": { - "@vitest/utils": "1.6.0", - "fast-glob": "^3.3.2", - "fflate": "^0.8.1", - "flatted": "^3.2.9", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "sirv": "^2.0.4" + "@verdaccio/core": "8.0.0-next-8.1", + "@verdaccio/utils": "7.0.1-next-8.1", + "debug": "4.3.7", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "minimatch": "7.4.6" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=14" }, - "peerDependencies": { - "vitest": "1.6.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@vitest/ui/node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@verdaccio/config/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@verdaccio/config/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "argparse": "^2.0.1" }, - "engines": { - "node": ">= 8" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@vitest/ui/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@verdaccio/config/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@vitest/ui/node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@verdaccio/core": { + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/core/-/core-8.0.0-next-8.1.tgz", + "integrity": "sha512-kQRCB2wgXEh8H88G51eQgAFK9IxmnBtkQ8sY5FbmB6PbBkyHrbGcCp+2mtRqqo36j0W1VAlfM3XzoknMy6qQnw==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "ajv": "8.17.1", + "core-js": "3.37.1", + "http-errors": "2.0.0", + "http-status-codes": "2.3.0", + "process-warning": "1.0.0", + "semver": "7.6.3" }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@vitest/ui/node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "node_modules/@verdaccio/core/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=8.6.0" + "node": ">= 0.8" } }, - "node_modules/@vitest/ui/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@verdaccio/core/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, "engines": { - "node": ">= 6" + "node": ">= 0.8" } }, - "node_modules/@vitest/utils": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", - "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", + "node_modules/@verdaccio/file-locking": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-10.3.1.tgz", + "integrity": "sha512-oqYLfv3Yg3mAgw9qhASBpjD50osj2AX4IwbkUtyuhhKGyoFU9eZdrbeW6tpnqUnj6yBMtAPm2eGD4BwQuX400g==", "dev": true, "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "lockfile": "1.0.4" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@vitest/utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "node_modules/@verdaccio/loaders": { + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/loaders/-/loaders-8.0.0-next-8.1.tgz", + "integrity": "sha512-mqGCUBs862g8mICZwX8CG92p1EZ1Un0DJ2DB7+iVu2TYaEeKoHoIdafabVdiYrbOjLcAOOBrMKE1Wnn14eLxpA==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@verdaccio/logger": "8.0.0-next-8.1", + "debug": "4.3.7", + "lodash": "4.17.21" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@vitest/utils/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" - }, - "node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.46", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", - "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "node_modules/@verdaccio/local-storage-legacy": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@verdaccio/local-storage-legacy/-/local-storage-legacy-11.0.2.tgz", + "integrity": "sha512-7AXG7qlcVFmF+Nue2oKaraprGRtaBvrQIOvc/E89+7hAe399V01KnZI6E/ET56u7U9fq0MSlp92HBcdotlpUXg==", + "dev": true, "dependencies": { - "js-yaml": "^3.10.0", - "tslib": "^2.4.0" + "@verdaccio/commons-api": "10.2.0", + "@verdaccio/file-locking": "10.3.1", + "@verdaccio/streams": "10.2.1", + "async": "3.2.4", + "debug": "4.3.4", + "lodash": "4.17.21", + "lowdb": "1.0.0", + "mkdirp": "1.0.4" }, "engines": { - "node": ">=14.15.0" + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/@yarnpkg/parsers/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "node_modules/@verdaccio/local-storage-legacy/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true }, - "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@verdaccio/local-storage-legacy/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "ms": "2.1.2" }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@zkochan/js-yaml": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", - "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", - "dependencies": { - "argparse": "^2.0.1" + "engines": { + "node": ">=6.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/@verdaccio/local-storage-legacy/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=6.5" + "node": ">=10" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@verdaccio/logger": { + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/logger/-/logger-8.0.0-next-8.1.tgz", + "integrity": "sha512-w5kR0/umQkfH2F4PK5Fz9T6z3xz+twewawKLPTUfAgrVAOiWxcikGhhcHWhSGiJ0lPqIa+T0VYuLWMeVeDirGw==", "dev": true, "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@verdaccio/logger-commons": "8.0.0-next-8.1", + "pino": "8.17.2" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/acorn": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", - "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", - "bin": { - "acorn": "bin/acorn" + "node_modules/@verdaccio/logger-7": { + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/logger-7/-/logger-7-8.0.0-next-8.1.tgz", + "integrity": "sha512-V+/B1Wnct3IZ90q6HkI1a3dqbS0ds7s/5WPrS5cmBeLEw78/OGgF76XkhI2+lett7Un1CjVow7mcebOWcZ/Sqw==", + "dev": true, + "dependencies": { + "@verdaccio/logger-commons": "8.0.0-next-8.1", + "pino": "7.11.0" }, "engines": { - "node": ">=0.4.0" + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node_modules/@verdaccio/logger-7/node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "node_modules/@verdaccio/logger-7/node_modules/on-exit-leak-free": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==", + "dev": true + }, + "node_modules/@verdaccio/logger-7/node_modules/pino": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", + "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", "dev": true, "dependencies": { - "acorn": "^8.11.0" + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.0.0", + "on-exit-leak-free": "^0.2.0", + "pino-abstract-transport": "v0.5.0", + "pino-std-serializers": "^4.0.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.1.0", + "safe-stable-stringify": "^2.1.0", + "sonic-boom": "^2.2.1", + "thread-stream": "^0.15.1" }, - "engines": { - "node": ">=0.4.0" + "bin": { + "pino": "bin.js" } }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "node_modules/@verdaccio/logger-7/node_modules/pino-abstract-transport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", + "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", "dev": true, - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "duplexify": "^4.1.2", + "split2": "^4.0.0" } }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/@verdaccio/logger-7/node_modules/pino-std-serializers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==", + "dev": true + }, + "node_modules/@verdaccio/logger-7/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { - "debug": "^4.3.4" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">= 14" + "node": ">= 6" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@verdaccio/logger-7/node_modules/real-require": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", + "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 12.13.0" } }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/@verdaccio/logger-7/node_modules/sonic-boom": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", + "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "atomic-sleep": "^1.0.0" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "engines": { - "node": ">=6" + "node_modules/@verdaccio/logger-7/node_modules/thread-stream": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", + "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", + "dev": true, + "dependencies": { + "real-require": "^0.1.0" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@verdaccio/logger-commons": { + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/logger-commons/-/logger-commons-8.0.0-next-8.1.tgz", + "integrity": "sha512-jCge//RT4uaK7MarhpzcJeJ5Uvtu/DbJ1wvJQyGiFe+9AvxDGm3EUFXvawLFZ0lzYhmLt1nvm7kevcc3vOm2ZQ==", "dev": true, "dependencies": { - "type-fest": "^0.21.3" + "@verdaccio/core": "8.0.0-next-8.1", + "@verdaccio/logger-prettify": "8.0.0-next-8.0", + "colorette": "2.0.20", + "debug": "4.3.7" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/@verdaccio/logger-prettify": { + "version": "8.0.0-next-8.0", + "resolved": "https://registry.npmjs.org/@verdaccio/logger-prettify/-/logger-prettify-8.0.0-next-8.0.tgz", + "integrity": "sha512-7mAFHZF2NPTubrOXYp2+fbMjRW5MMWXMeS3LcpupMAn5uPp6jkKEM8NC4IVJEevC5Ph4vPVZqpoPDpgXHEaV3Q==", "dev": true, + "dependencies": { + "colorette": "2.0.20", + "dayjs": "1.11.13", + "lodash": "4.17.21", + "pino-abstract-transport": "1.1.0", + "sonic-boom": "3.8.0" + }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/@verdaccio/middleware": { + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/middleware/-/middleware-8.0.0-next-8.1.tgz", + "integrity": "sha512-GpAdJYky1WmOERpxPoCkVSwTTJIsVAjqf2a2uQNvi7R3UZhs059JKhWcZjJMVCGV0uz9xgQvtb3DEuYGHqyaOg==", + "dev": true, + "dependencies": { + "@verdaccio/config": "8.0.0-next-8.1", + "@verdaccio/core": "8.0.0-next-8.1", + "@verdaccio/url": "13.0.0-next-8.1", + "@verdaccio/utils": "7.0.1-next-8.1", + "debug": "4.3.7", + "express": "4.21.0", + "express-rate-limit": "5.5.1", + "lodash": "4.17.21", + "lru-cache": "7.18.3", + "mime": "2.6.0" + }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/ansis": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.3.2.tgz", - "integrity": "sha512-cFthbBlt+Oi0i9Pv/j6YdVWJh54CtjGACaMPCIrEV4Ha7HWsIjXDwseYV79TIL0B4+KfSwD5S70PeQDkPUd1rA==", + "node_modules/@verdaccio/middleware/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, "engines": { - "node": ">=15" + "node": ">=12" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@verdaccio/middleware/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">= 8" + "node": ">=4.0.0" } }, - "node_modules/apache-md5": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.8.tgz", - "integrity": "sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==", + "node_modules/@verdaccio/search-indexer": { + "version": "8.0.0-next-8.0", + "resolved": "https://registry.npmjs.org/@verdaccio/search-indexer/-/search-indexer-8.0.0-next-8.0.tgz", + "integrity": "sha512-VS9axVt8XAueiPceVCgaj9nlvYj5s/T4MkAILSf2rVZeFFOMUyxU3mddUCajSHzL+YpqCuzLLL9865sRRzOJ9w==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "node_modules/@verdaccio/signature": { + "version": "8.0.0-next-8.0", + "resolved": "https://registry.npmjs.org/@verdaccio/signature/-/signature-8.0.0-next-8.0.tgz", + "integrity": "sha512-klcc2UlCvQxXDV65Qewo2rZOfv7S1y8NekS/8uurSaCTjU35T+fz+Pbqz1S9XK9oQlMp4vCQ7w3iMPWQbvphEQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "dependencies": { + "debug": "4.3.7", + "jsonwebtoken": "9.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "node_modules/@verdaccio/streams": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@verdaccio/streams/-/streams-10.2.1.tgz", + "integrity": "sha512-OojIG/f7UYKxC4dYX8x5ax8QhRx1b8OYUAMz82rUottCuzrssX/4nn5QE7Ank0DUSX3C9l/HPthc4d9uKRJqJQ==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=12", + "npm": ">=5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "node_modules/@verdaccio/tarball": { + "version": "13.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/tarball/-/tarball-13.0.0-next-8.1.tgz", + "integrity": "sha512-58uimU2Bqt9+s+9ixy7wK/nPCqbOXhhhr/MQjl+otIlsUhSeATndhFzEctz/W+4MhUDg0tUnE9HC2yeNHHAo1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "@verdaccio/core": "8.0.0-next-8.1", + "@verdaccio/url": "13.0.0-next-8.1", + "@verdaccio/utils": "7.0.1-next-8.1", + "debug": "4.3.7", + "gunzip-maybe": "^1.4.2", + "lodash": "4.17.21", + "tar-stream": "^3.1.7" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true + "node_modules/@verdaccio/tarball/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "node_modules/@verdaccio/ui-theme": { + "version": "8.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/ui-theme/-/ui-theme-8.0.0-next-8.1.tgz", + "integrity": "sha512-9PxV8+jE2Tr+iy9DQW/bzny4YqOlW0mCZ9ct6jhcUW4GdfzU//gY2fBN/DDtQVmfbTy8smuj4Enyv5f0wCsnYg==", "dev": true }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "node_modules/@verdaccio/url": { + "version": "13.0.0-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/url/-/url-13.0.0-next-8.1.tgz", + "integrity": "sha512-h6pkJf+YtogImKgOrmPP9UVG3p3gtb67gqkQU0bZnK+SEKQt6Rkek/QvtJ8MbmciagYS18bDhpI8DxqLHjDfZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "@verdaccio/core": "8.0.0-next-8.1", + "debug": "4.3.7", + "lodash": "4.17.21", + "validator": "13.12.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "node_modules/@verdaccio/utils": { + "version": "7.0.1-next-8.1", + "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-7.0.1-next-8.1.tgz", + "integrity": "sha512-cyJdRrVa+8CS7UuIQb3K3IJFjMe64v38tYiBnohSmhRbX7dX9IT3jWbjrwkqWh4KeS1CS6BYENrGG1evJ2ggrQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "@verdaccio/core": "8.0.0-next-8.1", + "lodash": "4.17.21", + "minimatch": "7.4.6", + "semver": "7.6.3" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "node_modules/@verdaccio/utils/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "node_modules/@vitejs/plugin-react": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", + "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "@babel/core": "^7.23.5", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.18.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" } }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "node_modules/@vitest/coverage-v8": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.3.1.tgz", + "integrity": "sha512-UuBnkSJUNE9rdHjDCPyJ4fYuMkoMtnghes1XohYa4At0MS3OQSAo97FrbwSLRshYsXThMZy1+ybD/byK5llyIg==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.1.6", + "magic-string": "^0.30.5", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.2.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.3.1" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "node_modules/@vitest/expect": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz", + "integrity": "sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "chai": "^4.3.10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/vitest" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/@vitest/runner": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.3.1.tgz", + "integrity": "sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==", "dev": true, "dependencies": { - "safer-buffer": "~2.1.0" + "@vitest/utils": "1.3.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, "engines": { - "node": ">=0.8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "engines": { - "node": "*" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "node_modules/@vitest/snapshot": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.1.tgz", + "integrity": "sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==", + "dev": true, "dependencies": { - "tslib": "^2.0.1" + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "node_modules/@vitest/snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, "engines": { - "node": ">= 4.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "node_modules/@vitest/snapshot/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/@vitest/spy": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz", + "integrity": "sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==", "dev": true, - "engines": { - "node": ">=8.0.0" + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/@vitest/ui": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.3.1.tgz", + "integrity": "sha512-2UrFLJ62c/eJGPHcclstMKlAR7E1WB1ITe1isuowEPJJHi3HfqofvsUqQ1cGrEF7kitG1DJuwURUA3HLDtQkXA==", "dev": true, "dependencies": { - "possible-typed-array-names": "^1.0.0" + "@vitest/utils": "1.3.1", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.3.1" + } + }, + "node_modules/@vitest/utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz", + "integrity": "sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/vitest" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "node_modules/@vitest/utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, "engines": { - "node": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "node_modules/@vitest/utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, - "node_modules/axe-core": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.1.tgz", - "integrity": "sha512-qPC9o+kD8Tir0lzNGLeghbOrWMr3ZJpaRlCIb6Uobt/7N4FiEDvqUMnxzCHRHmg8vOg14kr5gVNyScRmbMaJ9g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "peer": true, "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "peer": true }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "peer": true, "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "peer": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "peer": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@xtuc/long": "4.2.2" } }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "peer": true }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, - "engines": { - "node": ">=8" + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "peer": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/babel-plugin-const-enum": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz", - "integrity": "sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-typescript": "^7.3.3", - "@babel/traverse": "^7.16.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "peer": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "peer": true }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, + "peer": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=14.15.0" } }, - "node_modules/babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "node_modules/@zkochan/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-macros/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" + "node": ">=6.5" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { - "semver": "bin/semver.js" + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "acorn": "^8.11.0" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/babel-plugin-transform-typescript-metadata": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz", - "integrity": "sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==", + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": ">=12.0" } }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" + "debug": "^4.3.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bare-events": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", - "optional": true - }, - "node_modules/bare-fs": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", - "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", - "optional": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" - } - }, - "node_modules/bare-os": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", - "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", - "optional": true - }, - "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", - "optional": true, - "dependencies": { - "bare-os": "^2.1.0" - } - }, - "node_modules/bare-stream": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.2.tgz", - "integrity": "sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==", - "optional": true, - "dependencies": { - "streamx": "^2.20.0" + "node": ">= 14" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "dependencies": { - "safe-buffer": "5.1.2" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "tweetnacl": "^0.14.3" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", - "dev": true - }, - "node_modules/benchmark": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "peer": true, "dependencies": { - "lodash": "^4.17.4", - "platform": "^1.3.3" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/bin-check": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", - "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "peer": true, "dependencies": { - "execa": "^0.7.0", - "executable": "^4.1.0" + "fast-deep-equal": "^3.1.3" }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/bin-version": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-6.0.0.tgz", - "integrity": "sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "dependencies": { - "execa": "^5.0.0", - "find-versions": "^5.0.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bin-version-check": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-5.1.0.tgz", - "integrity": "sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "dependencies": { - "bin-version": "^6.0.0", - "semver": "^7.5.3", - "semver-truncate": "^3.0.0" - }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bin-version/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=8" } }, - "node_modules/bin-version/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/bin-version/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, + "node_modules/ansis": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.3.2.tgz", + "integrity": "sha512-cFthbBlt+Oi0i9Pv/j6YdVWJh54CtjGACaMPCIrEV4Ha7HWsIjXDwseYV79TIL0B4+KfSwD5S70PeQDkPUd1rA==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=15" } }, - "node_modules/bin-version/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "node": ">= 8" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "node_modules/apache-md5": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.8.tgz", + "integrity": "sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==", + "dev": true, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "sprintf-js": "~1.0.2" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "dequal": "^2.0.3" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "ms": "2.0.0" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "node_modules/boolbase": { + "node_modules/array-ify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, "engines": { "node": ">=8" } }, - "node_modules/browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "dependencies": { - "pako": "~0.2.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { - "node-int64": "^0.4.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "dev": true - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/build-md": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/build-md/-/build-md-0.4.2.tgz", - "integrity": "sha512-w1ZnCgPqrzd9ZM/LZD+FxtflKWRN+KmcWOHcLH485jQGQLNcbcNqslunUgGkdCfW0GRSj6cb4njMQ/Fr2mhGkQ==" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/builtins": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "dependencies": { - "semver": "^7.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/bundle-require": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.2.1.tgz", - "integrity": "sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, "dependencies": { - "load-tsconfig": "^0.2.3" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "esbuild": ">=0.17" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "safer-buffer": "~2.1.0" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.8" } }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, "engines": { - "node": ">=10.6.0" + "node": "*" } }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "tslib": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4.0.0" } }, - "node_modules/cachedir": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", - "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/call-bind": { + "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "possible-typed-array-names": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9801,1055 +9172,1059 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001669", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", - "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", "dev": true }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, + "node_modules/axe-core": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", "engines": { "node": ">=4" } }, - "node_modules/chai/node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "get-func-name": "^2.0.2" + "color-name": "~1.1.4" }, "engines": { - "node": "*" + "node": ">=7.0.0" } }, - "node_modules/chrome-launcher": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.1.2.tgz", - "integrity": "sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^2.0.1" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=12.13.0" + "node": ">=8" } }, - "node_modules/chromium": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/chromium/-/chromium-3.0.3.tgz", - "integrity": "sha512-TfbzP/3t38Us5xrbb9x87M/y5I/j3jx0zeJhhQ72gjp6dwJuhVP6hBZnBH4wEg7512VVXk9zCfTuPFOdw7bQqg==", + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "hasInstallScript": true, - "os": [ - "darwin", - "linux", - "win32" - ], "dependencies": { - "cachedir": "^2.3.0", - "debug": "^4.1.0", - "extract-zip": "^1.7.0", - "got": "^11.5.1", - "progress": "^2.0.3", - "rimraf": "^2.7.1", - "tmp": "0.0.33", - "tunnel": "^0.0.6" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/chromium-bidi": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", - "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", + "node_modules/babel-plugin-const-enum": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz", + "integrity": "sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==", + "dev": true, "dependencies": { - "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0", - "zod": "3.23.8" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.3.3", + "@babel/traverse": "^7.16.0" }, "peerDependencies": { - "devtools-protocol": "*" + "@babel/core": "^7.0.0-0" } }, - "node_modules/chromium/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "dependencies": { - "os-tmpdir": "~1.0.2" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" }, "engines": { - "node": ">=0.6.0" + "node": ">=8" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, "engines": { "node": ">=8" } }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "dev": true + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "dependencies": { - "escape-string-regexp": "^1.0.5" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/clean-regexp/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "dev": true, - "engines": { - "node": ">=0.8.0" + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "node_modules/babel-plugin-macros/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/cli-table3/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/babel-plugin-transform-typescript-metadata": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz", + "integrity": "sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "@babel/helper-plugin-utils": "^7.0.0" } }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": ">=18" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "engines": { - "node": ">= 12" - } + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/clipanion": { - "version": "4.0.0-rc.3", - "resolved": "https://registry.npmjs.org/clipanion/-/clipanion-4.0.0-rc.3.tgz", - "integrity": "sha512-+rJOJMt2N6Oikgtfqmo/Duvme7uz3SIedL2b6ycgCztQMiTfr3aQh2DDyLHl+QUPClKMNpSg3gDJFvNQYIcq1g==", - "dev": true, + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.3.tgz", + "integrity": "sha512-7RYKL+vZVCyAsMLi5SPu7QGauGGT8avnP/HO571ndEuV4MYdGXvLhtW67FuLPeEI8EiIY7zbbRR9x7x7HU0kgw==", + "optional": true, "dependencies": { - "typanion": "^3.8.0" - }, - "peerDependencies": { - "typanion": "*" + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/bare-os": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.2.tgz", + "integrity": "sha512-HZoJwzC+rZ9lqEemTMiO0luOePoGYNBgsLLgegKR/cljiJvcDNhDZQkzC+NC5Oh0aHbdBNSOHpghwMuB5tqhjg==", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "optional": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" + "bare-os": "^2.1.0" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/bare-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.2.1.tgz", + "integrity": "sha512-YTB47kHwBW9zSG8LD77MIBAAQXjU2WjAkMHeeb7hUplVs6+IoM5I7uEVQNPMB7lj9r8I76UMdoMkGnCodHOLqg==", + "optional": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "b4a": "^1.6.6", + "streamx": "^2.18.0" } }, - "node_modules/cliui/node_modules/color-convert": { + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-auth": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" + "safe-buffer": "5.1.2" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.8" } }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "tweetnacl": "^0.14.3" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", + "dev": true + }, + "node_modules/benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", + "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" - }, + "lodash": "^4.17.4", + "platform": "^1.3.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "execa": "^0.7.0", + "executable": "^4.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=4" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" + "node_modules/bin-check/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "node_modules/bin-check/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", "dev": true, "dependencies": { - "mimic-response": "^1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/bin-check/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "dev": true, "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">=4" } }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true + "node_modules/bin-check/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/bin-check/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "node_modules/bin-check/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" + "path-key": "^2.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/columnify/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/bin-check/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/bin-check/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "shebang-regex": "^1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "node_modules/bin-check/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "engines": { - "node": ">= 10" + "node": ">=0.10.0" } }, - "node_modules/commitizen": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz", - "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==", + "node_modules/bin-check/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/bin-check/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { - "cachedir": "2.3.0", - "cz-conventional-changelog": "3.3.0", - "dedent": "0.7.0", - "detect-indent": "6.1.0", - "find-node-modules": "^2.1.2", - "find-root": "1.1.0", - "fs-extra": "9.1.0", - "glob": "7.2.3", - "inquirer": "8.2.5", - "is-utf8": "^0.2.1", - "lodash": "4.17.21", - "minimist": "1.2.7", - "strip-bom": "4.0.0", - "strip-json-comments": "3.1.1" + "isexe": "^2.0.0" }, "bin": { - "commitizen": "bin/commitizen", - "cz": "bin/git-cz", - "git-cz": "bin/git-cz" - }, - "engines": { - "node": ">= 12" + "which": "bin/which" } }, - "node_modules/commitizen/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/bin-check/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/bin-version": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-6.0.0.tgz", + "integrity": "sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "execa": "^5.0.0", + "find-versions": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/commitizen/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/bin-version-check": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-5.1.0.tgz", + "integrity": "sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/commitizen/node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, + "bin-version": "^6.0.0", + "semver": "^7.5.3", + "semver-truncate": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/commitizen/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/bin-version/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/commitizen/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/bin-version/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/commitizen/node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "node_modules/bin-version/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { - "node": ">= 10" + "node": ">=10.17.0" } }, - "node_modules/commitizen/node_modules/color-convert": { + "node_modules/bin-version/node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/commitizen/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commitizen/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/commitizen/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/bin-version/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/commitizen/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/bin-version/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": "*" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/commitizen/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/bin-version/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/bin-version/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/commitizen/node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", - "dev": true, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/commitizen/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/commitizen/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/commitizen/node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/commitizen/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/commitizen/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/commitizen/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "side-channel": "^1.0.6" }, "engines": { - "node": ">=10" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/commitizen/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, - "node_modules/commitizen/node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", "dev": true, - "engines": { - "node": ">=0.12.0" + "dependencies": { + "pako": "~0.2.0" } }, - "node_modules/commitizen/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=8" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/commitizen/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "node-int64": "^0.4.0" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true, + "bin": { + "btoa": "bin/btoa.js" }, "engines": { - "node": ">=8" + "node": ">= 0.4.0" } }, - "node_modules/commitizen/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "has-flag": "^4.0.0" - }, + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/commitizen/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "devOptional": true + }, + "node_modules/build-md": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/build-md/-/build-md-0.4.2.tgz", + "integrity": "sha512-w1ZnCgPqrzd9ZM/LZD+FxtflKWRN+KmcWOHcLH485jQGQLNcbcNqslunUgGkdCfW0GRSj6cb4njMQ/Fr2mhGkQ==" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/commitlint-plugin-tense": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/commitlint-plugin-tense/-/commitlint-plugin-tense-1.0.3.tgz", - "integrity": "sha512-qP+XJf6ueDf+PAlbzr5QPdYLuqUS5XGlUmDfoSHzXtY/95zTrMZQuMp+SPLKjuio9cQBirJu3WLCqBl7kngS3g==", - "dev": true, + "node_modules/bundle-require": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.2.1.tgz", + "integrity": "sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==", "dependencies": { - "@commitlint/message": "^16.2.1", - "fast-tag-pos": "^2.0.0" + "load-tsconfig": "^0.2.3" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "peerDependencies": { - "@commitlint/lint": ">=7.6.0" + "esbuild": ">=0.17" } }, - "node_modules/commitlint-plugin-tense/node_modules/@commitlint/message": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-16.2.1.tgz", - "integrity": "sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { - "node": ">=v12" + "node": ">= 0.8" } }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" + "engines": { + "node": ">=8" } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", "dev": true, "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "mime-types": "^2.1.18", + "ylru": "^1.2.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 6.0.0" } }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=10.6.0" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/configstore/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, "dependencies": { - "semver": "^6.0.0" + "pump": "^3.0.0" }, "engines": { "node": ">=8" @@ -10858,1373 +10233,2858 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/configstore/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/cachedir": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/conventional-changelog-angular": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", - "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "dependencies": { - "compare-func": "^2.0.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">=16" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", - "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "dev": true, "dependencies": { - "compare-func": "^2.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=16" + "node": ">= 0.4" } }, - "node_modules/conventional-commit-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", - "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", - "dev": true - }, - "node_modules/conventional-commits-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", - "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "node_modules/call-bound": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.2.tgz", + "integrity": "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==", "dev": true, "dependencies": { - "is-text-path": "^2.0.0", - "JSONStream": "^1.3.5", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.mjs" + "call-bind": "^1.0.8", + "get-intrinsic": "^1.2.5" }, "engines": { - "node": ">=16" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/core-js": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", - "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "hasInstallScript": true, + "engines": { + "node": ">=10" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "node_modules/caniuse-lite": { + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true, - "dependencies": { - "browserslist": "^4.23.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, "dependencies": { - "object-assign": "^4", - "vary": "^1" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" + "node_modules/chai/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "engines": { + "node": ">=4" } }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { - "node": ">=14" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.1.0.tgz", - "integrity": "sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "dependencies": { - "jiti": "^1.21.6" - }, "engines": { - "node": ">=v16" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=8.2", - "typescript": ">=4" + "node": ">=10" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, "dependencies": { - "node-fetch": "^2.6.12" + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/chrome-launcher": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.1.2.tgz", + "integrity": "sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^2.0.1" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" }, "engines": { - "node": ">= 8" + "node": ">=12.13.0" } }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "peer": true, "engines": { - "node": ">=8" + "node": ">=6.0" } }, - "node_modules/csp_evaluator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.1.tgz", - "integrity": "sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==" - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "node_modules/chromium": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/chromium/-/chromium-3.0.3.tgz", + "integrity": "sha512-TfbzP/3t38Us5xrbb9x87M/y5I/j3jx0zeJhhQ72gjp6dwJuhVP6hBZnBH4wEg7512VVXk9zCfTuPFOdw7bQqg==", "dev": true, + "hasInstallScript": true, + "os": [ + "darwin", + "linux", + "win32" + ], "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "cachedir": "^2.3.0", + "debug": "^4.1.0", + "extract-zip": "^1.7.0", + "got": "^11.5.1", + "progress": "^2.0.3", + "rimraf": "^2.7.1", + "tmp": "0.0.33", + "tunnel": "^0.0.6" + } + }, + "node_modules/chromium-bidi": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", + "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "peerDependencies": { + "devtools-protocol": "*" } }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "node_modules/chromium/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" + "os-tmpdir": "~1.0.2" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": ">=0.6.0" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node": ">=8" } }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", "dev": true }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, "dependencies": { - "css-tree": "~2.2.0" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=4" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=0.8.0" } }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dependencies": { - "rrweb-cssom": "^0.7.1" + "restore-cursor": "^5.0.0" }, "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "dev": true + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "node_modules/cz-conventional-changelog": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", - "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", - "dev": true, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dependencies": { - "chalk": "^2.4.1", - "commitizen": "^4.0.3", - "conventional-commit-types": "^3.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "word-wrap": "^1.0.3" + "string-width": "^4.2.0" }, "engines": { - "node": ">= 10" + "node": "10.* || >= 12.*" }, "optionalDependencies": { - "@commitlint/load": ">6.1.1" + "@colors/colors": "1.5.0" } }, - "node_modules/cz-conventional-changelog/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/cz-conventional-changelog/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/cz-conventional-changelog/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "has-flag": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/dargs": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", - "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", - "dev": true, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dependencies": { - "assert-plus": "^1.0.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=0.10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, "engines": { - "node": ">= 14" + "node": ">= 12" } }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "node_modules/clipanion": { + "version": "4.0.0-rc.4", + "resolved": "https://registry.npmjs.org/clipanion/-/clipanion-4.0.0-rc.4.tgz", + "integrity": "sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q==", "dev": true, + "workspaces": [ + "website" + ], "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" + "typanion": "^3.8.0" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "typanion": "*" } }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=7.0.0" } }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "dev": true + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "mimic-response": "^3.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, "dependencies": { - "type-detect": "^4.0.0" + "mimic-response": "^1.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, "engines": { - "node": ">=6" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "color-name": "1.1.3" } }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "devOptional": true }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "dev": true, + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/deepmerge-ts": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz", - "integrity": "sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==", + "node_modules/columnify/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=16.0.0" + "node": ">=8" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "clone": "^1.0.2" + "delayed-stream": "~1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "engines": { - "node": ">=10" + "node": ">= 12" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/commitizen": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz", + "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "cachedir": "2.3.0", + "cz-conventional-changelog": "3.3.0", + "dedent": "0.7.0", + "detect-indent": "6.1.0", + "find-node-modules": "^2.1.2", + "find-root": "1.1.0", + "fs-extra": "9.1.0", + "glob": "7.2.3", + "inquirer": "8.2.5", + "is-utf8": "^0.2.1", + "lodash": "4.17.21", + "minimist": "1.2.7", + "strip-bom": "4.0.0", + "strip-json-comments": "3.1.1" }, - "engines": { - "node": ">= 0.4" + "bin": { + "commitizen": "bin/commitizen", + "cz": "bin/git-cz", + "git-cz": "bin/git-cz" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "engines": { - "node": ">=8" + "node": ">= 12" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/commitizen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "node_modules/commitizen/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/commitizen/node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": ">=6" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/commitizen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "node_modules/commitizen/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "node_modules/commitizen/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/commitizen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "node_modules/commitizen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commitizen/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/commitizen/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 4.0.0" + "node": ">=10" } }, - "node_modules/devtools-protocol": { - "version": "0.0.1312386", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", - "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==" - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "node_modules/commitizen/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "node_modules/commitizen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/commitizen/node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", "dev": true, "dependencies": { - "path-type": "^4.0.0" + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=12.0.0" } }, - "node_modules/doctrine": { + "node_modules/commitizen/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true + "node_modules/commitizen/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/commitizen/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "engines": { + "node": "*" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/commitizen/node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/commitizen/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/commitizen/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "domelementtype": "^2.3.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">= 4" + "node": ">=6" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "node_modules/commitizen/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "node_modules/commitizen/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { "node": ">=8" } }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "node_modules/commitizen/node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", - "engines": { - "node": ">=12" + "node": ">=0.12.0" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "node_modules/commitizen/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "node_modules/commitizen/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/easy-table": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.2.0.tgz", - "integrity": "sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==", + "node_modules/commitizen/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, - "optionalDependencies": { - "wcwidth": "^1.0.1" + "engines": { + "node": ">=8" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "node_modules/commitizen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/ecc-jsbn/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "node_modules/commitizen/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.43", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.43.tgz", - "integrity": "sha512-NxnmFBHDl5Sachd2P46O7UJiMaMHMLSofoIWVJq3mj8NJgG0umiSeljAVP9lGzjI0UDLJJ5jjoGjcrB8RSbjLQ==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "node_modules/commitlint-plugin-tense": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/commitlint-plugin-tense/-/commitlint-plugin-tense-1.0.3.tgz", + "integrity": "sha512-qP+XJf6ueDf+PAlbzr5QPdYLuqUS5XGlUmDfoSHzXtY/95zTrMZQuMp+SPLKjuio9cQBirJu3WLCqBl7kngS3g==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "@commitlint/message": "^16.2.1", + "fast-tag-pos": "^2.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "@commitlint/lint": ">=7.6.0" } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/commitlint-plugin-tense/node_modules/@commitlint/message": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-16.2.1.tgz", + "integrity": "sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==", "dev": true, "engines": { - "node": ">= 4" + "node": ">=v12" } }, - "node_modules/encodeurl": { + "node_modules/compare-func": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { - "once": "^1.4.0" + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" } }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.6" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "node_modules/compression": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", + "dev": true, "dependencies": { - "ansi-colors": "^4.1.1" + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=8.6" + "node": ">= 0.8.0" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, - "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, + "engines": [ + "node >= 0.8" + ], "dependencies": { - "is-arrayish": "^0.2.1" - } + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" + } + }, + "node_modules/configstore/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/configstore/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/configstore/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.6" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">= 0.6" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" + "compare-func": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=16" } }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", "dev": true }, - "node_modules/es-iterator-helpers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", - "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.4", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.3", - "safe-array-concat": "^1.1.2" + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" }, "engines": { - "node": ">= 0.4" + "node": ">=16" } }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/cookies": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "dev": true, "dependencies": { - "es-errors": "^1.3.0" + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/core-js": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", + "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", + "dev": true, + "dependencies": { + "jiti": "^1.19.1" + }, + "engines": { + "node": ">=v16" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=8.2", + "typescript": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "dev": true, + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/csp_evaluator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.1.tgz", + "integrity": "sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==" + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", + "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", + "dev": true, + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/cz-conventional-changelog": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "word-wrap": "^1.0.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@commitlint/load": ">6.1.1" + } + }, + "node_modules/cz-conventional-changelog/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cz-conventional-changelog/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cz-conventional-changelog/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/cz-conventional-changelog/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deepmerge-ts": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.3.tgz", + "integrity": "sha512-qCSH6I0INPxd9Y1VtAiLpnYvz5O//6rCfJXKk0z66Up9/VOSr+1yS8XSKA5IWRxjocFGlzPyaZYe+jxq7OOLtQ==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "dev": true, + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", + "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "dependencies": { + "dotenv": "^16.4.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/easy-table": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.2.0.tgz", + "integrity": "sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "optionalDependencies": { + "wcwidth": "^1.0.1" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecc-jsbn/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", + "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "peer": true + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" + "node": ">=12" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/esbuild": { + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" } }, "node_modules/escalade": { @@ -12282,58 +13142,61 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", + "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.16.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.5", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-compat-utils": { @@ -12351,6 +13214,20 @@ "eslint": ">=6.0.0" } }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -12406,69 +13283,6 @@ } } }, - "node_modules/eslint-import-resolver-typescript/node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/eslint-module-utils": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", @@ -12486,134 +13300,65 @@ } } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-deprecation": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-2.0.0.tgz", - "integrity": "sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "^6.0.0", - "tslib": "^2.3.1", - "tsutils": "^3.21.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "typescript": "^4.2.4 || ^5.0.0" - } - }, - "node_modules/eslint-plugin-es-x": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", - "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/ota-meshi", - "https://opencollective.com/eslint" - ], - "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.11.0", - "eslint-compat-utils": "^0.5.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": ">=8" - } - }, - "node_modules/eslint-plugin-functional": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-functional/-/eslint-plugin-functional-6.6.3.tgz", - "integrity": "sha512-sVbbvNvwX3HVkXAykKyoNLv57r4DPF7f1sy+/8j4YtzLYVQPGljMUWv3T6Kd4lwnnjmcKuj0EkIbS+knL6P5jw==", - "dev": true, - "funding": [ - { - "type": "ko-fi", - "url": "https://ko-fi.com/rebeccastevens" - } - ], - "dependencies": { - "@typescript-eslint/utils": "^7.3.1", - "deepmerge-ts": "^5.1.0", - "escape-string-regexp": "^4.0.0", - "is-immutable-type": "^4.0.0", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": ">=16.10.0" - }, - "peerDependencies": { - "eslint": "^8.0.0 || ^9.0.0", - "typescript": ">=4.3.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-functional/node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-functional/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^14.18.0 || >=16.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "eslint": ">=8" } }, - "node_modules/eslint-plugin-functional/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "node_modules/eslint-plugin-functional": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-functional/-/eslint-plugin-functional-7.1.0.tgz", + "integrity": "sha512-eu7lVAF9dDTw2xzlsLDvJRXx9t4g/S/pmCSdGx2oFmibmkz2LMoPDu7B+UA9CV/RzvNr4wWd4apc71nMAazdKQ==", "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/eslint-plugin-functional" + } + ], "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/utils": "^8.10.0", + "deepmerge-ts": "^7.1.3", + "escape-string-regexp": "^5.0.0", + "is-immutable-type": "^5.0.0", + "ts-api-utils": "^1.3.0", + "ts-declaration-location": "^1.0.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">=v18.18.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "eslint": "^9.0.0", + "typescript": ">=4.7.4" }, "peerDependenciesMeta": { "typescript": { @@ -12622,86 +13367,71 @@ } }, "node_modules/eslint-plugin-functional/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", + "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/eslint-plugin-functional/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/eslint-plugin-functional/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/eslint-plugin-functional/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { @@ -12789,90 +13519,68 @@ "strip-bom": "^3.0.0" } }, - "node_modules/eslint-plugin-n": { - "version": "16.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", - "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", + "node_modules/eslint-plugin-jest-formatting": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest-formatting/-/eslint-plugin-jest-formatting-3.1.0.tgz", + "integrity": "sha512-XyysraZ1JSgGbLSDxjj5HzKKh0glgWf+7CkqxbTqb7zEhW7X2WHo5SBQ8cGhnszKN+2Lj3/oevBlHNbHezoc/A==", "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.5.0", - "get-tsconfig": "^4.7.0", - "globals": "^13.24.0", - "ignore": "^5.2.4", - "is-builtin-module": "^3.2.1", - "is-core-module": "^2.12.1", - "minimatch": "^3.1.2", - "resolve": "^1.22.2", - "semver": "^7.5.3" - }, "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-n/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "eslint": ">=0.8.0" } }, - "node_modules/eslint-plugin-n/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/eslint-plugin-n": { + "version": "17.15.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.15.0.tgz", + "integrity": "sha512-xF3zJkOfLlFOm5TvmqmsnA9/fO+/z2pYs0dkuKXKN/ymS6UB1yEcaoIkqxLKQ9Dw/WmLX/Tdh6/5ZS5azVixFQ==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "@eslint-community/eslint-utils": "^4.4.1", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "ignore": "^5.3.2", + "minimatch": "^9.0.5", + "semver": "^7.6.3" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" } }, "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-n/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/eslint-plugin-promise": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", + "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -12914,15 +13622,15 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", + "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", "dev": true, "engines": { "node": ">=10" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { @@ -12986,62 +13694,90 @@ } }, "node_modules/eslint-plugin-sonarjs": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.22.0.tgz", - "integrity": "sha512-LJz+TCosMOBLkbAsNk6Q1lCgmK6qNO5RCqtOAle1DCnqqnmxoSTPHakZ1R7Gcnjhw5n7VDcAwuqefmpd4XXPLQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-1.0.4.tgz", + "integrity": "sha512-jF0eGCUsq/HzMub4ExAyD8x1oEgjOyB9XVytYGyWgSFvdiJQJp6IuP7RmtauCf06o6N/kZErh+zW4b10y1WZ+Q==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-unicorn": { - "version": "48.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-48.0.1.tgz", - "integrity": "sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==", + "version": "56.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz", + "integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.24.7", "@eslint-community/eslint-utils": "^4.4.0", - "ci-info": "^3.8.0", + "ci-info": "^4.0.0", "clean-regexp": "^1.0.0", - "esquery": "^1.5.0", + "core-js-compat": "^3.38.1", + "esquery": "^1.6.0", + "globals": "^15.9.0", "indent-string": "^4.0.0", "is-builtin-module": "^3.2.1", "jsesc": "^3.0.2", - "lodash": "^4.17.21", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.27", "regjsparser": "^0.10.0", - "semver": "^7.5.4", + "semver": "^7.6.3", "strip-indent": "^3.0.0" }, "engines": { - "node": ">=16" + "node": ">=18.18" }, "funding": { "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { - "eslint": ">=8.44.0" + "eslint": ">=8.56.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/ci-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" } }, "node_modules/eslint-plugin-vitest": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/eslint-plugin-vitest/-/eslint-plugin-vitest-0.3.26.tgz", - "integrity": "sha512-oxe5JSPgRjco8caVLTh7Ti8PxpwJdhSV0hTQAmkFcNcmy/9DnqLB/oNVRA11RmVRP//2+jIIT6JuBEcpW3obYg==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-vitest/-/eslint-plugin-vitest-0.5.4.tgz", + "integrity": "sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "^7.1.1" + "@typescript-eslint/utils": "^7.7.1" }, "engines": { "node": "^18.0.0 || >= 20.0.0" }, "peerDependencies": { - "eslint": ">=8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "vitest": "*" }, "peerDependenciesMeta": { @@ -13166,15 +13902,15 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -13191,38 +13927,33 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/eslint/node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -13252,6 +13983,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -13292,6 +14028,33 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -13308,14 +14071,11 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13329,6 +14089,17 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -13381,17 +14152,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13403,21 +14163,11 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -13523,104 +14273,55 @@ } }, "node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/execa/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/execa/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { - "path-key": "^2.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" + "node": ">=12" }, - "bin": { - "which": "bin/which" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, "node_modules/executable": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", @@ -13736,12 +14437,61 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -13849,9 +14599,9 @@ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -13861,7 +14611,7 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-glob/node_modules/@nodelib/fs.scandir": { @@ -13955,6 +14705,7 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -14005,14 +14756,14 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-loader": { @@ -14139,12 +14890,42 @@ "ms": "2.0.0" } }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-file-up": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-2.0.1.tgz", + "integrity": "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==", + "dev": true, + "dependencies": { + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-node-modules": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", @@ -14155,6 +14936,18 @@ "merge": "^2.1.1" } }, + "node_modules/find-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-2.0.0.tgz", + "integrity": "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==", + "dev": true, + "dependencies": { + "find-file-up": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -14213,75 +15006,19 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/flat-cache/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "flat": "cli.js" } }, - "node_modules/flat-cache/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dependencies": { - "brace-expansion": "^1.1.7" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "*" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, "node_modules/flatted": { @@ -14290,9 +15027,9 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.8.tgz", + "integrity": "sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==", "funding": [ { "type": "individual", @@ -14332,17 +15069,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -14353,9 +15079,9 @@ } }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -14383,6 +15109,14 @@ "node": ">= 0.6" } }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -14404,7 +15138,8 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -14474,9 +15209,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "engines": { "node": ">=18" }, @@ -14494,16 +15229,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", "dev": true, "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -14522,12 +15262,15 @@ } }, "node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { @@ -14629,6 +15372,13 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, "node_modules/glob/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -14707,12 +15457,15 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "15.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", + "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", "dev": true, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -14751,76 +15504,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/globby/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/globby/node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/globby/node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/globby/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14859,7 +15549,8 @@ "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/graphql": { "version": "16.9.0", @@ -14948,15 +15639,6 @@ "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", "dev": true }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -15000,9 +15682,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "engines": { "node": ">= 0.4" @@ -15095,6 +15777,19 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dev": true, + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -15102,19 +15797,28 @@ "dev": true }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, "dependencies": { - "depd": "2.0.0", + "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" } }, "node_modules/http-link-header": { @@ -15151,6 +15855,23 @@ "node": ">= 14" } }, + "node_modules/http-proxy-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz", + "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/http-server": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", @@ -15249,14 +15970,14 @@ } }, "node_modules/http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", "dev": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^2.0.2", - "sshpk": "^1.14.1" + "sshpk": "^1.18.0" }, "engines": { "node": ">=0.10" @@ -15294,12 +16015,12 @@ } }, "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=16.17.0" } }, "node_modules/husky": { @@ -15437,6 +16158,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -15564,6 +16286,15 @@ "node": ">=8" } }, + "node_modules/inquirer/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/inquirer/node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -15615,6 +16346,12 @@ "node": ">=8" } }, + "node_modules/inquirer/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/inquirer/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -15682,14 +16419,14 @@ } }, "node_modules/intl-messageformat": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.1.tgz", - "integrity": "sha512-xQuJW2WcyzNJZWUu5xTVPOmNSA1Sowuu/NKFdUid5Fxx/Yl6/s4DefTU/y7zy+irZLDmFGmTLtnM8FqpN05wlA==", + "version": "10.5.14", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.14.tgz", + "integrity": "sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/fast-memoize": "2.2.1", - "@formatjs/icu-messageformat-parser": "2.8.0", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.0.0", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.7.8", + "tslib": "^2.4.0" } }, "node_modules/ip-address": { @@ -15718,22 +16455,6 @@ "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -15772,25 +16493,28 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15815,9 +16539,9 @@ } }, "node_modules/is-bun-module": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", - "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.1.0.tgz", + "integrity": "sha512-4mTAVPlrXpaN3jtF0lsnPCMGnq4+qZjVIKq0HCpfcqf8OC1SM5oATCIAPM5V5FN05qp2NNnFndphmdZS9CV3hA==", "dev": true, "dependencies": { "semver": "^7.6.3" @@ -15866,12 +16590,13 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15909,12 +16634,15 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15976,14 +16704,14 @@ } }, "node_modules/is-immutable-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-immutable-type/-/is-immutable-type-4.0.0.tgz", - "integrity": "sha512-gyFBCXv+NikTs8/PGZhgjbMmFZQ5jvHGZIsVu6+/9Bk4K7imlWBIDN7hTr9fNioGzFg71I4YM3z8f0aKXarTAw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-immutable-type/-/is-immutable-type-5.0.0.tgz", + "integrity": "sha512-mcvHasqbRBWJznuPqqHRKiJgYAz60sZ0mvO3bN70JbkuK7ksfmgc489aKZYxMEjIbRvyOseaTjaRZLRF/xFeRA==", "dev": true, "dependencies": { - "@typescript-eslint/type-utils": "^7.2.0", + "@typescript-eslint/type-utils": "^8.0.0", "ts-api-utils": "^1.3.0", - "ts-declaration-location": "^1.0.0" + "ts-declaration-location": "^1.0.4" }, "peerDependencies": { "eslint": "*", @@ -16032,12 +16760,13 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", + "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -16054,14 +16783,6 @@ "node": ">=8" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -16071,6 +16792,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -16084,13 +16814,15 @@ "dev": true }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -16127,21 +16859,25 @@ } }, "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", + "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -16151,12 +16887,14 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -16285,6 +17023,24 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/isomorphic-rslog": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.5.tgz", + "integrity": "sha512-pkU3vvajRJ0LKLaMFy8Cj7ElbFUdkQKVhUk+DQsVCYsLW4uulU65C2s3l+Sm5OtiOwprzkYYcAIJa/COwCYHWA==", + "dev": true, + "engines": { + "node": ">=14.17.6" + } + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, + "peerDependencies": { + "ws": "*" + } + }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -16388,16 +17144,17 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", - "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", + "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", "dev": true, "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "reflect.getprototypeof": "^1.0.8", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -16555,6 +17312,23 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-circus/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/jest-circus/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -16604,6 +17378,24 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/jest-circus/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-circus/node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -16659,6 +17451,17 @@ "node": ">=8" } }, + "node_modules/jest-circus/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -18202,7 +19005,7 @@ "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, + "devOptional": true, "bin": { "jiti": "bin/jiti.js" } @@ -18227,11 +19030,12 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { - "argparse": "^2.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -18319,15 +19123,15 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/json-buffer": { @@ -18507,6 +19311,18 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dev": true, + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -18524,9 +19340,9 @@ } }, "node_modules/knip": { - "version": "5.33.3", - "resolved": "https://registry.npmjs.org/knip/-/knip-5.33.3.tgz", - "integrity": "sha512-saUxedVDCa/8p3w445at66vLmYKretzYsX7+elMJ5ROWGzU+1aTRm3EmKELTaho1ue7BlwJB5BxLJROy43+LtQ==", + "version": "5.37.2", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.37.2.tgz", + "integrity": "sha512-Rs9HHTgmUacyKxchP4kRwG8idi0tzVHVpSyo4EM9sNGDSrPq20lhKXOWMFmShGCV6CH2352393Ok/qG1NblCMw==", "dev": true, "funding": [ { @@ -18548,10 +19364,10 @@ "easy-table": "1.2.0", "enhanced-resolve": "^5.17.1", "fast-glob": "^3.3.2", - "jiti": "^2.3.3", + "jiti": "^2.4.0", "js-yaml": "^4.1.0", "minimist": "^1.2.8", - "picocolors": "^1.0.0", + "picocolors": "^1.1.0", "picomatch": "^4.0.1", "pretty-ms": "^9.0.0", "smol-toml": "^1.3.0", @@ -18607,41 +19423,31 @@ "node": ">= 8" } }, - "node_modules/knip/node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "node_modules/knip/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/knip/node_modules/jiti": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.0.tgz", + "integrity": "sha512-H5UpaUI+aHOqZXlYOaFP/8AzKsg+guWu+Pr3Y8i7+Y3zr1aXAvCvTAQ1RxSc6oVD8R8c7brgNtTVP91E7upH/g==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" + "bin": { + "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/knip/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/knip/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "argparse": "^2.0.1" }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/knip/node_modules/jiti": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.3.3.tgz", - "integrity": "sha512-EX4oNDwcXSivPrw2qKH2LB5PoFxEvgtv2JgwW0bU858HoLQ+kutSvjLMUqBd0PeJYEinLWhoI9Ol0eYMqj/wNQ==", - "dev": true, "bin": { - "jiti": "lib/jiti-cli.mjs" + "js-yaml": "bin/js-yaml.js" } }, "node_modules/knip/node_modules/picomatch": { @@ -18668,6 +19474,59 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/koa": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", + "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", + "dev": true, + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -18690,13 +19549,13 @@ } }, "node_modules/lighthouse": { - "version": "12.2.1", - "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.2.1.tgz", - "integrity": "sha512-3deFGaQ/eTCzQekgWUcgLdWAjS81KHPG406r+A61KKLsxEcORw34A1aixU6G2lgqpdd95QZpdoSKxyy/jJfsHg==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.2.0.tgz", + "integrity": "sha512-JU9IvjcVxwtsFzB4xTuDWx46hRJF7yYfiTDgtFA0U4nt4TUom9mus81QNt/tDr4y18wlphBycuLysX8J6yplDw==", "dependencies": { "@paulirish/trace_engine": "0.0.32", "@sentry/node": "^6.17.4", - "axe-core": "^4.10.0", + "axe-core": "^4.9.1", "chrome-launcher": "^1.1.2", "configstore": "^5.0.1", "csp_evaluator": "1.1.1", @@ -18713,7 +19572,7 @@ "metaviewport-parser": "0.3.0", "open": "^8.4.0", "parse-cache-control": "1.0.1", - "puppeteer-core": "^23.3.0", + "puppeteer-core": "^22.15.0", "robots-parser": "^3.0.1", "semver": "^5.3.0", "speedline-core": "^1.4.3", @@ -18788,9 +19647,9 @@ } }, "node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -18803,6 +19662,16 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, "node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -18857,6 +19726,12 @@ "signal-exit": "^3.0.2" } }, + "node_modules/lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -18868,6 +19743,12 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, + "node_modules/lodash.clonedeepwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", + "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", + "dev": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -19151,6 +20032,28 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", + "dev": true + }, "node_modules/longest": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", @@ -19243,6 +20146,15 @@ "yallist": "^3.0.2" } }, + "node_modules/luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", @@ -19253,9 +20165,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -19307,6 +20219,15 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==" }, + "node_modules/math-intrinsics": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", + "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -19323,9 +20244,9 @@ } }, "node_modules/memfs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.14.0.tgz", - "integrity": "sha512-JUeY0F/fQZgIod31Ja1eJgiSxLn7BfQlCnqhwXFBzFHEw63OdLK7VJUJ7bnzNsWgCyoUP5tEp1VRY8rDaYzqOA==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.11.1.tgz", + "integrity": "sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==", "dev": true, "dependencies": { "@jsonjoy.com/json-pack": "^1.0.3", @@ -19451,11 +20372,15 @@ } }, "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mimic-function": { @@ -19536,15 +20461,15 @@ } }, "node_modules/mlly": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.2.tgz", - "integrity": "sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", "dev": true, "dependencies": { - "acorn": "^8.12.1", + "acorn": "^8.11.3", "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "ufo": "^1.5.4" + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" } }, "node_modules/moment": { @@ -19566,9 +20491,10 @@ } }, "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/multi-progress-bars": { "version": "5.0.3", @@ -19584,9 +20510,9 @@ } }, "node_modules/multi-progress-bars/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { "node": ">=12" }, @@ -19803,6 +20729,20 @@ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, + "node_modules/node-schedule": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", + "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", + "dev": true, + "dependencies": { + "cron-parser": "^4.2.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -19890,37 +20830,37 @@ } }, "node_modules/nwsapi": { - "version": "2.2.13", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", - "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", "dev": true }, "node_modules/nx": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/nx/-/nx-18.3.5.tgz", - "integrity": "sha512-wWcvwoTgiT5okdrG0RIWm1tepC17bDmSpw+MrOxnjfBjARQNTURkiq4U6cxjCVsCxNHxCrlAaBSQLZeBgJZTzQ==", + "version": "19.8.13", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.8.13.tgz", + "integrity": "sha512-qAoL/Qpc+1l/5UshAXyB8m27yCY0Tzol/udJhc1kD7Dt6yg8Ngxgi1ZtTmJn6yaLDOsW+oteatQPMtqsk8Lkdg==", "hasInstallScript": true, "dependencies": { - "@nrwl/tao": "18.3.5", + "@napi-rs/wasm-runtime": "0.2.4", + "@nrwl/tao": "19.8.13", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.6", - "axios": "^1.6.0", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.7.4", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", "cliui": "^8.0.1", - "dotenv": "~16.3.1", - "dotenv-expand": "~10.0.0", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", "enquirer": "~2.3.6", "figures": "3.2.0", "flat": "^5.0.2", - "fs-extra": "^11.1.0", + "front-matter": "^4.0.2", "ignore": "^5.0.4", "jest-diff": "^29.4.1", - "js-yaml": "4.1.0", "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", + "lines-and-columns": "2.0.3", "minimatch": "9.0.3", "node-machine-id": "1.1.12", "npm-run-path": "^4.0.1", @@ -19941,73 +20881,28 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "18.3.5", - "@nx/nx-darwin-x64": "18.3.5", - "@nx/nx-freebsd-x64": "18.3.5", - "@nx/nx-linux-arm-gnueabihf": "18.3.5", - "@nx/nx-linux-arm64-gnu": "18.3.5", - "@nx/nx-linux-arm64-musl": "18.3.5", - "@nx/nx-linux-x64-gnu": "18.3.5", - "@nx/nx-linux-x64-musl": "18.3.5", - "@nx/nx-win32-arm64-msvc": "18.3.5", - "@nx/nx-win32-x64-msvc": "18.3.5" + "@nx/nx-darwin-arm64": "19.8.13", + "@nx/nx-darwin-x64": "19.8.13", + "@nx/nx-freebsd-x64": "19.8.13", + "@nx/nx-linux-arm-gnueabihf": "19.8.13", + "@nx/nx-linux-arm64-gnu": "19.8.13", + "@nx/nx-linux-arm64-musl": "19.8.13", + "@nx/nx-linux-x64-gnu": "19.8.13", + "@nx/nx-linux-x64-musl": "19.8.13", + "@nx/nx-win32-arm64-msvc": "19.8.13", + "@nx/nx-win32-x64-msvc": "19.8.13" }, "peerDependencies": { "@swc-node/register": "^1.8.0", "@swc/core": "^1.3.85" }, "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/nx/node_modules/@nx/nx-darwin-arm64": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.3.5.tgz", - "integrity": "sha512-4I5UpZ/x2WO9OQyETXKjaYhXiZKUTYcLPewruRMODWu6lgTM9hHci0SqMQB+TWe3f80K8VT8J8x3+uJjvllGlg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/nx/node_modules/@nx/nx-darwin-x64": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.3.5.tgz", - "integrity": "sha512-Drn6jOG237AD/s6OWPt06bsMj0coGKA5Ce1y5gfLhptOGk4S4UPE/Ay5YCjq+/yhTo1gDHzCHxH0uW2X9MN9Fg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/nx/node_modules/@nx/nx-linux-x64-gnu": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.3.5.tgz", - "integrity": "sha512-vYrikG6ff4I9cvr3Ysk3y3gjQ9cDcvr3iAr+4qqcQ4qVE+OLL2++JDS6xfPvG/TbS3GTQpyy2STRBwiHgxTeJw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } } }, "node_modules/nx/node_modules/ansi-styles": { @@ -20066,17 +20961,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/nx/node_modules/dotenv": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.2.tgz", - "integrity": "sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, "node_modules/nx/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -20098,6 +20982,14 @@ "node": ">=8" } }, + "node_modules/nx/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, "node_modules/nx/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -20138,6 +21030,11 @@ "node": ">=8" } }, + "node_modules/nx/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/nx/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -20183,26 +21080,10 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, "engines": { "node": ">= 0.4" }, @@ -20269,6 +21150,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.values": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", @@ -20325,19 +21220,26 @@ } }, "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "dependencies": { - "mimic-function": "^5.0.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", + "dev": true + }, "node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", @@ -20464,6 +21366,14 @@ "node": ">=8" } }, + "node_modules/ora/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, "node_modules/ora/node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -20490,6 +21400,11 @@ "node": ">=8" } }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/ora/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -20662,9 +21577,9 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, "node_modules/pako": { "version": "0.2.9", @@ -20739,12 +21654,12 @@ } }, "node_modules/parse5": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", - "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, "dependencies": { - "entities": "^4.5.0" + "entities": "^4.4.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -20772,6 +21687,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -20841,9 +21757,9 @@ } }, "node_modules/peek-readable": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.3.1.tgz", - "integrity": "sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.2.0.tgz", + "integrity": "sha512-U94a+eXHzct7vAd19GH3UQ2dH4Satbng0MyYTMaQatL0pvYYL5CTPR25HBhKtecl+4bfu1/i3vC6k0hydO5Vcw==", "dev": true, "engines": { "node": ">=14.16" @@ -20876,9 +21792,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true }, "node_modules/picomatch": { @@ -20999,19 +21915,28 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 6" } }, + "node_modules/piscina": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", + "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", + "dev": true, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, "node_modules/pkg-types": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz", - "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", + "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", "dev": true, "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.2", + "confbox": "^0.1.7", + "mlly": "^1.7.1", "pathe": "^1.1.2" } }, @@ -21081,9 +22006,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.45", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", "dev": true, "funding": [ { @@ -21101,8 +22026,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -21117,10 +22042,11 @@ } }, "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", + "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -21280,9 +22206,9 @@ "dev": true }, "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -21318,26 +22244,20 @@ } }, "node_modules/puppeteer-core": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.6.0.tgz", - "integrity": "sha512-se1bhgUpR9C529SgHGr/eyT92mYyQPAhA2S9pGtGrVG2xob9qE6Pbp7TlqiSPlnnY1lINqhn6/67EwkdzOmKqQ==", + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", + "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", "dependencies": { - "@puppeteer/browsers": "2.4.0", - "chromium-bidi": "0.8.0", - "debug": "^4.3.7", - "devtools-protocol": "0.0.1354347", - "typed-query-selector": "^2.12.0", + "@puppeteer/browsers": "2.3.0", + "chromium-bidi": "0.6.3", + "debug": "^4.3.6", + "devtools-protocol": "0.0.1312386", "ws": "^8.18.0" }, "engines": { "node": ">=18" } }, - "node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1354347", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1354347.tgz", - "integrity": "sha512-BlmkSqV0V84E2WnEnoPnwyix57rQxAM5SKJjf4TbYOCGLAWtz8CDH8RIaGOjPgPCXo2Mce3kxSY497OySidY3Q==" - }, "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", @@ -21355,9 +22275,9 @@ ] }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", "dev": true, "dependencies": { "side-channel": "^1.0.6" @@ -21379,6 +22299,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -21417,6 +22338,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/rambda": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.0.tgz", + "integrity": "sha512-B7y7goUd+g0hNl5ODGUejNNERQL5gD8uANJ5Y5aHly8v0jKesFlwIe7prPfuJxttDpe3otQzHJ4NXMpTmL9ELA==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -21441,10 +22378,26 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "engines": { "node": ">= 0.8" @@ -21675,18 +22628,19 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz", + "integrity": "sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "dunder-proto": "^1.0.0", + "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "gopd": "^1.2.0", + "which-builtin-type": "^1.2.0" }, "engines": { "node": ">= 0.4" @@ -21702,9 +22656,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -21756,15 +22710,15 @@ } }, "node_modules/regexpu-core": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", - "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "dependencies": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.11.0", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -21772,24 +22726,27 @@ "node": ">=4" } }, + "node_modules/regexpu-core/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, "node_modules/regexpu-core/node_modules/regjsparser": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.1.tgz", - "integrity": "sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true - }, "node_modules/regjsparser": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", @@ -21924,26 +22881,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dependencies": { + "mimic-function": "^5.0.0" + }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -22009,12 +22976,12 @@ } }, "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", + "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", "dev": true, "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.5" }, "bin": { "rollup": "dist/bin/rollup" @@ -22024,25 +22991,64 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@rollup/rollup-android-arm-eabi": "4.21.2", + "@rollup/rollup-android-arm64": "4.21.2", + "@rollup/rollup-darwin-arm64": "4.21.2", + "@rollup/rollup-darwin-x64": "4.21.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", + "@rollup/rollup-linux-arm64-gnu": "4.21.2", + "@rollup/rollup-linux-arm64-musl": "4.21.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", + "@rollup/rollup-linux-s390x-gnu": "4.21.2", + "@rollup/rollup-linux-x64-gnu": "4.21.2", + "@rollup/rollup-linux-x64-musl": "4.21.2", + "@rollup/rollup-win32-arm64-msvc": "4.21.2", + "@rollup/rollup-win32-ia32-msvc": "4.21.2", + "@rollup/rollup-win32-x64-msvc": "4.21.2", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", + "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", + "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", + "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", @@ -22062,6 +23068,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -22134,14 +23141,14 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -22318,15 +23325,47 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "engines": { "node": ">= 0.8" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -22342,6 +23381,15 @@ "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -22424,9 +23472,15 @@ "dev": true }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/simple-git": { "version": "3.27.0", @@ -22581,6 +23635,12 @@ "node": ">=0.10.0" } }, + "node_modules/sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", + "dev": true + }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -22591,9 +23651,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -22735,13 +23795,13 @@ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, "node_modules/std-env": { @@ -22759,28 +23819,62 @@ "graceful-fs": "^4.1.3" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "dependencies": { - "internal-slot": "^1.0.4" + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8.0" } }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "dev": true + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } }, "node_modules/streamx": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", - "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.0.tgz", + "integrity": "sha512-ZGd1LhDeGFucr1CUCTBOS58ZhEendd0ttpGT3usTvosS4ntIwKN9LJFp+OeCSprsCPL14BXVRZlHGRY1V9PVzQ==", "dependencies": { "fast-fifo": "^1.3.2", "queue-tick": "^1.0.1", @@ -22994,9 +24088,9 @@ } }, "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { "node": ">=12" }, @@ -23023,12 +24117,15 @@ } }, "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-indent": { @@ -23177,872 +24274,696 @@ "url": "https://opencollective.com/svgo" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" - } - }, - "node_modules/tar-fs/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/terminal-size": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/terminal-size/-/terminal-size-4.0.0.tgz", - "integrity": "sha512-rcdty1xZ2/BkWa4ANjWRp4JGpda2quksXIHgn5TMjNBPZfwzJIgR68DKfSYiTL+CZWowDX/sbOo5ME/FRURvYQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/text-decoder": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", - "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==" - }, - "node_modules/text-extensions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", - "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", - "dev": true, - "engines": { - "node": ">=10.18" - }, - "peerDependencies": { - "tslib": "^2" - } - }, - "node_modules/third-party-web": { - "version": "0.24.5", - "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.24.5.tgz", - "integrity": "sha512-1rUOdMYpNTRajgk1F7CmHD26oA6rTKekBjHay854J6OkPXeNyPcR54rhWDaamlWyi9t2wAVPQESdedBhucmOLA==" - }, - "node_modules/thread-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", - "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", - "dev": true, - "dependencies": { - "real-require": "^0.2.0" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, - "node_modules/tinyexec": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", - "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "engines": { - "node": ">=14.0.0" + "node": ">= 10" } }, - "node_modules/tinyspy": { + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, "engines": { - "node": ">=14.0.0" + "node": ">=6" } }, - "node_modules/tldts-core": { - "version": "6.1.54", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.54.tgz", - "integrity": "sha512-5cc42+0G0EjYRDfIJHKraaT3I5kPm7j6or3Zh1T9sF+Ftj1T+isT4thicUyQQ1bwN7/xjHQIuY2fXCoXP8Haqg==" + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } }, - "node_modules/tldts-icann": { - "version": "6.1.54", - "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-6.1.54.tgz", - "integrity": "sha512-DIOINrFZY/l/FIhjKvXfQnfpAF4+rBVWt9P7rWEGF71ZhZDVbyk6vMlU2r38U4i31DuPS+DdeTo3wi9I321PMQ==", + "node_modules/tar-fs/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dependencies": { - "tldts-core": "^6.1.54" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, "engines": { - "node": ">=14.14" + "node": ">=6" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/terminal-size": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terminal-size/-/terminal-size-4.0.0.tgz", + "integrity": "sha512-rcdty1xZ2/BkWa4ANjWRp4JGpda2quksXIHgn5TMjNBPZfwzJIgR68DKfSYiTL+CZWowDX/sbOo5ME/FRURvYQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/terser-webpack-plugin": { + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, + "peer": true, "dependencies": { - "is-number": "^7.0.0" + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { - "node": ">=8.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/terser-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { - "node": ">=0.6" + "node": ">=8" } }, - "node_modules/token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "peer": true, "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "node": ">= 10.13.0" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, "engines": { - "node": ">=6" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "peer": true, "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { - "node": ">= 4.0.0" + "node": ">=0.10.0" } }, - "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "peer": true, "dependencies": { - "punycode": "^2.3.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/tree-dump": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", - "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=10.0" + "node": "*" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/trim-repeated": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-2.0.0.tgz", - "integrity": "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==", + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "escape-string-regexp": "^5.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/trim-repeated/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/text-decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", + "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", "dev": true, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", "dev": true, "engines": { - "node": ">=16" + "node": ">=10.18" }, "peerDependencies": { - "typescript": ">=4.2.0" + "tslib": "^2" } }, - "node_modules/ts-declaration-location": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.4.tgz", - "integrity": "sha512-r4JoxYhKULbZuH81Pjrp9OEG5St7XWk7zXwGkLKhmVcjiBVHTJXV5wK6dEa9JKW5QGSTW6b1lOjxAKp8R1SQhg==", + "node_modules/third-party-web": { + "version": "0.24.5", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.24.5.tgz", + "integrity": "sha512-1rUOdMYpNTRajgk1F7CmHD26oA6rTKekBjHay854J6OkPXeNyPcR54rhWDaamlWyi9t2wAVPQESdedBhucmOLA==" + }, + "node_modules/thread-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", + "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", "dev": true, "dependencies": { - "minimatch": "^10.0.0" - }, - "peerDependencies": { - "typescript": ">=4.0.0" + "real-require": "^0.2.0" } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=14.0.0" } }, - "node_modules/tslib": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", - "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "node": ">=14.0.0" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsx": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", - "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", + "node_modules/tldts": { + "version": "6.1.64", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.64.tgz", + "integrity": "sha512-ph4AE5BXWIOsSy9stpoeo7bYe/Cy7VfpciIH4RhVZUPItCJmhqWCN0EVzxd8BOHiyNb42vuJc6NWTjJkg91Tuw==", "dev": true, "dependencies": { - "esbuild": "~0.23.0", - "get-tsconfig": "^4.7.5" + "tldts-core": "^6.1.64" }, "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "tldts": "bin/cli.js" } }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } + "node_modules/tldts-core": { + "version": "6.1.64", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.64.tgz", + "integrity": "sha512-uqnl8vGV16KsyflHOzqrYjjArjfXaU6rMPXYy2/ZWoRKCkXtghgB4VwTDXUG+t0OTGeSewNAG31/x1gCTfLt+Q==" }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "node_modules/tldts-icann": { + "version": "6.1.41", + "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-6.1.41.tgz", + "integrity": "sha512-XkIufk7M5+QmT+7yqLRgegJLyp0+mh0hKpoDzOuEcrcGav6ZI8FcO+iCe9/5amrxgx/DQ3SGNeWV0Hs/wEyEYA==", + "dependencies": { + "tldts-core": "^6.1.41" } }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "engines": { - "node": ">=18" + "node": ">=14.14" } }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "is-number": "^7.0.0" + }, "engines": { - "node": ">=18" + "node": ">=8.0" } }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": ">=0.6" } }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], + "node_modules/token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, "engines": { - "node": ">=18" + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">= 4.0.0" } }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "punycode": "^2.3.1" + }, "engines": { "node": ">=18" } }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], + "node_modules/trim-repeated": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-2.0.0.tgz", + "integrity": "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" } }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", - "cpu": [ - "x64" - ], + "node_modules/ts-declaration-location": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.5.tgz", + "integrity": "sha512-WqmlO9IoeYwCqJ2E9kHMcY9GZhhfLYItC3VnHDlPOrg6nNdUWS4wn4hhDZUPt60m1EvtjPIZyprTjpI992Bgzw==", "dev": true, - "optional": true, - "os": [ - "linux" + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } ], - "engines": { - "node": ">=18" + "dependencies": { + "minimatch": "^10.0.1" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], "engines": { - "node": ">=18" + "node": ">=0.6.x" } }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], + "node_modules/tsx": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.0.tgz", + "integrity": "sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, "engines": { - "node": ">=18" + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", "cpu": [ - "ia32" + "arm64" ], "dev": true, "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">=18" @@ -24134,7 +25055,10 @@ "version": "3.14.0", "resolved": "https://registry.npmjs.org/typanion/-/typanion-3.14.0.tgz", "integrity": "sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==", - "dev": true + "dev": true, + "workspaces": [ + "website" + ] }, "node_modules/type-check": { "version": "0.4.0", @@ -24157,9 +25081,9 @@ } }, "node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.28.0.tgz", + "integrity": "sha512-jXMwges/FVbFRe5lTMJZVEZCrO9kI9c8k0PA/z7nF3bo0JSCCLysvokFjNPIUK/itEMas10MQM+AiHoHt/T/XA==", "dev": true, "engines": { "node": ">=16" @@ -24254,11 +25178,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typed-query-selector": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==" - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -24274,10 +25193,10 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -24286,6 +25205,80 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.0.tgz", + "integrity": "sha512-Xq2rRjn6tzVpAyHr3+nmSg1/9k9aIHnJ2iZeOH7cfGOWqTkXTm3kwpQglEuLGdNrYvPF+2gtAs+/KF5rjVo+WQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.18.0", + "@typescript-eslint/parser": "8.18.0", + "@typescript-eslint/utils": "8.18.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz", + "integrity": "sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/type-utils": "8.18.0", + "@typescript-eslint/utils": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", + "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, "node_modules/ufo": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", @@ -24335,9 +25328,9 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true, "engines": { "node": ">=4" @@ -24357,9 +25350,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "engines": { "node": ">=4" @@ -24432,6 +25425,16 @@ "node": ">= 0.8" } }, + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", @@ -24572,12 +25575,12 @@ } }, "node_modules/verdaccio": { - "version": "5.32.2", - "resolved": "https://registry.npmjs.org/verdaccio/-/verdaccio-5.32.2.tgz", - "integrity": "sha512-QnVYIUvwB884fwVcA/D+x7AabsRPlTPyYAKMtExm8kJjiH+s2LGK2qX2o3I4VmYXqBR3W9b8gEnyQnGwQhUPsw==", + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/verdaccio/-/verdaccio-5.33.0.tgz", + "integrity": "sha512-mZWTt/k3KyprhS9IriUEHfKSV4lqB9P1aTVhw5GcNgu4533GSsJRwlBwrFijnoBbWDVarjZoIf+t8wq0iv+5jg==", "dev": true, "dependencies": { - "@cypress/request": "3.0.1", + "@cypress/request": "3.0.6", "@verdaccio/auth": "8.0.0-next-8.1", "@verdaccio/config": "8.0.0-next-8.1", "@verdaccio/core": "8.0.0-next-8.1", @@ -24591,13 +25594,13 @@ "@verdaccio/ui-theme": "8.0.0-next-8.1", "@verdaccio/url": "13.0.0-next-8.1", "@verdaccio/utils": "7.0.1-next-8.1", - "async": "3.2.5", - "clipanion": "4.0.0-rc.3", - "compression": "1.7.4", + "async": "3.2.6", + "clipanion": "4.0.0-rc.4", + "compression": "1.7.5", "cors": "2.8.5", - "debug": "^4.3.5", - "envinfo": "7.13.0", - "express": "4.21.0", + "debug": "^4.3.7", + "envinfo": "7.14.0", + "express": "4.21.1", "express-rate-limit": "5.5.1", "fast-safe-stringify": "2.1.1", "handlebars": "4.7.8", @@ -24695,27 +25698,149 @@ "url": "https://opencollective.com/verdaccio" } }, - "node_modules/verdaccio-htpasswd/node_modules/@verdaccio/file-locking": { - "version": "13.0.0-next-8.0", - "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-13.0.0-next-8.0.tgz", - "integrity": "sha512-28XRwpKiE3Z6KsnwE7o8dEM+zGWOT+Vef7RVJyUlG176JVDbGGip3HfCmFioE1a9BklLyGEFTu6D69BzfbRkzA==", + "node_modules/verdaccio-htpasswd/node_modules/@verdaccio/file-locking": { + "version": "13.0.0-next-8.0", + "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-13.0.0-next-8.0.tgz", + "integrity": "sha512-28XRwpKiE3Z6KsnwE7o8dEM+zGWOT+Vef7RVJyUlG176JVDbGGip3HfCmFioE1a9BklLyGEFTu6D69BzfbRkzA==", + "dev": true, + "dependencies": { + "lockfile": "1.0.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/verdaccio-htpasswd/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verdaccio-htpasswd/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verdaccio/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/verdaccio/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/verdaccio/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verdaccio/node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/verdaccio/node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/verdaccio/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "lockfile": "1.0.4" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/verdaccio" + "node": ">= 0.8" } }, - "node_modules/verdaccio/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "node_modules/verdaccio/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, "node_modules/verdaccio/node_modules/lru-cache": { "version": "7.18.3", @@ -24750,6 +25875,36 @@ "node": ">=10" } }, + "node_modules/verdaccio/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/verdaccio/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/verdaccio/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -24771,9 +25926,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.4.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", - "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "dev": true, "dependencies": { "esbuild": "^0.21.3", @@ -24830,9 +25985,9 @@ } }, "node_modules/vite-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", - "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.3.1.tgz", + "integrity": "sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -25258,16 +26413,16 @@ } }, "node_modules/vitest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", - "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.3.1.tgz", + "integrity": "sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==", "dev": true, "dependencies": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", + "@vitest/expect": "1.3.1", + "@vitest/runner": "1.3.1", + "@vitest/snapshot": "1.3.1", + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -25279,9 +26434,9 @@ "std-env": "^3.5.0", "strip-literal": "^2.0.0", "tinybench": "^2.5.1", - "tinypool": "^0.8.3", + "tinypool": "^0.8.2", "vite": "^5.0.0", - "vite-node": "1.6.0", + "vite-node": "1.3.1", "why-is-node-running": "^2.2.2" }, "bin": { @@ -25296,8 +26451,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.0", - "@vitest/ui": "1.6.0", + "@vitest/browser": "1.3.1", + "@vitest/ui": "1.3.1", "happy-dom": "*", "jsdom": "*" }, @@ -25322,181 +26477,149 @@ } } }, - "node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/vscode-material-icons": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/vscode-material-icons/-/vscode-material-icons-0.1.1.tgz", + "integrity": "sha512-GsoEEF8Tbb0yUFQ6N6FPvh11kFkL9F95x0FkKlbbfRQN9eFms67h+L3t6b9cUv58dSn2gu8kEhNfoESVCrz4ag==" + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=18" } }, - "node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "makeerror": "1.0.12" } }, - "node_modules/vitest/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, "engines": { - "node": ">=16.17.0" + "node": ">=10.13.0" } }, - "node_modules/vitest/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" } }, - "node_modules/vitest/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vitest/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "node_modules/webpack": { + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, + "peer": true, "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" + "bin": { + "webpack": "bin/webpack.js" }, "engines": { - "node": ">=12" + "node": ">=10.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/vitest/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "peer": true, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10.13.0" } }, - "node_modules/vitest/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "node_modules/webpack/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vscode-material-icons": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vscode-material-icons/-/vscode-material-icons-0.1.1.tgz", - "integrity": "sha512-GsoEEF8Tbb0yUFQ6N6FPvh11kFkL9F95x0FkKlbbfRQN9eFms67h+L3t6b9cUv58dSn2gu8kEhNfoESVCrz4ag==" + "peer": true }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "peer": true, "dependencies": { - "xml-name-validator": "^5.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=18" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" + "node": ">=8.0.0" } }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "peer": true, "engines": { - "node": ">=12" + "node": ">=4.0" } }, "node_modules/whatwg-encoding": { @@ -25560,39 +26683,43 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", + "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", "dev": true, "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.0", + "is-number-object": "^1.1.0", + "is-string": "^1.1.0", + "is-symbol": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "dependencies": { + "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", + "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -25626,9 +26753,9 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", @@ -25802,6 +26929,12 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -25869,9 +27002,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", - "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", "bin": { "yaml": "bin.mjs" }, @@ -25950,6 +27083,15 @@ "fd-slicer": "~1.1.0" } }, + "node_modules/ylru": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", + "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -25994,7 +27136,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.4.0.tgz", "integrity": "sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=18.0.0" }, diff --git a/package.json b/package.json index 940186525..2782021cf 100644 --- a/package.json +++ b/package.json @@ -11,91 +11,91 @@ "type": "git", "url": "git+https://github.com/code-pushup/cli.git" }, + "type": "module", "scripts": { "prepare": "husky install", "commit": "git-cz", "knip": "knip" }, "private": true, - "engine": { - "node": ">=18.20" + "engines": { + "node": ">=22.10" }, "dependencies": { "@code-pushup/portal-client": "^0.9.0", "@isaacs/cliui": "^8.0.2", - "@nx/devkit": "18.3.5", - "@poppinss/cliui": "^6.4.0", - "@swc/helpers": "0.5.3", - "ansis": "^3.3.0", + "@nx/devkit": "19.8.13", + "@poppinss/cliui": "^6.4.1", + "@swc/helpers": "0.5.13", + "ansis": "^3.3.2", "build-md": "^0.4.2", "bundle-require": "^4.0.1", "esbuild": "^0.19.12", - "eslint": "~8.56.0", + "eslint": "^9.16.0", "glob": "^10.4.5", "lighthouse": "^12.0.0", "lighthouse-logger": "2.0.1", "multi-progress-bars": "^5.0.3", - "nx": "18.3.5", + "nx": "19.8.13", "parse-lcov": "^1.0.4", - "semver": "^7.6.0", - "simple-git": "^3.20.0", + "semver": "^7.6.3", + "simple-git": "^3.26.0", "tslib": "^2.6.2", - "vscode-material-icons": "^0.1.0", + "vscode-material-icons": "^0.1.1", "yaml": "^2.5.1", "yargs": "^17.7.2", - "zod": "^3.22.4" + "zod": "^3.23.8", + "zod-validation-error": "^3.4.0" }, "devDependencies": { - "@beaussan/nx-knip": "0.0.5-15", - "@code-pushup/eslint-config": "^0.2.1", + "@beaussan/nx-knip": "^0.0.5-15", + "@code-pushup/eslint-config": "^0.10.7", "@commitlint/cli": "^19.5.0", "@commitlint/config-conventional": "^19.5.0", "@commitlint/config-nx-scopes": "^19.5.0", "@commitlint/cz-commitlint": "^19.5.0", "@commitlint/types": "^19.5.0", "@nodelib/fs.walk": "^2.0.0", - "@nx/esbuild": "18.3.5", - "@nx/eslint-plugin": "18.3.5", - "@nx/js": "18.3.5", - "@nx/plugin": "18.3.5", - "@nx/react": "18.3.5", - "@nx/vite": "18.3.5", - "@nx/workspace": "18.3.5", + "@nx/eslint-plugin": "19.8.13", + "@nx/js": "19.8.13", + "@nx/plugin": "19.8.13", + "@nx/react": "19.8.13", + "@nx/vite": "19.8.13", + "@nx/workspace": "19.8.13", "@push-based/nx-verdaccio": "0.0.0-alpha.26", - "@swc-node/register": "1.8.0", - "@swc/cli": "~0.1.62", - "@swc/core": "^1.3.99", + "@swc-node/register": "1.9.2", + "@swc/cli": "0.3.14", + "@swc/core": "1.5.7", "@testing-library/jest-dom": "^6.4.2", - "@testing-library/react": "^14.0.0", + "@testing-library/react": "15.0.6", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/benchmark": "^2.1.5", "@types/debug": "^4.1.12", "@types/eslint": "^8.44.2", "@types/node": "18.19.21", - "@types/react": "18.2.24", - "@types/react-dom": "18.2.9", - "@typescript-eslint/eslint-plugin": "6.13.2", - "@typescript-eslint/parser": "6.13.2", + "@types/react": "18.3.1", + "@types/react-dom": "18.3.0", "@vitejs/plugin-react": "4.2.1", - "@vitest/coverage-v8": "1.6.0", - "@vitest/ui": "1.6.0", + "@vitest/coverage-v8": "1.3.1", + "@vitest/ui": "1.3.1", "benchmark": "^2.1.4", - "chrome-launcher": "^1.1.1", + "chrome-launcher": "^1.1.2", "chromium": "^3.0.3", "commitizen": "^4.3.1", "commitlint-plugin-tense": "^1.0.3", - "dotenv": "^16.3.1", + "dotenv": "^16.4.5", "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-deprecation": "^2.0.0", - "eslint-plugin-functional": "^6.0.0", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-n": "^16.3.1", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-sonarjs": "^0.22.0", - "eslint-plugin-unicorn": "^48.0.1", - "eslint-plugin-vitest": "^0.3.8", + "eslint-plugin-functional": "^7.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jest-formatting": "^3.1.0", + "eslint-plugin-n": "^17.15.0", + "eslint-plugin-promise": "^7.2.1", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-sonarjs": "^1.0.4", + "eslint-plugin-unicorn": "^56.0.1", + "eslint-plugin-vitest": "^0.5.4", + "globals": "^15.13.0", "husky": "^8.0.0", "inquirer": "^9.3.7", "jsdom": "~24.0.0", @@ -103,24 +103,34 @@ "knip": "^5.33.3", "memfs": "^4.5.0", "minimatch": "^10.0.1", - "moment": "^2.29.4", - "prettier": "^3.3.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "moment": "^2.30.1", + "prettier": "^3.4.1", + "react": "18.3.1", + "react-dom": "18.3.1", "tsconfig-paths": "^4.2.0", - "tsx": "^4.1.2", + "tsx": "^4.19.0", "type-fest": "^4.26.1", - "typescript": "5.4.5", - "verdaccio": "^5.0.4", - "vite": "^5.2.13", - "vitest": "1.6.0", - "zod2md": "^0.1.1" + "typescript": "5.5.4", + "typescript-eslint": "^8.18.0", + "verdaccio": "^5.32.2", + "vite": "^5.4.8", + "vitest": "1.3.1", + "zod2md": "^0.1.3" }, "optionalDependencies": { - "@esbuild/darwin-arm64": "^0.19.4", - "@nx/nx-darwin-arm64": "^16.9.1", - "@nx/nx-darwin-x64": "^16.10.0", - "@nx/nx-linux-x64-gnu": "16.7.4" + "@esbuild/darwin-arm64": "^0.19.12", + "@nx/nx-darwin-arm64": "19.8.13", + "@nx/nx-darwin-x64": "19.8.13", + "@nx/nx-linux-x64-gnu": "19.8.13", + "@rollup/rollup-darwin-arm64": "^4.0.0", + "@rollup/rollup-darwin-x64": "^4.0.0", + "@rollup/rollup-linux-x64-gnu": "^4.0.0", + "@rollup/rollup-win32-x64-msvc": "^4.0.0" + }, + "overrides": { + "@beaussan/nx-knip": { + "@nx/devkit": "19 || 18" + } }, "keywords": [ "CLI", diff --git a/packages/ci/.eslintrc.json b/packages/ci/.eslintrc.json deleted file mode 100644 index 45a157044..000000000 --- a/packages/ci/.eslintrc.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "parserOptions": { - "project": ["packages/ci/tsconfig.*?.json"] - }, - "rules": {} - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": [ - "error", - { - "ignoredDependencies": ["type-fest"] // only internal types - } - ] - } - } - ] -} diff --git a/packages/ci/README.md b/packages/ci/README.md index 7bccec24f..7b38e18dc 100644 --- a/packages/ci/README.md +++ b/packages/ci/README.md @@ -94,22 +94,23 @@ A `Comment` object has the following required properties: Optionally, you can override default options for further customization: -| Property | Type | Default | Description | -| :---------------- | :------------------------ | :------------------------------- | :----------------------------------------------------------------------------------- | -| `monorepo` | `boolean \| MonorepoTool` | `false` | Enables [monorepo mode](#monorepo-mode) | -| `projects` | `string[] \| null` | `null` | Custom projects configuration for [monorepo mode](#monorepo-mode) | -| `task` | `string` | `'code-pushup'` | Name of command to run Code PushUp per project in [monorepo mode](#monorepo-mode) | -| `directory` | `string` | `process.cwd()` | Directory in which Code PushUp CLI should run | -| `config` | `string \| null` | `null` [^1] | Path to config file (`--config` option) | -| `silent` | `boolean` | `false` | Toggles if logs from CLI commands are printed | -| `bin` | `string` | `'npx --no-install code-pushup'` | Command for executing Code PushUp CLI | -| `detectNewIssues` | `boolean` | `true` | Toggles if new issues should be detected and returned in `newIssues` property | -| `logger` | `Logger` | `console` | Logger for reporting progress and encountered problems | -| `output` | `string` | `'.code-pushup'` | Directory where Code PushUp reports will be created (interpolates project name [^2]) | +| Property | Type | Default | Description | +| :----------------- | :------------------------ | :------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `monorepo` | `boolean \| MonorepoTool` | `false` | Enables [monorepo mode](#monorepo-mode) | +| `parallel` | `boolean \| number` | `false` | Enables parallel execution in [monorepo mode](#monorepo-mode) | +| `projects` | `string[] \| null` | `null` | Custom projects configuration for [monorepo mode](#monorepo-mode) | +| `task` | `string` | `'code-pushup'` | Name of command to run Code PushUp per project in [monorepo mode](#monorepo-mode) | +| `nxProjectsFilter` | `string \| string[]` | `'--with-target={task}'` | Arguments passed to [`nx show projects`](https://nx.dev/nx-api/nx/documents/show#projects), only relevant for Nx in [monorepo mode](#monorepo-mode) [^2] | +| `directory` | `string` | `process.cwd()` | Directory in which Code PushUp CLI should run | +| `config` | `string \| null` | `null` [^1] | Path to config file (`--config` option) | +| `silent` | `boolean` | `false` | Toggles if logs from CLI commands are printed | +| `bin` | `string` | `'npx --no-install code-pushup'` | Command for executing Code PushUp CLI | +| `detectNewIssues` | `boolean` | `true` | Toggles if new issues should be detected and returned in `newIssues` property | +| `logger` | `Logger` | `console` | Logger for reporting progress and encountered problems | [^1]: By default, the `code-pushup.config` file is autodetected as described in [`@code-pushup/cli` docs](../cli/README.md#configuration). -[^2]: In monorepo mode, any occurrence of `{project}` in the `output` path will be replaced with a project name. This separation of folders per project (e.g. `output: '.code-pushup/{project}'`) may be useful for caching purposes. +[^2]: The `{task}` pattern is replaced with the `task` value, so the default behaviour is to list projects using `npx nx show projects --with-target=code-pushup --json`. The `nxProjectsFilter` options gives Nx users the flexibility to filter projects in alternative ways supported by the Nx CLI (e.g. `--affected`, `--projects`, `--exclude`, `--type`) - refer to [options in Nx docs](https://nx.dev/nx-api/nx/documents/show#options) for details. The `Logger` object has the following required properties: @@ -135,7 +136,7 @@ const result = await runInCI(refs, api); if (result.mode === 'standalone') { const { // output files, can be uploaded as job artifact - artifacts: { report, diff }, + files: { report, diff }, // ID of created/updated PR comment commentId, // array of source code issues, can be used to annotate changed files in PR @@ -193,6 +194,27 @@ await runInCI(refs, api, { }); ``` +### Parallel tasks + +By default, tasks are run sequentially for each project in the monorepo. +The `parallel` option enables parallel execution for tools which support it (Nx, Turborepo, PNPM, Yarn 2+). + +```ts +await runInCI(refs, api, { + monorepo: true, + parallel: true, +}); +``` + +The maximum number of concurrent tasks can be set by passing in a number instead of a boolean: + +```ts +await runInCI(refs, api, { + monorepo: true, + parallel: 3, +}); +``` + ### Monorepo result In monorepo mode, the resolved object includes the merged diff at the top-level, as well as a list of projects. @@ -208,7 +230,7 @@ if (result.mode === 'monorepo') { // ID of created/updated PR comment commentId, // merged report-diff.md used in PR comment, can also be uploaded as job artifact - diffArtifact, + diffPath, } = result; for (const project of projects) { @@ -216,7 +238,7 @@ if (result.mode === 'monorepo') { // detected project name (from package.json, project.json or folder name) name, // output files, can be uploaded as job artifacts - artifacts: { report, diff }, + files: { report, diff }, // array of source code issues, can be used to annotate changed files in PR newIssues, } = project; diff --git a/packages/ci/eslint.config.js b/packages/ci/eslint.config.js new file mode 100644 index 000000000..13888c2a8 --- /dev/null +++ b/packages/ci/eslint.config.js @@ -0,0 +1,31 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config( + ...baseConfig, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': [ + 'error', + { ignoredDependencies: ['type-fest'] }, // only for internal typings + ], + }, + }, + { + files: ['**/*.test.ts'], + rules: { + 'vitest/max-nested-describe': ['warn', { max: 3 }], + 'n/no-unsupported-features/node-builtins': 'off', + }, + }, +); diff --git a/packages/ci/mocks/fixtures/code-pushup.config.ts b/packages/ci/mocks/fixtures/code-pushup.config.ts deleted file mode 100644 index 2ae40ebdb..000000000 --- a/packages/ci/mocks/fixtures/code-pushup.config.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { glob } from 'glob'; -import type { CoreConfig } from '@code-pushup/models'; - -const config: CoreConfig = { - plugins: [ - { - slug: 'ts-migration', - title: 'TypeScript migration', - icon: 'typescript', - audits: [ - { - slug: 'ts-files', - title: 'Source files converted from JavaScript to TypeScript', - }, - ], - runner: async () => { - const paths = await glob('**/*.{js,ts}'); - const jsPaths = paths.filter(path => path.endsWith('.js')); - const tsPaths = paths.filter(path => path.endsWith('.ts')); - const jsFileCount = jsPaths.length; - const tsFileCount = tsPaths.length; - const ratio = tsFileCount / (jsFileCount + tsFileCount); - const percentage = Math.round(ratio * 100); - return [ - { - slug: 'ts-files', - value: percentage, - score: ratio, - displayValue: `${percentage}% converted`, - details: { - issues: jsPaths.map(file => ({ - message: 'Use .ts file extension instead of .js', - severity: 'warning', - source: { file }, - })), - }, - }, - ]; - }, - }, - ], -}; - -export default config; diff --git a/packages/ci/mocks/fixtures/monorepos/custom/backend/api/package.json b/packages/ci/mocks/fixtures/monorepos/custom/backend/api/package.json new file mode 100644 index 000000000..1641db03a --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/custom/backend/api/package.json @@ -0,0 +1,6 @@ +{ + "name": "api", + "devDependencies": { + "@code-pushup/cli": "latest" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/custom/backend/auth/package.json b/packages/ci/mocks/fixtures/monorepos/custom/backend/auth/package.json new file mode 100644 index 000000000..cbb4e6e65 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/custom/backend/auth/package.json @@ -0,0 +1,6 @@ +{ + "name": "auth", + "devDependencies": { + "@code-pushup/cli": "latest" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/custom/frontend/package.json b/packages/ci/mocks/fixtures/monorepos/custom/frontend/package.json new file mode 100644 index 000000000..d9ca7fcfb --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/custom/frontend/package.json @@ -0,0 +1,6 @@ +{ + "name": "frontend", + "devDependencies": { + "@code-pushup/cli": "latest" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/npm/package-lock.json b/packages/ci/mocks/fixtures/monorepos/npm/package-lock.json new file mode 100644 index 000000000..f1a67f556 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/npm/package-lock.json @@ -0,0 +1,27 @@ +{ + "name": "npm", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "workspaces": [ + "packages/*" + ] + }, + "node_modules/cli": { + "resolved": "packages/cli", + "link": true + }, + "node_modules/core": { + "resolved": "packages/core", + "link": true + }, + "node_modules/utils": { + "resolved": "packages/utils", + "link": true + }, + "packages/cli": {}, + "packages/core": {}, + "packages/utils": {} + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/npm/package.json b/packages/ci/mocks/fixtures/monorepos/npm/package.json new file mode 100644 index 000000000..9f0acdba5 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/npm/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "workspaces": [ + "packages/*" + ] +} diff --git a/packages/ci/mocks/fixtures/monorepos/npm/packages/cli/package.json b/packages/ci/mocks/fixtures/monorepos/npm/packages/cli/package.json new file mode 100644 index 000000000..1a558500c --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/npm/packages/cli/package.json @@ -0,0 +1,6 @@ +{ + "name": "cli", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/npm/packages/core/package.json b/packages/ci/mocks/fixtures/monorepos/npm/packages/core/package.json new file mode 100644 index 000000000..e2b53d3a3 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/npm/packages/core/package.json @@ -0,0 +1,6 @@ +{ + "name": "core", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/npm/packages/utils/package.json b/packages/ci/mocks/fixtures/monorepos/npm/packages/utils/package.json new file mode 100644 index 000000000..c75ecc004 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/npm/packages/utils/package.json @@ -0,0 +1,6 @@ +{ + "name": "utils", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/nx/.gitignore b/packages/ci/mocks/fixtures/monorepos/nx/.gitignore new file mode 100644 index 000000000..fb222bf4d --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/nx/.gitignore @@ -0,0 +1 @@ +/.nx \ No newline at end of file diff --git a/packages/ci/mocks/fixtures/monorepos/nx/nx.json b/packages/ci/mocks/fixtures/monorepos/nx/nx.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/nx/nx.json @@ -0,0 +1 @@ +{} diff --git a/packages/ci/mocks/fixtures/monorepos/nx/package-lock.json b/packages/ci/mocks/fixtures/monorepos/nx/package-lock.json new file mode 100644 index 000000000..e2edcfee0 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/nx/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "nx", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/packages/ci/mocks/fixtures/monorepos/nx/package.json b/packages/ci/mocks/fixtures/monorepos/nx/package.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/nx/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/ci/mocks/fixtures/monorepos/nx/packages/cli/project.json b/packages/ci/mocks/fixtures/monorepos/nx/packages/cli/project.json new file mode 100644 index 000000000..272ccae05 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/nx/packages/cli/project.json @@ -0,0 +1,8 @@ +{ + "name": "cli", + "targets": { + "code-pushup": { + "command": "npx code-pushup --config=packages/cli/code-pushup.config.js --persist.outputDir=packages/cli/.code-pushup" + } + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/nx/packages/core/project.json b/packages/ci/mocks/fixtures/monorepos/nx/packages/core/project.json new file mode 100644 index 000000000..cb22860bf --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/nx/packages/core/project.json @@ -0,0 +1,8 @@ +{ + "name": "core", + "targets": { + "code-pushup": { + "command": "npx code-pushup --config=packages/core/code-pushup.config.js --persist.outputDir=packages/cli/.code-pushup" + } + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/nx/packages/utils/project.json b/packages/ci/mocks/fixtures/monorepos/nx/packages/utils/project.json new file mode 100644 index 000000000..e68a159e4 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/nx/packages/utils/project.json @@ -0,0 +1,8 @@ +{ + "name": "utils", + "targets": { + "code-pushup": { + "command": "npx code-pushup --config=packages/utils/code-pushup.config.js --persist.outputDir=packages/cli/.code-pushup" + } + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/nx/tsconfig.base.json b/packages/ci/mocks/fixtures/monorepos/nx/tsconfig.base.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/nx/tsconfig.base.json @@ -0,0 +1 @@ +{} diff --git a/packages/ci/mocks/fixtures/monorepos/pnpm/package.json b/packages/ci/mocks/fixtures/monorepos/pnpm/package.json new file mode 100644 index 000000000..87abd4a0f --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/pnpm/package.json @@ -0,0 +1,3 @@ +{ + "packageManager": "pnpm@9.5.0" +} diff --git a/packages/ci/mocks/fixtures/monorepos/pnpm/packages/cli/package.json b/packages/ci/mocks/fixtures/monorepos/pnpm/packages/cli/package.json new file mode 100644 index 000000000..1a558500c --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/pnpm/packages/cli/package.json @@ -0,0 +1,6 @@ +{ + "name": "cli", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/pnpm/packages/core/package.json b/packages/ci/mocks/fixtures/monorepos/pnpm/packages/core/package.json new file mode 100644 index 000000000..e2b53d3a3 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/pnpm/packages/core/package.json @@ -0,0 +1,6 @@ +{ + "name": "core", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/pnpm/packages/utils/package.json b/packages/ci/mocks/fixtures/monorepos/pnpm/packages/utils/package.json new file mode 100644 index 000000000..c75ecc004 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/pnpm/packages/utils/package.json @@ -0,0 +1,6 @@ +{ + "name": "utils", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/pnpm/pnpm-lock.yaml b/packages/ci/mocks/fixtures/monorepos/pnpm/pnpm-lock.yaml new file mode 100644 index 000000000..3ab979278 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/pnpm/pnpm-lock.yaml @@ -0,0 +1,14 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: {} + + packages/cli: {} + + packages/core: {} + + packages/utils: {} diff --git a/packages/ci/mocks/fixtures/monorepos/pnpm/pnpm-workspace.yaml b/packages/ci/mocks/fixtures/monorepos/pnpm/pnpm-workspace.yaml new file mode 100644 index 000000000..924b55f42 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/pnpm/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - packages/* diff --git a/packages/ci/mocks/fixtures/monorepos/turbo/package.json b/packages/ci/mocks/fixtures/monorepos/turbo/package.json new file mode 100644 index 000000000..19179f45a --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/turbo/package.json @@ -0,0 +1,7 @@ +{ + "packageManager": "yarn@1.22.19", + "private": true, + "workspaces": [ + "packages/*" + ] +} diff --git a/packages/ci/mocks/fixtures/monorepos/turbo/packages/cli/package.json b/packages/ci/mocks/fixtures/monorepos/turbo/packages/cli/package.json new file mode 100644 index 000000000..1a558500c --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/turbo/packages/cli/package.json @@ -0,0 +1,6 @@ +{ + "name": "cli", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/turbo/packages/core/package.json b/packages/ci/mocks/fixtures/monorepos/turbo/packages/core/package.json new file mode 100644 index 000000000..e2b53d3a3 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/turbo/packages/core/package.json @@ -0,0 +1,6 @@ +{ + "name": "core", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/turbo/packages/utils/package.json b/packages/ci/mocks/fixtures/monorepos/turbo/packages/utils/package.json new file mode 100644 index 000000000..c75ecc004 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/turbo/packages/utils/package.json @@ -0,0 +1,6 @@ +{ + "name": "utils", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/turbo/turbo.json b/packages/ci/mocks/fixtures/monorepos/turbo/turbo.json new file mode 100644 index 000000000..12316330d --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/turbo/turbo.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://turbo.build/schema.json", + "tasks": { + "code-pushup": { + "outputs": [".code-pushup"] + } + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/turbo/yarn.lock b/packages/ci/mocks/fixtures/monorepos/turbo/yarn.lock new file mode 100644 index 000000000..fb57ccd13 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/turbo/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + diff --git a/packages/ci/mocks/fixtures/monorepos/yarn/package.json b/packages/ci/mocks/fixtures/monorepos/yarn/package.json new file mode 100644 index 000000000..b9bff8df0 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/yarn/package.json @@ -0,0 +1,7 @@ +{ + "packageManager": "yarn@4.5.0", + "private": true, + "workspaces": [ + "packages/*" + ] +} diff --git a/packages/ci/mocks/fixtures/monorepos/yarn/packages/cli/package.json b/packages/ci/mocks/fixtures/monorepos/yarn/packages/cli/package.json new file mode 100644 index 000000000..1a558500c --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/yarn/packages/cli/package.json @@ -0,0 +1,6 @@ +{ + "name": "cli", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/yarn/packages/core/package.json b/packages/ci/mocks/fixtures/monorepos/yarn/packages/core/package.json new file mode 100644 index 000000000..e2b53d3a3 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/yarn/packages/core/package.json @@ -0,0 +1,6 @@ +{ + "name": "core", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/yarn/packages/utils/package.json b/packages/ci/mocks/fixtures/monorepos/yarn/packages/utils/package.json new file mode 100644 index 000000000..c75ecc004 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/yarn/packages/utils/package.json @@ -0,0 +1,6 @@ +{ + "name": "utils", + "scripts": { + "code-pushup": "code-pushup" + } +} diff --git a/packages/ci/mocks/fixtures/monorepos/yarn/yarn.lock b/packages/ci/mocks/fixtures/monorepos/yarn/yarn.lock new file mode 100644 index 000000000..05210ced0 --- /dev/null +++ b/packages/ci/mocks/fixtures/monorepos/yarn/yarn.lock @@ -0,0 +1,30 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"cli@workspace:packages/cli": + version: 0.0.0-use.local + resolution: "cli@workspace:packages/cli" + languageName: unknown + linkType: soft + +"core@workspace:packages/core": + version: 0.0.0-use.local + resolution: "core@workspace:packages/core" + languageName: unknown + linkType: soft + +"root-workspace-0b6124@workspace:.": + version: 0.0.0-use.local + resolution: "root-workspace-0b6124@workspace:." + languageName: unknown + linkType: soft + +"utils@workspace:packages/utils": + version: 0.0.0-use.local + resolution: "utils@workspace:packages/utils" + languageName: unknown + linkType: soft diff --git a/packages/ci/mocks/fixtures/config.json b/packages/ci/mocks/fixtures/outputs/config.json similarity index 100% rename from packages/ci/mocks/fixtures/config.json rename to packages/ci/mocks/fixtures/outputs/config.json diff --git a/packages/ci/mocks/fixtures/outputs/diff-merged.md b/packages/ci/mocks/fixtures/outputs/diff-merged.md new file mode 100644 index 000000000..2115957cc --- /dev/null +++ b/packages/ci/mocks/fixtures/outputs/diff-merged.md @@ -0,0 +1,45 @@ +# Code PushUp + +🥳 Code PushUp report has **improved** – compared target commit 0123456789abcdef0123456789abcdef01234567 with source commit abcdef0123456789abcdef0123456789abcdef01. + +## 💼 Project `core` + +🥳 Code PushUp report has **improved**. + +| 🏷️ Category | ⭐ Previous score | ⭐ Current score | 🔄 Score change | +| :------------------- | :---------------: | :--------------: | :--------------------------------------------------------------: | +| TypeScript migration | 🔴 0 | 🟢 **100** | ![↑ +100](https://img.shields.io/badge/%E2%86%91%20%2B100-green) | + +
+👍 1 audit improved + +### 🛡️ Audits + +| 🔌 Plugin | 🛡️ Audit | 📏 Previous value | 📏 Current value | 🔄 Value change | +| :------------------- | :--------------------------------------------------- | :---------------: | :-------------------: | :--------------------------------------------------------------------------------: | +| TypeScript migration | Source files converted from JavaScript to TypeScript | 🟥 0% converted | 🟩 **100% converted** | ![↑ +∞ %](https://img.shields.io/badge/%E2%86%91%20%2B%E2%88%9E%E2%80%89%25-green) | + +
+ +## 💼 Project `cli` + +🥳 Code PushUp report has **improved**. + +| 🏷️ Category | ⭐ Previous score | ⭐ Current score | 🔄 Score change | +| :------------------- | :---------------: | :--------------: | :------------------------------------------------------------: | +| TypeScript migration | 🔴 0 | 🟡 **50** | ![↑ +50](https://img.shields.io/badge/%E2%86%91%20%2B50-green) | + +
+👍 1 audit improved + +### 🛡️ Audits + +| 🔌 Plugin | 🛡️ Audit | 📏 Previous value | 📏 Current value | 🔄 Value change | +| :------------------- | :--------------------------------------------------- | :---------------: | :------------------: | :--------------------------------------------------------------------------------: | +| TypeScript migration | Source files converted from JavaScript to TypeScript | 🟥 0% converted | 🟨 **50% converted** | ![↑ +∞ %](https://img.shields.io/badge/%E2%86%91%20%2B%E2%88%9E%E2%80%89%25-green) | + +
+ +--- + +1 other project is unchanged. diff --git a/packages/ci/mocks/fixtures/report-diff.json b/packages/ci/mocks/fixtures/outputs/diff-project.json similarity index 100% rename from packages/ci/mocks/fixtures/report-diff.json rename to packages/ci/mocks/fixtures/outputs/diff-project.json diff --git a/packages/ci/mocks/fixtures/report-diff.md b/packages/ci/mocks/fixtures/outputs/diff-project.md similarity index 100% rename from packages/ci/mocks/fixtures/report-diff.md rename to packages/ci/mocks/fixtures/outputs/diff-project.md diff --git a/packages/ci/mocks/fixtures/feature-1/report.json b/packages/ci/mocks/fixtures/outputs/report-after.json similarity index 100% rename from packages/ci/mocks/fixtures/feature-1/report.json rename to packages/ci/mocks/fixtures/outputs/report-after.json diff --git a/packages/ci/mocks/fixtures/feature-1/report.md b/packages/ci/mocks/fixtures/outputs/report-after.md similarity index 100% rename from packages/ci/mocks/fixtures/feature-1/report.md rename to packages/ci/mocks/fixtures/outputs/report-after.md diff --git a/packages/ci/mocks/fixtures/main/report.json b/packages/ci/mocks/fixtures/outputs/report-before.json similarity index 100% rename from packages/ci/mocks/fixtures/main/report.json rename to packages/ci/mocks/fixtures/outputs/report-before.json diff --git a/packages/ci/mocks/fixtures/main/report.md b/packages/ci/mocks/fixtures/outputs/report-before.md similarity index 100% rename from packages/ci/mocks/fixtures/main/report.md rename to packages/ci/mocks/fixtures/outputs/report-before.md diff --git a/packages/ci/package.json b/packages/ci/package.json index fd7cfd0b0..8d7feeceb 100644 --- a/packages/ci/package.json +++ b/packages/ci/package.json @@ -1,6 +1,6 @@ { "name": "@code-pushup/ci", - "version": "0.55.0", + "version": "0.57.0", "description": "CI automation logic for Code PushUp (provider-agnostic)", "license": "MIT", "homepage": "https://github.com/code-pushup/cli/tree/main/packages/ci#readme", @@ -25,13 +25,12 @@ "access": "public" }, "type": "module", - "main": "./index.js", - "types": "./src/index.d.ts", "dependencies": { - "@code-pushup/models": "0.55.0", - "@code-pushup/utils": "0.55.0", + "@code-pushup/models": "0.57.0", + "@code-pushup/utils": "0.57.0", "glob": "^10.4.5", "simple-git": "^3.20.0", - "yaml": "^2.5.1" + "yaml": "^2.5.1", + "zod": "^3.22.1" } } diff --git a/packages/ci/project.json b/packages/ci/project.json index b368a54e7..3dabfdfac 100644 --- a/packages/ci/project.json +++ b/packages/ci/project.json @@ -5,14 +5,13 @@ "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/packages/ci", "main": "packages/ci/src/index.ts", "tsConfig": "packages/ci/tsconfig.lib.json", - "assets": ["packages/ci/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["packages/ci/*.md"] } }, "lint": { diff --git a/packages/ci/src/index.ts b/packages/ci/src/index.ts index 52016bde8..5b0b5958e 100644 --- a/packages/ci/src/index.ts +++ b/packages/ci/src/index.ts @@ -1,8 +1,8 @@ -export type { SourceFileIssue } from './lib/issues'; -export type * from './lib/models'; +export type { SourceFileIssue } from './lib/issues.js'; +export type * from './lib/models.js'; export { MONOREPO_TOOLS, isMonorepoTool, type MonorepoTool, -} from './lib/monorepo'; -export { runInCI } from './lib/run'; +} from './lib/monorepo/index.js'; +export { runInCI } from './lib/run.js'; diff --git a/packages/ci/src/lib/cli/commands/collect.ts b/packages/ci/src/lib/cli/commands/collect.ts index 40620b28b..ae24f66b7 100644 --- a/packages/ci/src/lib/cli/commands/collect.ts +++ b/packages/ci/src/lib/cli/commands/collect.ts @@ -1,30 +1,22 @@ +import { DEFAULT_PERSIST_FORMAT } from '@code-pushup/models'; import { executeProcess } from '@code-pushup/utils'; -import type { CommandContext } from '../context'; -import { - type PersistedCliFiles, - persistCliOptions, - persistedCliFiles, -} from '../persist'; +import type { CommandContext } from '../context.js'; export async function runCollect({ bin, config, directory, silent, - project, - output, -}: CommandContext): Promise { +}: CommandContext): Promise { const { stdout } = await executeProcess({ command: bin, args: [ ...(config ? [`--config=${config}`] : []), - ...persistCliOptions({ directory, project, output }), + ...DEFAULT_PERSIST_FORMAT.map(format => `--persist.format=${format}`), ], cwd: directory, }); if (!silent) { console.info(stdout); } - - return persistedCliFiles({ directory, project, output }); } diff --git a/packages/ci/src/lib/cli/commands/compare.ts b/packages/ci/src/lib/cli/commands/compare.ts index 89ddf3ec7..a28f2126e 100644 --- a/packages/ci/src/lib/cli/commands/compare.ts +++ b/packages/ci/src/lib/cli/commands/compare.ts @@ -1,10 +1,6 @@ +import { DEFAULT_PERSIST_FORMAT } from '@code-pushup/models'; import { executeProcess } from '@code-pushup/utils'; -import type { CommandContext } from '../context'; -import { - type PersistedCliFiles, - persistCliOptions, - persistedCliFiles, -} from '../persist'; +import type { CommandContext } from '../context.js'; type CompareOptions = { before: string; @@ -14,8 +10,8 @@ type CompareOptions = { export async function runCompare( { before, after, label }: CompareOptions, - { bin, config, directory, silent, project, output }: CommandContext, -): Promise { + { bin, config, directory, silent }: CommandContext, +): Promise { const { stdout } = await executeProcess({ command: bin, args: [ @@ -24,13 +20,11 @@ export async function runCompare( `--after=${after}`, ...(label ? [`--label=${label}`] : []), ...(config ? [`--config=${config}`] : []), - ...persistCliOptions({ directory, project, output }), + ...DEFAULT_PERSIST_FORMAT.map(format => `--persist.format=${format}`), ], cwd: directory, }); if (!silent) { console.info(stdout); } - - return persistedCliFiles({ directory, isDiff: true, project, output }); } diff --git a/packages/ci/src/lib/cli/commands/merge-diffs.ts b/packages/ci/src/lib/cli/commands/merge-diffs.ts index fb2d0bcca..1c94954d6 100644 --- a/packages/ci/src/lib/cli/commands/merge-diffs.ts +++ b/packages/ci/src/lib/cli/commands/merge-diffs.ts @@ -1,22 +1,26 @@ -import { executeProcess } from '@code-pushup/utils'; -import type { CommandContext } from '../context'; +import path from 'node:path'; import { - type PersistedCliFiles, - persistCliOptions, - persistedCliFiles, -} from '../persist'; + DEFAULT_PERSIST_FILENAME, + DEFAULT_PERSIST_OUTPUT_DIR, +} from '@code-pushup/models'; +import { executeProcess } from '@code-pushup/utils'; +import type { CommandContext } from '../context.js'; export async function runMergeDiffs( files: string[], - { bin, config, directory, silent, output }: CommandContext, -): Promise> { + { bin, config, directory, silent }: CommandContext, +): Promise { + const outputDir = path.join(directory, DEFAULT_PERSIST_OUTPUT_DIR); + const filename = `merged-${DEFAULT_PERSIST_FILENAME}`; + const { stdout } = await executeProcess({ command: bin, args: [ 'merge-diffs', ...files.map(file => `--files=${file}`), ...(config ? [`--config=${config}`] : []), - ...persistCliOptions({ directory, output }), + `--persist.outputDir=${outputDir}`, + `--persist.filename=${filename}`, ], cwd: directory, }); @@ -24,10 +28,5 @@ export async function runMergeDiffs( console.info(stdout); } - return persistedCliFiles({ - directory, - isDiff: true, - formats: ['md'], - output, - }); + return path.join(outputDir, `${filename}-diff.md`); } diff --git a/packages/ci/src/lib/cli/commands/print-config.ts b/packages/ci/src/lib/cli/commands/print-config.ts index 593f3b080..dbf280770 100644 --- a/packages/ci/src/lib/cli/commands/print-config.ts +++ b/packages/ci/src/lib/cli/commands/print-config.ts @@ -1,12 +1,12 @@ -import { executeProcess } from '@code-pushup/utils'; -import type { CommandContext } from '../context'; +import { executeProcess, stringifyError } from '@code-pushup/utils'; +import type { CommandContext } from '../context.js'; export async function runPrintConfig({ bin, config, directory, silent, -}: CommandContext): Promise { +}: CommandContext): Promise { const { stdout } = await executeProcess({ command: bin, args: [...(config ? [`--config=${config}`] : []), 'print-config'], @@ -15,4 +15,21 @@ export async function runPrintConfig({ if (!silent) { console.info(stdout); } + + // workaround for 1st lines like `> nx run utils:code-pushup -- print-config` + const lines = stdout.split(/\r?\n/); + const jsonLines = lines.slice(lines.indexOf('{'), lines.indexOf('}') + 1); + const stdoutSanitized = jsonLines.join('\n'); + + try { + return JSON.parse(stdoutSanitized) as unknown; + } catch (error) { + if (silent) { + console.info('Invalid output from print-config:'); + console.info(stdout); + } + throw new Error( + `Error parsing output of print-config command - ${stringifyError(error)}`, + ); + } } diff --git a/packages/ci/src/lib/cli/context.ts b/packages/ci/src/lib/cli/context.ts index 746028ebb..82184ee95 100644 --- a/packages/ci/src/lib/cli/context.ts +++ b/packages/ci/src/lib/cli/context.ts @@ -1,23 +1,19 @@ -import type { Settings } from '../models'; -import type { ProjectConfig } from '../monorepo'; +import type { Settings } from '../models.js'; +import type { ProjectConfig } from '../monorepo/index.js'; export type CommandContext = Pick< Settings, - 'bin' | 'config' | 'directory' | 'silent' | 'output' -> & { - project?: string; -}; + 'bin' | 'config' | 'directory' | 'silent' +>; export function createCommandContext( settings: Settings, project: ProjectConfig | null | undefined, ): CommandContext { return { - project: project?.name, bin: project?.bin ?? settings.bin, directory: project?.directory ?? settings.directory, config: settings.config, silent: settings.silent, - output: settings.output.replaceAll('{project}', project?.name ?? ''), }; } diff --git a/packages/ci/src/lib/cli/context.unit.test.ts b/packages/ci/src/lib/cli/context.unit.test.ts index bdd2e8356..8961caa77 100644 --- a/packages/ci/src/lib/cli/context.unit.test.ts +++ b/packages/ci/src/lib/cli/context.unit.test.ts @@ -1,5 +1,4 @@ -import { DEFAULT_SETTINGS } from '../constants'; -import { type CommandContext, createCommandContext } from './context'; +import { type CommandContext, createCommandContext } from './context.js'; describe('createCommandContext', () => { it('should pick CLI-related settings in standalone mode', () => { @@ -13,7 +12,7 @@ describe('createCommandContext', () => { directory: '/test', logger: console, monorepo: false, - output: '.code-pushup', + nxProjectsFilter: '--with-target={task}', projects: null, silent: false, task: 'code-pushup', @@ -21,12 +20,10 @@ describe('createCommandContext', () => { null, ), ).toStrictEqual({ - project: undefined, bin: 'npx --no-install code-pushup', directory: '/test', config: null, silent: false, - output: '.code-pushup', }); }); @@ -41,7 +38,7 @@ describe('createCommandContext', () => { directory: '/test', logger: console, monorepo: false, - output: '.code-pushup', + nxProjectsFilter: '--with-target={task}', projects: null, silent: false, task: 'code-pushup', @@ -53,49 +50,10 @@ describe('createCommandContext', () => { }, ), ).toStrictEqual({ - project: 'ui', bin: 'yarn code-pushup', directory: '/test/ui', config: null, silent: false, - output: '.code-pushup', }); }); - - it('should interpolate project name in output path for monorepo project', () => { - expect( - createCommandContext( - { - ...DEFAULT_SETTINGS, - output: '.code-pushup/{project}', - }, - { - name: 'website', - bin: 'npx nx run website:code-pushup --', - }, - ), - ).toEqual( - expect.objectContaining>({ - project: 'website', - bin: 'npx nx run website:code-pushup --', - output: '.code-pushup/website', - }), - ); - }); - - it('should omit {project} placeholder in output path when in standalone mode', () => { - expect( - createCommandContext( - { - ...DEFAULT_SETTINGS, - output: '.code-pushup/{project}', - }, - undefined, - ), - ).toEqual( - expect.objectContaining>({ - output: '.code-pushup/', - }), - ); - }); }); diff --git a/packages/ci/src/lib/cli/index.ts b/packages/ci/src/lib/cli/index.ts index 14df2100e..f252efdc7 100644 --- a/packages/ci/src/lib/cli/index.ts +++ b/packages/ci/src/lib/cli/index.ts @@ -1,6 +1,6 @@ -export { runCollect } from './commands/collect'; -export { runCompare } from './commands/compare'; -export { runMergeDiffs } from './commands/merge-diffs'; -export { runPrintConfig } from './commands/print-config'; -export { createCommandContext, type CommandContext } from './context'; -export { findPersistedFiles, type PersistedCliFiles } from './persist'; +export { runCollect } from './commands/collect.js'; +export { runCompare } from './commands/compare.js'; +export { runMergeDiffs } from './commands/merge-diffs.js'; +export { runPrintConfig } from './commands/print-config.js'; +export { createCommandContext, type CommandContext } from './context.js'; +export { persistedFilesFromConfig } from './persist.js'; diff --git a/packages/ci/src/lib/cli/persist.ts b/packages/ci/src/lib/cli/persist.ts index 80326e447..b7b8ce224 100644 --- a/packages/ci/src/lib/cli/persist.ts +++ b/packages/ci/src/lib/cli/persist.ts @@ -1,106 +1,46 @@ import path from 'node:path'; +import { z } from 'zod'; import { + type CoreConfig, DEFAULT_PERSIST_FILENAME, DEFAULT_PERSIST_FORMAT, + DEFAULT_PERSIST_OUTPUT_DIR, type Format, + persistConfigSchema, } from '@code-pushup/models'; -import { projectToFilename } from '@code-pushup/utils'; +import { objectFromEntries, stringifyError } from '@code-pushup/utils'; -export type PersistedCliFiles = - PersistedCliFilesFormats & { - artifactData: { - rootDir: string; - files: string[]; - }; - }; +export function persistedFilesFromConfig( + config: Pick, + { isDiff, directory }: { isDiff?: boolean; directory: string }, +): Record { + const { + persist: { + outputDir = DEFAULT_PERSIST_OUTPUT_DIR, + filename = DEFAULT_PERSIST_FILENAME, + } = {}, + } = config; -export type PersistedCliFilesFormats = { - [F in T as `${F}FilePath`]: string; -}; + const dir = path.isAbsolute(outputDir) + ? outputDir + : path.join(directory, outputDir); + const name = isDiff ? `${filename}-diff` : filename; -export function persistCliOptions({ - directory, - project, - output, -}: { - directory: string; - project?: string; - output: string; -}): string[] { - return [ - `--persist.outputDir=${path.join(directory, output)}`, - `--persist.filename=${createFilename(project)}`, - ...DEFAULT_PERSIST_FORMAT.map(format => `--persist.format=${format}`), - ]; -} - -export function persistedCliFiles({ - directory, - isDiff, - project, - formats, - output, -}: { - directory: string; - isDiff?: boolean; - project?: string; - formats?: TFormat[]; - output: string; -}): PersistedCliFiles { - const rootDir = path.join(directory, output); - const filename = isDiff - ? `${createFilename(project)}-diff` - : createFilename(project); - const filePaths = (formats ?? DEFAULT_PERSIST_FORMAT).reduce( - (acc, format) => ({ - ...acc, - [`${format}FilePath`]: path.join(rootDir, `${filename}.${format}`), - }), - // eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter, @typescript-eslint/consistent-type-assertions - {} as PersistedCliFilesFormats, + return objectFromEntries( + DEFAULT_PERSIST_FORMAT.map(format => [ + format, + path.join(dir, `${name}.${format}`), + ]), ); - const files = Object.values(filePaths); - - return { - ...filePaths, - artifactData: { - rootDir, - files, - }, - }; -} - -export function findPersistedFiles({ - rootDir, - files, - project, -}: { - rootDir: string; - files: string[]; - project?: string; -}): PersistedCliFiles { - const filename = createFilename(project); - const filePaths = DEFAULT_PERSIST_FORMAT.reduce((acc, format) => { - const matchedFile = files.find(file => file === `${filename}.${format}`); - if (!matchedFile) { - return acc; - } - return { ...acc, [`${format}FilePath`]: path.join(rootDir, matchedFile) }; - // eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter, @typescript-eslint/consistent-type-assertions - }, {} as PersistedCliFilesFormats); - return { - ...filePaths, - artifactData: { - rootDir, - files: Object.values(filePaths), - }, - }; } -function createFilename(project: string | undefined): string { - if (!project) { - return DEFAULT_PERSIST_FILENAME; +export async function parsePersistConfig( + json: unknown, +): Promise> { + const schema = z.object({ persist: persistConfigSchema.optional() }); + const result = await schema.safeParseAsync(json); + if (result.error) { + throw new Error(`Invalid persist config - ${stringifyError(result.error)}`); } - const prefix = projectToFilename(project); - return `${prefix}-${DEFAULT_PERSIST_FILENAME}`; + return result.data; } diff --git a/packages/ci/src/lib/cli/persist.unit.test.ts b/packages/ci/src/lib/cli/persist.unit.test.ts index 48cf96592..222824134 100644 --- a/packages/ci/src/lib/cli/persist.unit.test.ts +++ b/packages/ci/src/lib/cli/persist.unit.test.ts @@ -1,152 +1,120 @@ -import { join } from 'node:path'; -import { - type PersistedCliFiles, - findPersistedFiles, - persistCliOptions, - persistedCliFiles, -} from './persist'; +import path from 'node:path'; +import type { CoreConfig } from '@code-pushup/models'; +import { parsePersistConfig, persistedFilesFromConfig } from './persist.js'; -describe('persistCliOptions', () => { - it('should create CLI arguments for standalone project', () => { +describe('persistedFilesFromConfig', () => { + it('should return default report paths when no config is set', () => { + expect(persistedFilesFromConfig({}, { directory: process.cwd() })).toEqual({ + json: path.join(process.cwd(), '.code-pushup', 'report.json'), + md: path.join(process.cwd(), '.code-pushup', 'report.md'), + }); + }); + + it('should return default diff paths when no config is set', () => { expect( - persistCliOptions({ - directory: process.cwd(), - output: '.code-pushup', - }), - ).toEqual([ - `--persist.outputDir=${join(process.cwd(), '.code-pushup')}`, - '--persist.filename=report', - '--persist.format=json', - '--persist.format=md', - ]); + persistedFilesFromConfig( + { persist: {} }, + { directory: process.cwd(), isDiff: true }, + ), + ).toEqual({ + json: path.join(process.cwd(), '.code-pushup', 'report-diff.json'), + md: path.join(process.cwd(), '.code-pushup', 'report-diff.md'), + }); }); - it('should create CLI arguments for monorepo project', () => { + it('should return diff paths with filename from config', () => { expect( - persistCliOptions({ - project: 'utils', - directory: process.cwd(), - output: '.code-pushup', - }), - ).toEqual([ - `--persist.outputDir=${join(process.cwd(), '.code-pushup')}`, - '--persist.filename=utils-report', - '--persist.format=json', - '--persist.format=md', - ]); + persistedFilesFromConfig( + { persist: { filename: 'merged-report' } }, + { directory: process.cwd(), isDiff: true }, + ), + ).toEqual({ + json: path.join(process.cwd(), '.code-pushup', 'merged-report-diff.json'), + md: path.join(process.cwd(), '.code-pushup', 'merged-report-diff.md'), + }); }); -}); -describe('persistedCliFiles', () => { - it('should determine persisted files for standalone report', () => { + it('should return report paths with outputDir from config', () => { expect( - persistedCliFiles({ - directory: process.cwd(), - output: '.code-pushup', - }), - ).toEqual({ - jsonFilePath: join(process.cwd(), '.code-pushup/report.json'), - mdFilePath: join(process.cwd(), '.code-pushup/report.md'), - artifactData: { - rootDir: join(process.cwd(), '.code-pushup'), - files: [ - join(process.cwd(), '.code-pushup/report.json'), - join(process.cwd(), '.code-pushup/report.md'), - ], - }, + persistedFilesFromConfig( + { persist: { outputDir: 'tmp' } }, + { directory: process.cwd() }, + ), + ).toEqual({ + json: path.join(process.cwd(), 'tmp', 'report.json'), + md: path.join(process.cwd(), 'tmp', 'report.md'), }); }); - it('should determine persisted files for monorepo report', () => { + it('should append relative outputDir to working directory', () => { expect( - persistedCliFiles({ - directory: process.cwd(), - output: '.code-pushup/auth', - project: 'auth', - }), - ).toEqual({ - jsonFilePath: join(process.cwd(), '.code-pushup/auth/auth-report.json'), - mdFilePath: join(process.cwd(), '.code-pushup/auth/auth-report.md'), - artifactData: { - rootDir: join(process.cwd(), '.code-pushup/auth'), - files: [ - join(process.cwd(), '.code-pushup/auth/auth-report.json'), - join(process.cwd(), '.code-pushup/auth/auth-report.md'), - ], - }, + persistedFilesFromConfig( + { persist: { outputDir: 'tmp' } }, + { directory: path.join(process.cwd(), 'backend') }, + ), + ).toEqual({ + json: path.join(process.cwd(), 'backend', 'tmp', 'report.json'), + md: path.join(process.cwd(), 'backend', 'tmp', 'report.md'), }); }); - it('should determine persisted files for diff in Markdown format only', () => { + it('should ignore working directory when absolute outputDir in config', () => { expect( - persistedCliFiles({ - directory: process.cwd(), - output: '.code-pushup', - isDiff: true, - formats: ['md'], - }), - ).toEqual>({ - mdFilePath: join(process.cwd(), '.code-pushup/report-diff.md'), - artifactData: { - rootDir: join(process.cwd(), '.code-pushup'), - files: [join(process.cwd(), '.code-pushup/report-diff.md')], - }, + persistedFilesFromConfig( + { persist: { outputDir: path.join(process.cwd(), 'tmp') } }, + { directory: path.join(process.cwd(), 'backend') }, + ), + ).toEqual({ + json: path.join(process.cwd(), 'tmp', 'report.json'), + md: path.join(process.cwd(), 'tmp', 'report.md'), }); }); }); -describe('findPersistedFiles', () => { - it('should find report files in artifact data for standalone project', () => { - expect( - findPersistedFiles({ - rootDir: join(process.cwd(), '.code-pushup'), - files: [ - 'report-diff.json', - 'report-diff.md', - 'report.json', - 'report.md', - ], - }), - ).toEqual({ - jsonFilePath: join(process.cwd(), '.code-pushup/report.json'), - mdFilePath: join(process.cwd(), '.code-pushup/report.md'), - artifactData: { - rootDir: join(process.cwd(), '.code-pushup'), - files: [ - join(process.cwd(), '.code-pushup/report.json'), - join(process.cwd(), '.code-pushup/report.md'), - ], +describe('parsePersistConfig', () => { + it('should validate only persist config', async () => { + await expect( + parsePersistConfig({ + persist: { + outputDir: '.code-pushup', + filename: 'report', + format: ['json', 'md'], + }, + // missing props (slug, etc.) + plugins: [{ title: 'some plugin', audits: [{ title: 'some audit' }] }], + } as CoreConfig), + ).resolves.toEqual({ + persist: { + outputDir: '.code-pushup', + filename: 'report', + format: ['json', 'md'], }, }); }); - it('should find report files in artifact data for monorepo project', () => { - expect( - findPersistedFiles({ - rootDir: join(process.cwd(), '.code-pushup'), - files: [ - 'backend-report-diff.json', - 'backend-report-diff.md', - 'backend-report.json', - 'backend-report.md', - 'frontend-report-diff.json', - 'frontend-report-diff.md', - 'frontend-report.json', - 'frontend-report.md', - 'report-diff.md', - ], - project: 'frontend', - }), - ).toEqual({ - jsonFilePath: join(process.cwd(), '.code-pushup/frontend-report.json'), - mdFilePath: join(process.cwd(), '.code-pushup/frontend-report.md'), - artifactData: { - rootDir: join(process.cwd(), '.code-pushup'), - files: [ - join(process.cwd(), '.code-pushup/frontend-report.json'), - join(process.cwd(), '.code-pushup/frontend-report.md'), - ], - }, + it('should accept missing persist config', async () => { + await expect(parsePersistConfig({})).resolves.toEqual({}); + }); + + it('should accept empty persist config', async () => { + await expect(parsePersistConfig({ persist: {} })).resolves.toEqual({ + persist: {}, }); }); + + it('should accept partial persist config', async () => { + await expect( + parsePersistConfig({ persist: { outputDir: 'tmp' } }), + ).resolves.toEqual({ + persist: { outputDir: 'tmp' }, + }); + }); + + it('should error if persist config is invalid', async () => { + await expect( + parsePersistConfig({ persist: { format: ['json', 'html'] } }), + ).rejects.toThrow( + /^Invalid persist config - ZodError:.*Invalid enum value. Expected 'json' \| 'md', received 'html'/s, + ); + }); }); diff --git a/packages/ci/src/lib/comment.ts b/packages/ci/src/lib/comment.ts index cd6310bee..51b9df777 100644 --- a/packages/ci/src/lib/comment.ts +++ b/packages/ci/src/lib/comment.ts @@ -1,5 +1,5 @@ import { readFile } from 'node:fs/promises'; -import type { Logger, ProviderAPIClient } from './models'; +import type { Logger, ProviderAPIClient } from './models.js'; export async function commentOnPR( mdPath: string, diff --git a/packages/ci/src/lib/comment.unit.test.ts b/packages/ci/src/lib/comment.unit.test.ts index 7e5ff9a3a..97a0c4c16 100644 --- a/packages/ci/src/lib/comment.unit.test.ts +++ b/packages/ci/src/lib/comment.unit.test.ts @@ -1,14 +1,14 @@ import { vol } from 'memfs'; import { writeFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; -import { commentOnPR } from './comment'; -import type { Comment, Logger, ProviderAPIClient } from './models'; +import { commentOnPR } from './comment.js'; +import type { Comment, Logger, ProviderAPIClient } from './models.js'; describe('commentOnPR', () => { const diffText = '# Code PushUp\n\nNo changes to report.\n'; const diffFile = 'report-diff.md'; - const diffPath = join(MEMFS_VOLUME, diffFile); + const diffPath = path.join(MEMFS_VOLUME, diffFile); const comment: Comment = { id: 42, diff --git a/packages/ci/src/lib/constants.ts b/packages/ci/src/lib/constants.ts index b3d5d8396..50d1320b7 100644 --- a/packages/ci/src/lib/constants.ts +++ b/packages/ci/src/lib/constants.ts @@ -1,8 +1,8 @@ -import { DEFAULT_PERSIST_OUTPUT_DIR } from '@code-pushup/models'; -import type { Settings } from './models'; +import type { Settings } from './models.js'; export const DEFAULT_SETTINGS: Settings = { monorepo: false, + parallel: false, projects: null, task: 'code-pushup', bin: 'npx --no-install code-pushup', @@ -12,5 +12,5 @@ export const DEFAULT_SETTINGS: Settings = { debug: false, detectNewIssues: true, logger: console, - output: DEFAULT_PERSIST_OUTPUT_DIR, + nxProjectsFilter: '--with-target={task}', }; diff --git a/packages/ci/src/lib/git.integration.test.ts b/packages/ci/src/lib/git.integration.test.ts index e68f68871..414991fba 100644 --- a/packages/ci/src/lib/git.integration.test.ts +++ b/packages/ci/src/lib/git.integration.test.ts @@ -1,11 +1,11 @@ import { mkdir, rename, rm, writeFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { type SimpleGit, simpleGit } from 'simple-git'; import { initGitRepo } from '@code-pushup/test-utils'; -import { type ChangedFiles, listChangedFiles } from './git'; +import { type ChangedFiles, listChangedFiles } from './git.js'; describe('git diff', () => { - const baseDir = join('tmp', 'ci', 'git-utils-test'); + const baseDir = path.join('tmp', 'ci', 'git-utils-test'); let git: SimpleGit; @@ -13,13 +13,13 @@ describe('git diff', () => { await rm(baseDir, { recursive: true, force: true }); git = await initGitRepo(simpleGit, { baseDir }); - await writeFile(join(baseDir, 'LICENSE'), 'MIT License\n\n...'); + await writeFile(path.join(baseDir, 'LICENSE'), 'MIT License\n\n...'); await writeFile( - join(baseDir, 'index.js'), + path.join(baseDir, 'index.js'), 'export const sum = values => values.reduce((acc, val) => acc + val, 0)\n', ); await writeFile( - join(baseDir, 'package.json'), + path.join(baseDir, 'package.json'), JSON.stringify( { name: 'sum', type: 'module', main: 'index.js' }, null, @@ -30,11 +30,14 @@ describe('git diff', () => { await git.commit('Initial commit'); await git.checkoutLocalBranch('testing'); - await mkdir(join(baseDir, 'src')); - await mkdir(join(baseDir, 'test')); - await rename(join(baseDir, 'index.js'), join(baseDir, 'src/index.js')); + await mkdir(path.join(baseDir, 'src')); + await mkdir(path.join(baseDir, 'test')); + await rename( + path.join(baseDir, 'index.js'), + path.join(baseDir, 'src/index.js'), + ); await writeFile( - join(baseDir, 'test/index.test.js'), + path.join(baseDir, 'test/index.test.js'), [ "import assert from 'node:assert'", "import test from 'node:test'", @@ -48,7 +51,7 @@ describe('git diff', () => { .join(''), ); await writeFile( - join(baseDir, 'package.json'), + path.join(baseDir, 'package.json'), JSON.stringify( { name: 'sum', diff --git a/packages/ci/src/lib/issues.ts b/packages/ci/src/lib/issues.ts index e1fd6775d..2768c43e7 100644 --- a/packages/ci/src/lib/issues.ts +++ b/packages/ci/src/lib/issues.ts @@ -12,7 +12,7 @@ import { adjustFileName, adjustLine, isFileChanged, -} from './git'; +} from './git.js'; export type SourceFileIssue = Required & IssueContext; diff --git a/packages/ci/src/lib/issues.unit.test.ts b/packages/ci/src/lib/issues.unit.test.ts index 5fd854285..806202ca5 100644 --- a/packages/ci/src/lib/issues.unit.test.ts +++ b/packages/ci/src/lib/issues.unit.test.ts @@ -3,7 +3,7 @@ import { calculateGroupImpact, getAuditImpactValue, issuesMatch, -} from './issues'; +} from './issues.js'; describe('issues comparison', () => { it('should match issues with exact same metadata', () => { diff --git a/packages/ci/src/lib/models.ts b/packages/ci/src/lib/models.ts index 724f4322e..7bb5cf54b 100644 --- a/packages/ci/src/lib/models.ts +++ b/packages/ci/src/lib/models.ts @@ -1,5 +1,6 @@ -import type { SourceFileIssue } from './issues'; -import type { MonorepoTool } from './monorepo'; +import type { Format } from '@code-pushup/models'; +import type { SourceFileIssue } from './issues.js'; +import type { MonorepoTool } from './monorepo/index.js'; /** * Customization options for {@link runInCI} @@ -7,8 +8,10 @@ import type { MonorepoTool } from './monorepo'; */ export type Options = { monorepo?: boolean | MonorepoTool; + parallel?: boolean | number; projects?: string[] | null; task?: string; + nxProjectsFilter?: string | string[]; bin?: string; config?: string | null; directory?: string; @@ -16,7 +19,6 @@ export type Options = { debug?: boolean; detectNewIssues?: boolean; logger?: Logger; - output?: string; }; /** @@ -91,7 +93,7 @@ export type MonorepoRunResult = { mode: 'monorepo'; projects: ProjectRunResult[]; commentId?: number; - diffArtifact?: ArtifactData; + diffPath?: string; }; /** @@ -99,9 +101,9 @@ export type MonorepoRunResult = { */ export type ProjectRunResult = { name: string; - artifacts: { - report: ArtifactData; - diff?: ArtifactData; + files: { + report: OutputFiles; + diff?: OutputFiles; }; newIssues?: SourceFileIssue[]; }; @@ -109,7 +111,4 @@ export type ProjectRunResult = { /** * Paths to output files from {@link runInCI}, for uploading as job artifact */ -export type ArtifactData = { - rootDir: string; - files: string[]; -}; +export type OutputFiles = Record; diff --git a/packages/ci/src/lib/monorepo/detect-tool.ts b/packages/ci/src/lib/monorepo/detect-tool.ts index 6004714ee..288de72e0 100644 --- a/packages/ci/src/lib/monorepo/detect-tool.ts +++ b/packages/ci/src/lib/monorepo/detect-tool.ts @@ -1,5 +1,5 @@ -import { MONOREPO_TOOL_HANDLERS } from './handlers'; -import type { MonorepoHandlerOptions, MonorepoTool } from './tools'; +import { MONOREPO_TOOL_HANDLERS } from './handlers/index.js'; +import type { MonorepoHandlerOptions, MonorepoTool } from './tools.js'; export async function detectMonorepoTool( options: MonorepoHandlerOptions, diff --git a/packages/ci/src/lib/monorepo/handlers/index.ts b/packages/ci/src/lib/monorepo/handlers/index.ts index 30306810f..7bc1e202e 100644 --- a/packages/ci/src/lib/monorepo/handlers/index.ts +++ b/packages/ci/src/lib/monorepo/handlers/index.ts @@ -1,9 +1,9 @@ -import type { MonorepoTool, MonorepoToolHandler } from '../tools'; -import { npmHandler } from './npm'; -import { nxHandler } from './nx'; -import { pnpmHandler } from './pnpm'; -import { turboHandler } from './turbo'; -import { yarnHandler } from './yarn'; +import type { MonorepoTool, MonorepoToolHandler } from '../tools.js'; +import { npmHandler } from './npm.js'; +import { nxHandler } from './nx.js'; +import { pnpmHandler } from './pnpm.js'; +import { turboHandler } from './turbo.js'; +import { yarnHandler } from './yarn.js'; export const MONOREPO_TOOL_HANDLERS = [ nxHandler, diff --git a/packages/ci/src/lib/monorepo/handlers/npm.ts b/packages/ci/src/lib/monorepo/handlers/npm.ts index 5956a3a56..859bd17db 100644 --- a/packages/ci/src/lib/monorepo/handlers/npm.ts +++ b/packages/ci/src/lib/monorepo/handlers/npm.ts @@ -1,21 +1,23 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { fileExists } from '@code-pushup/utils'; import { hasCodePushUpDependency, hasScript, hasWorkspacesEnabled, listWorkspaces, -} from '../packages'; -import type { MonorepoToolHandler } from '../tools'; +} from '../packages.js'; +import type { MonorepoToolHandler } from '../tools.js'; export const npmHandler: MonorepoToolHandler = { tool: 'npm', + async isConfigured(options) { return ( - (await fileExists(join(options.cwd, 'package-lock.json'))) && + (await fileExists(path.join(options.cwd, 'package-lock.json'))) && (await hasWorkspacesEnabled(options.cwd)) ); }, + async listProjects(options) { const { workspaces, rootPackageJson } = await listWorkspaces(options.cwd); return workspaces @@ -25,11 +27,17 @@ export const npmHandler: MonorepoToolHandler = { hasCodePushUpDependency(packageJson) || hasCodePushUpDependency(rootPackageJson), ) - .map(({ name, packageJson }) => ({ + .map(({ name, directory, packageJson }) => ({ name, + directory, bin: hasScript(packageJson, options.task) - ? `npm -w ${name} run ${options.task} --` - : `npm -w ${name} exec ${options.task} --`, + ? `npm run ${options.task} --` + : `npm exec ${options.task} --`, })); }, + + createRunManyCommand(options) { + // neither parallel execution nor projects filter are supported in NPM workspaces + return `npm run ${options.task} --workspaces --if-present --`; + }, }; diff --git a/packages/ci/src/lib/monorepo/handlers/npm.unit.test.ts b/packages/ci/src/lib/monorepo/handlers/npm.unit.test.ts new file mode 100644 index 000000000..45b36c1cb --- /dev/null +++ b/packages/ci/src/lib/monorepo/handlers/npm.unit.test.ts @@ -0,0 +1,205 @@ +import { vol } from 'memfs'; +import path from 'node:path'; +import type { PackageJson } from 'type-fest'; +import { MEMFS_VOLUME } from '@code-pushup/test-utils'; +import type { + MonorepoHandlerOptions, + MonorepoHandlerProjectsContext, + ProjectConfig, +} from '../tools.js'; +import { npmHandler } from './npm.js'; + +describe('npmHandler', () => { + const options = { + cwd: MEMFS_VOLUME, + task: 'code-pushup', + } as MonorepoHandlerOptions; + + const pkgJsonContent = (content: PackageJson): string => + JSON.stringify(content); + + describe('isConfigured', () => { + it('should detect NPM workspaces when package-lock.json exists and "workspaces" set in package.json', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['packages/*'], + }), + 'package-lock.json': '', + }, + MEMFS_VOLUME, + ); + await expect(npmHandler.isConfigured(options)).resolves.toBe(true); + }); + + it('should NOT detect NPM workspaces when "workspaces" not set in package.json', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({}), + 'package-lock.json': '', + }, + MEMFS_VOLUME, + ); + await expect(npmHandler.isConfigured(options)).resolves.toBe(false); + }); + + it("should NOT detect NPM workspaces when package-lock.json doesn't exist", async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['packages/*'], + }), + 'yarn.lock': '', + }, + MEMFS_VOLUME, + ); + await expect(npmHandler.isConfigured(options)).resolves.toBe(false); + }); + }); + + describe('listProjects', () => { + it('should list all NPM workspaces with code-pushup script', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['apps/*', 'libs/*'], + }), + 'package-lock.json': '', + 'apps/backend/package.json': pkgJsonContent({ + name: 'backend', + scripts: { 'code-pushup': 'code-pushup --no-progress' }, + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + 'apps/frontend/package.json': pkgJsonContent({ + name: 'frontend', + // missing script + }), + 'libs/shared/package.json': pkgJsonContent({ + name: 'shared', + scripts: { 'code-pushup': 'code-pushup --no-progress' }, + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + }, + MEMFS_VOLUME, + ); + + await expect(npmHandler.listProjects(options)).resolves.toEqual([ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'apps', 'backend'), + bin: 'npm run code-pushup --', + }, + { + name: 'shared', + directory: path.join(MEMFS_VOLUME, 'libs', 'shared'), + bin: 'npm run code-pushup --', + }, + ] satisfies ProjectConfig[]); + }); + + it('should list all NPM workspaces with code-pushup dependency', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['apps/*', 'libs/*'], + }), + 'package-lock.json': '', + 'apps/backend/package.json': pkgJsonContent({ + name: 'backend', + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + 'apps/frontend/package.json': pkgJsonContent({ + name: 'frontend', + // missing dependency + }), + 'libs/shared/package.json': pkgJsonContent({ + name: 'shared', + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + }, + MEMFS_VOLUME, + ); + + await expect(npmHandler.listProjects(options)).resolves.toEqual([ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'apps', 'backend'), + bin: 'npm exec code-pushup --', + }, + { + name: 'shared', + directory: path.join(MEMFS_VOLUME, 'libs', 'shared'), + bin: 'npm exec code-pushup --', + }, + ] satisfies ProjectConfig[]); + }); + + it('should list all NPM workspaces when code-pushup installed at root level', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['apps/*', 'libs/*'], + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + 'package-lock.json': '', + 'apps/backend/package.json': pkgJsonContent({ + name: 'backend', + }), + 'apps/frontend/package.json': pkgJsonContent({ + name: 'frontend', + }), + 'libs/shared/package.json': pkgJsonContent({ + name: 'shared', + }), + }, + MEMFS_VOLUME, + ); + + await expect(npmHandler.listProjects(options)).resolves.toEqual([ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'apps', 'backend'), + bin: 'npm exec code-pushup --', + }, + { + name: 'frontend', + directory: path.join(MEMFS_VOLUME, 'apps', 'frontend'), + bin: 'npm exec code-pushup --', + }, + { + name: 'shared', + directory: path.join(MEMFS_VOLUME, 'libs', 'shared'), + bin: 'npm exec code-pushup --', + }, + ] satisfies ProjectConfig[]); + }); + }); + + describe('createRunManyCommand', () => { + const projects: MonorepoHandlerProjectsContext = { + all: [ + { + name: 'api', + directory: path.join(MEMFS_VOLUME, 'api'), + bin: 'npm run code-pushup --', + }, + { + name: 'ui', + directory: path.join(MEMFS_VOLUME, 'ui'), + bin: 'npm run code-pushup --', + }, + ], + }; + + it('should create command to run npm script for all workspaces', () => { + expect(npmHandler.createRunManyCommand(options, projects)).toBe( + 'npm run code-pushup --workspaces --if-present --', + ); + }); + }); +}); diff --git a/packages/ci/src/lib/monorepo/handlers/nx.ts b/packages/ci/src/lib/monorepo/handlers/nx.ts index dc641a348..c84ab2d84 100644 --- a/packages/ci/src/lib/monorepo/handlers/nx.ts +++ b/packages/ci/src/lib/monorepo/handlers/nx.ts @@ -1,39 +1,65 @@ -import { join } from 'node:path'; -import { executeProcess, fileExists, stringifyError } from '@code-pushup/utils'; -import type { MonorepoToolHandler } from '../tools'; +import path from 'node:path'; +import { + executeProcess, + fileExists, + stringifyError, + toArray, +} from '@code-pushup/utils'; +import type { MonorepoToolHandler } from '../tools.js'; export const nxHandler: MonorepoToolHandler = { tool: 'nx', + async isConfigured(options) { return ( - (await fileExists(join(options.cwd, 'nx.json'))) && + (await fileExists(path.join(options.cwd, 'nx.json'))) && ( await executeProcess({ - ...options, command: 'npx', args: ['nx', 'report'], + cwd: options.cwd, + observer: options.observer, + ignoreExitCode: true, }) ).code === 0 ); }, + async listProjects(options) { const { stdout } = await executeProcess({ - ...options, command: 'npx', args: [ 'nx', 'show', 'projects', - `--with-target=${options.task}`, + ...toArray(options.nxProjectsFilter).map(arg => + arg.replaceAll('{task}', options.task), + ), '--json', ], + cwd: options.cwd, + observer: options.observer, }); const projects = parseProjects(stdout); - return projects.map(project => ({ + return projects.toSorted().map(project => ({ name: project, bin: `npx nx run ${project}:${options.task} --`, })); }, + + createRunManyCommand(options, projects) { + const projectNames: string[] = + projects.only ?? projects.all.map(({ name }) => name); + return [ + 'npx', + 'nx', + 'run-many', + `--targets=${options.task}`, + `--parallel=${options.parallel}`, + `--projects=${projectNames.join(',')}`, + '--', + ].join(' '); + }, }; function parseProjects(stdout: string): string[] { diff --git a/packages/ci/src/lib/monorepo/handlers/nx.unit.test.ts b/packages/ci/src/lib/monorepo/handlers/nx.unit.test.ts new file mode 100644 index 000000000..4ad65905c --- /dev/null +++ b/packages/ci/src/lib/monorepo/handlers/nx.unit.test.ts @@ -0,0 +1,163 @@ +import { vol } from 'memfs'; +import { MEMFS_VOLUME } from '@code-pushup/test-utils'; +import * as utils from '@code-pushup/utils'; +import type { + MonorepoHandlerOptions, + MonorepoHandlerProjectsContext, + ProjectConfig, +} from '../tools.js'; +import { nxHandler } from './nx.js'; + +describe('nxHandler', () => { + const options: MonorepoHandlerOptions = { + cwd: MEMFS_VOLUME, + task: 'code-pushup', + parallel: false, + nxProjectsFilter: '--with-target={task}', + }; + + describe('isConfigured', () => { + it('should detect Nx when nx.json exists and `nx report` succeeds', async () => { + vol.fromJSON({ 'nx.json': '{}' }, MEMFS_VOLUME); + vi.spyOn(utils, 'executeProcess').mockResolvedValue({ + code: 0, + stdout: 'NX Report complete - copy this into the issue template', + } as utils.ProcessResult); + + await expect(nxHandler.isConfigured(options)).resolves.toBe(true); + }); + + it("should NOT detect Nx when nx.json doesn't exist", async () => { + vol.fromJSON({ 'turbo.json': '{}' }, MEMFS_VOLUME); + vi.spyOn(utils, 'executeProcess').mockResolvedValue({ + code: 0, + } as utils.ProcessResult); + + await expect(nxHandler.isConfigured(options)).resolves.toBe(false); + }); + + it('should NOT detect Nx when `nx report` fails with non-zero exit code', async () => { + vol.fromJSON({ 'nx.json': '' }, MEMFS_VOLUME); + vi.spyOn(utils, 'executeProcess').mockResolvedValue({ + code: 1, + stderr: 'Error: ValueExpected in nx.json', + } as utils.ProcessResult); + + await expect(nxHandler.isConfigured(options)).resolves.toBe(false); + }); + }); + + describe('listProjects', () => { + beforeEach(() => { + vi.spyOn(utils, 'executeProcess').mockResolvedValue({ + stdout: '["backend","frontend"]', + } as utils.ProcessResult); + }); + + it('should list projects from `nx show projects`', async () => { + await expect(nxHandler.listProjects(options)).resolves.toEqual([ + { name: 'backend', bin: 'npx nx run backend:code-pushup --' }, + { name: 'frontend', bin: 'npx nx run frontend:code-pushup --' }, + ] satisfies ProjectConfig[]); + }); + + it('should forward nxProjectsFilter option to `nx show projects`', async () => { + await nxHandler.listProjects({ + ...options, + nxProjectsFilter: ['--affected', '--exclude=*-e2e'], + }); + + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: 'npx', + args: [ + 'nx', + 'show', + 'projects', + '--affected', + '--exclude=*-e2e', + '--json', + ], + cwd: MEMFS_VOLUME, + } satisfies utils.ProcessConfig); + }); + + it('should replace {task} in nxProjectsFilter with task option in `nx show projects` arguments', async () => { + await nxHandler.listProjects({ + ...options, + task: 'code-pushup', + nxProjectsFilter: '--with-target={task}', + }); + + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: 'npx', + args: ['nx', 'show', 'projects', '--with-target=code-pushup', '--json'], + cwd: MEMFS_VOLUME, + } satisfies utils.ProcessConfig); + }); + + it('should throw if `nx show projects` outputs invalid JSON', async () => { + vi.spyOn(utils, 'executeProcess').mockResolvedValue({ + stdout: 'backend\nfrontend\n', + } as utils.ProcessResult); + + await expect(nxHandler.listProjects(options)).rejects.toThrow( + "Invalid non-JSON output from 'nx show projects' - SyntaxError: Unexpected token", + ); + }); + + it("should throw if `nx show projects` JSON output isn't array of strings", async () => { + vi.spyOn(utils, 'executeProcess').mockResolvedValue({ + stdout: '"backend"', + } as utils.ProcessResult); + + await expect(nxHandler.listProjects(options)).rejects.toThrow( + 'Invalid JSON output from \'nx show projects\', expected array of strings, received "backend"', + ); + }); + }); + + describe('createRunManyCommand', () => { + const projects: MonorepoHandlerProjectsContext = { + all: [ + { name: 'backend', bin: 'npx nx run backend:code-pushup --' }, + { name: 'frontend', bin: 'npx nx run frontend:code-pushup --' }, + ], + }; + + it('should run script for all listed projects sequentially by default', () => { + expect(nxHandler.createRunManyCommand(options, projects)).toBe( + 'npx nx run-many --targets=code-pushup --parallel=false --projects=backend,frontend --', + ); + }); + + it('should set parallel flag with default number of tasks', () => { + expect( + nxHandler.createRunManyCommand( + { ...options, parallel: true }, + projects, + ), + ).toBe( + 'npx nx run-many --targets=code-pushup --parallel=true --projects=backend,frontend --', + ); + }); + + it('should set parallel flag with custom number of tasks', () => { + expect( + nxHandler.createRunManyCommand({ ...options, parallel: 5 }, projects), + ).toBe( + 'npx nx run-many --targets=code-pushup --parallel=5 --projects=backend,frontend --', + ); + }); + + it('should filter projects by list of project names', () => { + expect( + nxHandler.createRunManyCommand(options, { + ...projects, + only: ['frontend'], + }), + ).toBe( + 'npx nx run-many --targets=code-pushup --parallel=false --projects=frontend --', + ); + }); + }); +}); diff --git a/packages/ci/src/lib/monorepo/handlers/pnpm.ts b/packages/ci/src/lib/monorepo/handlers/pnpm.ts index cd24bb5e0..45885e823 100644 --- a/packages/ci/src/lib/monorepo/handlers/pnpm.ts +++ b/packages/ci/src/lib/monorepo/handlers/pnpm.ts @@ -1,4 +1,4 @@ -import { join } from 'node:path'; +import path from 'node:path'; import * as YAML from 'yaml'; import { fileExists, readTextFile } from '@code-pushup/utils'; import { @@ -6,21 +6,23 @@ import { hasScript, listPackages, readRootPackageJson, -} from '../packages'; -import type { MonorepoToolHandler } from '../tools'; +} from '../packages.js'; +import type { MonorepoToolHandler } from '../tools.js'; const WORKSPACE_FILE = 'pnpm-workspace.yaml'; export const pnpmHandler: MonorepoToolHandler = { tool: 'pnpm', + async isConfigured(options) { return ( - (await fileExists(join(options.cwd, WORKSPACE_FILE))) && - (await fileExists(join(options.cwd, 'package.json'))) + (await fileExists(path.join(options.cwd, WORKSPACE_FILE))) && + (await fileExists(path.join(options.cwd, 'package.json'))) ); }, + async listProjects(options) { - const yaml = await readTextFile(join(options.cwd, WORKSPACE_FILE)); + const yaml = await readTextFile(path.join(options.cwd, WORKSPACE_FILE)); const workspace = YAML.parse(yaml) as { packages?: string[] }; const packages = await listPackages(options.cwd, workspace.packages); const rootPackageJson = await readRootPackageJson(options.cwd); @@ -31,11 +33,31 @@ export const pnpmHandler: MonorepoToolHandler = { hasCodePushUpDependency(packageJson) || hasCodePushUpDependency(rootPackageJson), ) - .map(({ name, packageJson }) => ({ + .map(({ name, directory, packageJson }) => ({ name, + directory, bin: hasScript(packageJson, options.task) - ? `pnpm -F ${name} run ${options.task}` - : `pnpm -F ${name} exec ${options.task}`, + ? `pnpm run ${options.task}` + : `pnpm exec ${options.task}`, })); }, + + createRunManyCommand(options, projects) { + // https://pnpm.io/cli/recursive#--workspace-concurrency + const workspaceConcurrency: number | null = + options.parallel === true + ? null + : options.parallel === false + ? 1 + : options.parallel; + return [ + 'pnpm', + '--recursive', + ...(workspaceConcurrency == null + ? [] + : [`--workspace-concurrency=${workspaceConcurrency}`]), + ...(projects.only?.map(project => `--filter=${project}`) ?? []), + options.task, + ].join(' '); + }, }; diff --git a/packages/ci/src/lib/monorepo/handlers/pnpm.unit.test.ts b/packages/ci/src/lib/monorepo/handlers/pnpm.unit.test.ts new file mode 100644 index 000000000..75c42538f --- /dev/null +++ b/packages/ci/src/lib/monorepo/handlers/pnpm.unit.test.ts @@ -0,0 +1,227 @@ +import { vol } from 'memfs'; +import path from 'node:path'; +import type { PackageJson } from 'type-fest'; +import { MEMFS_VOLUME } from '@code-pushup/test-utils'; +import type { + MonorepoHandlerOptions, + MonorepoHandlerProjectsContext, + ProjectConfig, +} from '../tools.js'; +import { pnpmHandler } from './pnpm.js'; + +describe('pnpmHandler', () => { + const options = { + cwd: MEMFS_VOLUME, + task: 'code-pushup', + parallel: false, + } as MonorepoHandlerOptions; + + const pkgJsonContent = (content: PackageJson): string => + JSON.stringify(content); + + describe('isConfigured', () => { + it('should detect PNPM workspace when pnpm-workspace.yaml and package.json files exist', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({}), + 'pnpm-workspace.yaml': 'packages:\n- apps/*\n- libs/*\n\n', + }, + MEMFS_VOLUME, + ); + await expect(pnpmHandler.isConfigured(options)).resolves.toBe(true); + }); + + it("should NOT detect PNPM workspace when pnpm-workspace.yaml doesn't exist", async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({}), + 'pnpm-lock.yaml': '', + }, + MEMFS_VOLUME, + ); + await expect(pnpmHandler.isConfigured(options)).resolves.toBe(false); + }); + + it("should NOT detect PNPM workspace when root package.json doesn't exist", async () => { + vol.fromJSON( + { + 'packages/cli/package.json': pkgJsonContent({}), + 'packages/cli/pnpm-lock.yaml': '', + 'packages/core/package.json': pkgJsonContent({}), + 'packages/core/pnpm-lock.yaml': '', + }, + MEMFS_VOLUME, + ); + await expect(pnpmHandler.isConfigured(options)).resolves.toBe(false); + }); + }); + + describe('listProjects', () => { + it('should list all PNPM workspace packages with code-pushup script', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({}), + 'pnpm-workspace.yaml': 'packages:\n- apps/*\n- libs/*\n\n', + 'apps/backend/package.json': pkgJsonContent({ + name: 'backend', + scripts: { 'code-pushup': 'code-pushup --no-progress' }, + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + 'apps/frontend/package.json': pkgJsonContent({ + name: 'frontend', + // missing script + }), + 'libs/shared/package.json': pkgJsonContent({ + name: 'shared', + scripts: { 'code-pushup': 'code-pushup --no-progress' }, + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + }, + MEMFS_VOLUME, + ); + + await expect(pnpmHandler.listProjects(options)).resolves.toEqual([ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'apps', 'backend'), + bin: 'pnpm run code-pushup', + }, + { + name: 'shared', + directory: path.join(MEMFS_VOLUME, 'libs', 'shared'), + bin: 'pnpm run code-pushup', + }, + ] satisfies ProjectConfig[]); + }); + + it('should list all PNPM workspace packages with code-pushup dependency', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({}), + 'pnpm-workspace.yaml': 'packages:\n- apps/*\n- libs/*\n\n', + 'apps/backend/package.json': pkgJsonContent({ + name: 'backend', + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + 'apps/frontend/package.json': pkgJsonContent({ + name: 'frontend', + // missing dependency + }), + 'libs/shared/package.json': pkgJsonContent({ + name: 'shared', + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + }, + MEMFS_VOLUME, + ); + + await expect(pnpmHandler.listProjects(options)).resolves.toEqual([ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'apps', 'backend'), + bin: 'pnpm exec code-pushup', + }, + { + name: 'shared', + directory: path.join(MEMFS_VOLUME, 'libs', 'shared'), + bin: 'pnpm exec code-pushup', + }, + ] satisfies ProjectConfig[]); + }); + + it('should list all PNPM workspace packages when code-pushup installed at root level', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['apps/*', 'libs/*'], + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + 'pnpm-workspace.yaml': 'packages:\n- apps/*\n- libs/*\n\n', + 'apps/backend/package.json': pkgJsonContent({ + name: 'backend', + }), + 'apps/frontend/package.json': pkgJsonContent({ + name: 'frontend', + }), + 'libs/shared/package.json': pkgJsonContent({ + name: 'shared', + }), + }, + MEMFS_VOLUME, + ); + + await expect(pnpmHandler.listProjects(options)).resolves.toEqual([ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'apps', 'backend'), + bin: 'pnpm exec code-pushup', + }, + { + name: 'frontend', + directory: path.join(MEMFS_VOLUME, 'apps', 'frontend'), + bin: 'pnpm exec code-pushup', + }, + { + name: 'shared', + directory: path.join(MEMFS_VOLUME, 'libs', 'shared'), + bin: 'pnpm exec code-pushup', + }, + ] satisfies ProjectConfig[]); + }); + }); + + describe('createRunManyCommand', () => { + const projects: MonorepoHandlerProjectsContext = { + all: [ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'apps', 'backend'), + bin: 'pnpm run code-pushup', + }, + { + name: 'frontend', + directory: path.join(MEMFS_VOLUME, 'apps', 'frontend'), + bin: 'pnpm run code-pushup', + }, + { + name: 'shared', + directory: path.join(MEMFS_VOLUME, 'libs', 'shared'), + bin: 'pnpm run code-pushup', + }, + ], + }; + + it('should run script for all workspace packages sequentially by default', () => { + expect(pnpmHandler.createRunManyCommand(options, projects)).toBe( + 'pnpm --recursive --workspace-concurrency=1 code-pushup', + ); + }); + + it('should leave default concurrency if parallel flag is true', () => { + expect( + pnpmHandler.createRunManyCommand( + { ...options, parallel: true }, + projects, + ), + ).toBe('pnpm --recursive code-pushup'); + }); + + it('should set parallel flag with custom number of jobs', () => { + expect( + pnpmHandler.createRunManyCommand({ ...options, parallel: 5 }, projects), + ).toBe('pnpm --recursive --workspace-concurrency=5 code-pushup'); + }); + + it('should filter workspace packages by list of project names', () => { + expect( + pnpmHandler.createRunManyCommand(options, { + ...projects, + only: ['frontend', 'shared'], + }), + ).toBe( + 'pnpm --recursive --workspace-concurrency=1 --filter=frontend --filter=shared code-pushup', + ); + }); + }); +}); diff --git a/packages/ci/src/lib/monorepo/handlers/turbo.ts b/packages/ci/src/lib/monorepo/handlers/turbo.ts index 9a2d812ff..49e2e32f5 100644 --- a/packages/ci/src/lib/monorepo/handlers/turbo.ts +++ b/packages/ci/src/lib/monorepo/handlers/turbo.ts @@ -1,9 +1,9 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { fileExists, readJsonFile } from '@code-pushup/utils'; -import type { MonorepoToolHandler } from '../tools'; -import { npmHandler } from './npm'; -import { pnpmHandler } from './pnpm'; -import { yarnHandler } from './yarn'; +import type { MonorepoToolHandler } from '../tools.js'; +import { npmHandler } from './npm.js'; +import { pnpmHandler } from './pnpm.js'; +import { yarnHandler } from './yarn.js'; const WORKSPACE_HANDLERS = [pnpmHandler, yarnHandler, npmHandler]; @@ -13,13 +13,15 @@ type TurboConfig = { export const turboHandler: MonorepoToolHandler = { tool: 'turbo', + async isConfigured(options) { - const configPath = join(options.cwd, 'turbo.json'); + const configPath = path.join(options.cwd, 'turbo.json'); return ( (await fileExists(configPath)) && options.task in (await readJsonFile(configPath)).tasks ); }, + async listProjects(options) { // eslint-disable-next-line functional/no-loop-statements for (const handler of WORKSPACE_HANDLERS) { @@ -27,16 +29,36 @@ export const turboHandler: MonorepoToolHandler = { const projects = await handler.listProjects(options); return projects .filter(({ bin }) => bin.includes(`run ${options.task}`)) // must have package.json script - .map(({ name }) => ({ + .map(({ name, directory }) => ({ name, - bin: `npx turbo run ${options.task} -F ${name} --`, + directory, + bin: `npx turbo run ${options.task} --`, })); } } throw new Error( - `Package manager for Turborepo not found, expected one of ${WORKSPACE_HANDLERS.map( + `Package manager with workspace configuration not found in Turborepo, expected one of ${WORKSPACE_HANDLERS.map( ({ tool }) => tool, ).join('/')}`, ); }, + + createRunManyCommand(options, projects) { + // https://turbo.build/repo/docs/reference/run#--concurrency-number--percentage + const concurrency: number | null = + options.parallel === true + ? null + : options.parallel === false + ? 1 + : options.parallel; + return [ + 'npx', + 'turbo', + 'run', + options.task, + ...(projects.only?.map(project => `--filter=${project}`) ?? []), + ...(concurrency == null ? [] : [`--concurrency=${concurrency}`]), + '--', + ].join(' '); + }, }; diff --git a/packages/ci/src/lib/monorepo/handlers/turbo.unit.test.ts b/packages/ci/src/lib/monorepo/handlers/turbo.unit.test.ts new file mode 100644 index 000000000..5c36993dc --- /dev/null +++ b/packages/ci/src/lib/monorepo/handlers/turbo.unit.test.ts @@ -0,0 +1,223 @@ +import { vol } from 'memfs'; +import path from 'node:path'; +import type { PackageJson } from 'type-fest'; +import { MEMFS_VOLUME } from '@code-pushup/test-utils'; +import type { + MonorepoHandlerOptions, + MonorepoHandlerProjectsContext, + ProjectConfig, +} from '../tools.js'; +import { turboHandler } from './turbo.js'; + +describe('turboHandler', () => { + const options = { + cwd: MEMFS_VOLUME, + task: 'code-pushup', + parallel: false, + } as MonorepoHandlerOptions; + + const pkgJsonContent = (content: PackageJson): string => + JSON.stringify(content); + const turboJsonContent = (content: { tasks: Record }) => + JSON.stringify(content); + + describe('isConfigured', () => { + it('should detect Turborepo when turbo.json exists and has code-pushup task', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({}), + 'turbo.json': turboJsonContent({ + tasks: { + 'code-pushup': { + env: ['CP_API_KEY'], + outputs: ['.code-pushup'], + }, + }, + }), + }, + MEMFS_VOLUME, + ); + await expect(turboHandler.isConfigured(options)).resolves.toBe(true); + }); + + it("should NOT detect Turborepo when turbo.json doesn't exist", async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({}), + 'pnpm-lock.yaml': '', + }, + MEMFS_VOLUME, + ); + await expect(turboHandler.isConfigured(options)).resolves.toBe(false); + }); + + it("should NOT detect Turborepo when turbo.json doesn't include code-pushup task", async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({}), + 'turbo.json': turboJsonContent({ + tasks: { + build: { + dependsOn: ['^build'], + outputs: ['dist/**'], + }, + lint: {}, + test: {}, + dev: { + cache: false, + persistent: true, + }, + }, + }), + }, + MEMFS_VOLUME, + ); + await expect(turboHandler.isConfigured(options)).resolves.toBe(false); + }); + }); + + describe('listProjects', () => { + it.each([ + [ + 'PNPM workspace', + { + 'package.json': pkgJsonContent({}), + 'pnpm-lock.yaml': '', + 'pnpm-workspace.yaml': 'packages:\n- packages/*\n\n', + }, + ], + [ + 'Yarn workspaces', + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['packages/*'], + }), + 'yarn.lock': '', + }, + ], + [ + 'NPM workspaces', + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['packages/*'], + }), + 'package-lock.json': '', + }, + ], + ])( + 'should detect %s and list all packages with code-pushup script', + async (_, packageManagerFiles) => { + vol.fromJSON( + { + ...packageManagerFiles, + 'turbo.json': turboJsonContent({ tasks: { 'code-pushup': {} } }), + 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), // not in workspace patterns + 'packages/cli/package.json': pkgJsonContent({ + name: '@example/cli', + scripts: { 'code-pushup': 'code-pushup --no-progress' }, + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + 'packages/core/package.json': pkgJsonContent({ + name: '@example/core', + scripts: { 'code-pushup': 'code-pushup --no-progress' }, + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + 'packages/utils/package.json': pkgJsonContent({ + name: '@example/utils', + // missing script + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + }, + MEMFS_VOLUME, + ); + + await expect(turboHandler.listProjects(options)).resolves.toEqual([ + { + name: '@example/cli', + directory: path.join(MEMFS_VOLUME, 'packages', 'cli'), + bin: 'npx turbo run code-pushup --', + }, + { + name: '@example/core', + directory: path.join(MEMFS_VOLUME, 'packages', 'core'), + bin: 'npx turbo run code-pushup --', + }, + ] satisfies ProjectConfig[]); + }, + ); + + it('should throw if no supported package manager configured', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({}), + 'package-lock.json': '', + 'turbo.json': turboJsonContent({ tasks: { 'code-pushup': {} } }), + }, + MEMFS_VOLUME, + ); + + await expect(turboHandler.listProjects(options)).rejects.toThrow( + 'Package manager with workspace configuration not found in Turborepo, expected one of pnpm/yarn/npm', + ); + }); + }); + + describe('createRunManyCommand', () => { + const projects: MonorepoHandlerProjectsContext = { + all: [ + { + name: 'api', + directory: path.join(MEMFS_VOLUME, 'api'), + bin: 'npx turbo run code-pushup --', + }, + { + name: 'cms', + directory: path.join(MEMFS_VOLUME, 'cms'), + bin: 'npx turbo run code-pushup --', + }, + { + name: 'web', + directory: path.join(MEMFS_VOLUME, 'web'), + bin: 'npx turbo run code-pushup --', + }, + ], + }; + + it('should run script for all projects sequentially by default', () => { + expect(turboHandler.createRunManyCommand(options, projects)).toBe( + 'npx turbo run code-pushup --concurrency=1 --', + ); + }); + + it('should leave default concurrency if parallel flag is true', () => { + expect( + turboHandler.createRunManyCommand( + { ...options, parallel: true }, + projects, + ), + ).toBe('npx turbo run code-pushup --'); + }); + + it('should set parallel flag with custom number of jobs', () => { + expect( + turboHandler.createRunManyCommand( + { ...options, parallel: 5 }, + projects, + ), + ).toBe('npx turbo run code-pushup --concurrency=5 --'); + }); + + it('should filter projects by list of project names', () => { + expect( + turboHandler.createRunManyCommand(options, { + ...projects, + only: ['cms', 'web'], + }), + ).toBe( + 'npx turbo run code-pushup --filter=cms --filter=web --concurrency=1 --', + ); + }); + }); +}); diff --git a/packages/ci/src/lib/monorepo/handlers/yarn.ts b/packages/ci/src/lib/monorepo/handlers/yarn.ts index 99bb30163..8ba2dcf03 100644 --- a/packages/ci/src/lib/monorepo/handlers/yarn.ts +++ b/packages/ci/src/lib/monorepo/handlers/yarn.ts @@ -1,21 +1,23 @@ -import { join } from 'node:path'; -import { fileExists } from '@code-pushup/utils'; +import path from 'node:path'; +import { executeProcess, fileExists } from '@code-pushup/utils'; import { hasCodePushUpDependency, hasScript, hasWorkspacesEnabled, listWorkspaces, -} from '../packages'; -import type { MonorepoToolHandler } from '../tools'; +} from '../packages.js'; +import type { MonorepoToolHandler } from '../tools.js'; export const yarnHandler: MonorepoToolHandler = { tool: 'yarn', + async isConfigured(options) { return ( - (await fileExists(join(options.cwd, 'yarn.lock'))) && + (await fileExists(path.join(options.cwd, 'yarn.lock'))) && (await hasWorkspacesEnabled(options.cwd)) ); }, + async listProjects(options) { const { workspaces, rootPackageJson } = await listWorkspaces(options.cwd); return workspaces @@ -25,11 +27,34 @@ export const yarnHandler: MonorepoToolHandler = { hasCodePushUpDependency(packageJson) || hasCodePushUpDependency(rootPackageJson), ) - .map(({ name, packageJson }) => ({ + .map(({ name, directory, packageJson }) => ({ name, + directory, bin: hasScript(packageJson, options.task) - ? `yarn workspace ${name} run ${options.task}` - : `yarn workspace ${name} exec ${options.task}`, + ? `yarn run ${options.task}` + : `yarn exec ${options.task}`, })); }, + + async createRunManyCommand(options, projects) { + const { stdout } = await executeProcess({ command: 'yarn', args: ['-v'] }); + const isV1 = stdout.startsWith('1.'); + + if (isV1) { + // neither parallel execution nor projects filter are supported in Yarn v1 + return `yarn workspaces run ${options.task}`; + } + + return [ + 'yarn', + 'workspaces', + 'foreach', + ...(options.parallel ? ['--parallel'] : []), + ...(typeof options.parallel === 'number' + ? [`--jobs=${options.parallel}`] + : []), + ...(projects.only?.map(project => `--include=${project}`) ?? ['--all']), + options.task, + ].join(' '); + }, }; diff --git a/packages/ci/src/lib/monorepo/handlers/yarn.unit.test.ts b/packages/ci/src/lib/monorepo/handlers/yarn.unit.test.ts new file mode 100644 index 000000000..1963b7917 --- /dev/null +++ b/packages/ci/src/lib/monorepo/handlers/yarn.unit.test.ts @@ -0,0 +1,265 @@ +import { vol } from 'memfs'; +import path from 'node:path'; +import type { PackageJson } from 'type-fest'; +import { MEMFS_VOLUME } from '@code-pushup/test-utils'; +import * as utils from '@code-pushup/utils'; +import type { + MonorepoHandlerOptions, + MonorepoHandlerProjectsContext, + ProjectConfig, +} from '../tools.js'; +import { yarnHandler } from './yarn.js'; + +describe('yarnHandler', () => { + const options = { + cwd: MEMFS_VOLUME, + task: 'code-pushup', + parallel: false, + } as MonorepoHandlerOptions; + + const pkgJsonContent = (content: PackageJson): string => + JSON.stringify(content); + + describe('isConfigured', () => { + it('should detect Yarn workspaces when yarn.lock exists and "workspaces" set in package.json', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['packages/*'], + }), + 'yarn.lock': '', + }, + MEMFS_VOLUME, + ); + await expect(yarnHandler.isConfigured(options)).resolves.toBe(true); + }); + + it('should NOT detect Yarn workspaces when "workspaces" not set in package.json', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({}), + 'yarn.lock': '', + }, + MEMFS_VOLUME, + ); + await expect(yarnHandler.isConfigured(options)).resolves.toBe(false); + }); + + it("should NOT detect Yarn workspaces when yarn.lock doesn't exist", async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['packages/*'], + }), + 'package-lock.json': '', + }, + MEMFS_VOLUME, + ); + await expect(yarnHandler.isConfigured(options)).resolves.toBe(false); + }); + }); + + describe('listProjects', () => { + it('should list all Yarn workspaces with code-pushup script', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['apps/*', 'libs/*'], + }), + 'yarn.lock': '', + 'apps/backend/package.json': pkgJsonContent({ + name: 'backend', + scripts: { 'code-pushup': 'code-pushup --no-progress' }, + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + 'apps/frontend/package.json': pkgJsonContent({ + name: 'frontend', + // missing script + }), + 'libs/shared/package.json': pkgJsonContent({ + name: 'shared', + scripts: { 'code-pushup': 'code-pushup --no-progress' }, + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + }, + MEMFS_VOLUME, + ); + + await expect(yarnHandler.listProjects(options)).resolves.toEqual([ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'apps', 'backend'), + bin: 'yarn run code-pushup', + }, + { + name: 'shared', + directory: path.join(MEMFS_VOLUME, 'libs', 'shared'), + bin: 'yarn run code-pushup', + }, + ] satisfies ProjectConfig[]); + }); + + it('should list all Yarn workspaces with code-pushup dependency', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['apps/*', 'libs/*'], + }), + 'yarn.lock': '', + 'apps/backend/package.json': pkgJsonContent({ + name: 'backend', + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + 'apps/frontend/package.json': pkgJsonContent({ + name: 'frontend', + // missing dependency + }), + 'libs/shared/package.json': pkgJsonContent({ + name: 'shared', + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + }, + MEMFS_VOLUME, + ); + + await expect(yarnHandler.listProjects(options)).resolves.toEqual([ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'apps', 'backend'), + bin: 'yarn exec code-pushup', + }, + { + name: 'shared', + directory: path.join(MEMFS_VOLUME, 'libs', 'shared'), + bin: 'yarn exec code-pushup', + }, + ] satisfies ProjectConfig[]); + }); + + it('should list all Yarn workspaces when code-pushup installed at root level', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['apps/*', 'libs/*'], + devDependencies: { '@code-pushup/cli': 'latest' }, + }), + 'yarn.lock': '', + 'apps/backend/package.json': pkgJsonContent({ + name: 'backend', + }), + 'apps/frontend/package.json': pkgJsonContent({ + name: 'frontend', + }), + 'libs/shared/package.json': pkgJsonContent({ + name: 'shared', + }), + }, + MEMFS_VOLUME, + ); + + await expect(yarnHandler.listProjects(options)).resolves.toEqual([ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'apps', 'backend'), + bin: 'yarn exec code-pushup', + }, + { + name: 'frontend', + directory: path.join(MEMFS_VOLUME, 'apps', 'frontend'), + bin: 'yarn exec code-pushup', + }, + { + name: 'shared', + directory: path.join(MEMFS_VOLUME, 'libs', 'shared'), + bin: 'yarn exec code-pushup', + }, + ] satisfies ProjectConfig[]); + }); + }); + + describe('createRunManyCommand', () => { + const projects: MonorepoHandlerProjectsContext = { + all: [ + { + name: 'api', + directory: path.join(MEMFS_VOLUME, 'api'), + bin: 'yarn run code-pushup', + }, + { + name: 'cms', + directory: path.join(MEMFS_VOLUME, 'cms'), + bin: 'yarn run code-pushup', + }, + { + name: 'web', + directory: path.join(MEMFS_VOLUME, 'web'), + bin: 'yarn run code-pushup', + }, + ], + }; + + describe('classic Yarn (v1)', () => { + beforeEach(() => { + vi.spyOn(utils, 'executeProcess').mockResolvedValue({ + stdout: '1.22.19', + } as utils.ProcessResult); + }); + + it('should run script for all workspaces sequentially', async () => { + await expect( + yarnHandler.createRunManyCommand(options, projects), + ).resolves.toBe('yarn workspaces run code-pushup'); + }); + }); + + describe('modern Yarn (v2+)', () => { + beforeEach(() => { + vi.spyOn(utils, 'executeProcess').mockResolvedValue({ + stdout: '4.5.0', + } as utils.ProcessResult); + }); + + it('should run script for all workspaces sequentially by default', async () => { + await expect( + yarnHandler.createRunManyCommand(options, projects), + ).resolves.toBe('yarn workspaces foreach --all code-pushup'); + }); + + it('should set parallel flag with default number of jobs', async () => { + await expect( + yarnHandler.createRunManyCommand( + { ...options, parallel: true }, + projects, + ), + ).resolves.toBe('yarn workspaces foreach --parallel --all code-pushup'); + }); + + it('should set parallel flag with custom number of jobs', async () => { + await expect( + yarnHandler.createRunManyCommand( + { ...options, parallel: 5 }, + projects, + ), + ).resolves.toBe( + 'yarn workspaces foreach --parallel --jobs=5 --all code-pushup', + ); + }); + + it('should filter workspaces by list of project names', async () => { + await expect( + yarnHandler.createRunManyCommand(options, { + ...projects, + only: ['api', 'cms'], + }), + ).resolves.toBe( + 'yarn workspaces foreach --include=api --include=cms code-pushup', + ); + }); + }); + }); +}); diff --git a/packages/ci/src/lib/monorepo/index.ts b/packages/ci/src/lib/monorepo/index.ts index 0ea2d1dc1..2a36e8579 100644 --- a/packages/ci/src/lib/monorepo/index.ts +++ b/packages/ci/src/lib/monorepo/index.ts @@ -1,7 +1,7 @@ -export { listMonorepoProjects } from './list-projects'; +export { listMonorepoProjects, type RunManyCommand } from './list-projects.js'; export { - MONOREPO_TOOLS, isMonorepoTool, + MONOREPO_TOOLS, type MonorepoTool, type ProjectConfig, -} from './tools'; +} from './tools.js'; diff --git a/packages/ci/src/lib/monorepo/list-projects.ts b/packages/ci/src/lib/monorepo/list-projects.ts index 6b95a5500..1eec0c37c 100644 --- a/packages/ci/src/lib/monorepo/list-projects.ts +++ b/packages/ci/src/lib/monorepo/list-projects.ts @@ -1,58 +1,90 @@ import { glob } from 'glob'; -import { join } from 'node:path'; -import type { Logger, Settings } from '../models'; -import { detectMonorepoTool } from './detect-tool'; -import { getToolHandler } from './handlers'; -import { listPackages } from './packages'; -import type { MonorepoHandlerOptions, ProjectConfig } from './tools'; +import path from 'node:path'; +import type { Logger, Settings } from '../models.js'; +import { detectMonorepoTool } from './detect-tool.js'; +import { getToolHandler } from './handlers/index.js'; +import { listPackages } from './packages.js'; +import type { + MonorepoHandlerOptions, + MonorepoTool, + ProjectConfig, +} from './tools.js'; + +export type MonorepoProjects = { + tool: MonorepoTool | null; + projects: ProjectConfig[]; + runManyCommand?: RunManyCommand; +}; + +export type RunManyCommand = ( + onlyProjects?: string[], +) => string | Promise; export async function listMonorepoProjects( settings: Settings, -): Promise { - if (!settings.monorepo) { - throw new Error('Monorepo mode not enabled'); - } - +): Promise { const logger = settings.logger; - const options = createMonorepoHandlerOptions(settings); - const tool = - settings.monorepo === true - ? await detectMonorepoTool(options) - : settings.monorepo; - if (settings.monorepo === true) { - if (tool) { - logger.info(`Auto-detected monorepo tool ${tool}`); - } else { - logger.info("Couldn't auto-detect any supported monorepo tool"); - } - } else { - logger.info(`Using monorepo tool "${tool}" from inputs`); - } + const tool = await resolveMonorepoTool(settings, options); if (tool) { const handler = getToolHandler(tool); const projects = await handler.listProjects(options); logger.info(`Found ${projects.length} projects in ${tool} monorepo`); logger.debug(`Projects: ${projects.map(({ name }) => name).join(', ')}`); - return projects; + return { + tool, + projects, + runManyCommand: onlyProjects => + handler.createRunManyCommand(options, { + all: projects, + ...(onlyProjects?.length && { only: onlyProjects }), + }), + }; } if (settings.projects) { - return listProjectsByGlobs({ + const projects = await listProjectsByGlobs({ patterns: settings.projects, cwd: options.cwd, bin: settings.bin, logger, }); + return { tool, projects }; } - return listProjectsByNpmPackages({ + const projects = await listProjectsByNpmPackages({ cwd: options.cwd, bin: settings.bin, logger, }); + return { tool, projects }; +} + +async function resolveMonorepoTool( + settings: Settings, + options: MonorepoHandlerOptions, +): Promise { + if (!settings.monorepo) { + // shouldn't happen, handled by caller + throw new Error('Monorepo mode not enabled'); + } + const logger = settings.logger; + + if (typeof settings.monorepo === 'string') { + logger.info(`Using monorepo tool "${settings.monorepo}" from inputs`); + return settings.monorepo; + } + + const tool = await detectMonorepoTool(options); + if (tool) { + logger.info(`Auto-detected monorepo tool ${tool}`); + } else { + logger.info("Couldn't auto-detect any supported monorepo tool"); + } + + return tool; } function createMonorepoHandlerOptions( @@ -61,6 +93,8 @@ function createMonorepoHandlerOptions( return { task: settings.task, cwd: settings.directory, + parallel: settings.parallel, + nxProjectsFilter: settings.nxProjectsFilter, ...(!settings.silent && { observer: { onStdout: stdout => { @@ -83,7 +117,7 @@ async function listProjectsByGlobs(args: { const { patterns, cwd, bin, logger } = args; const directories = await glob( - patterns.map(path => path.replace(/\/$/, '/')), + patterns.map(pattern => pattern.replace(/\/$/, '/')), { cwd }, ); @@ -97,7 +131,7 @@ async function listProjectsByGlobs(args: { return directories.toSorted().map(directory => ({ name: directory, bin, - directory: join(cwd, directory), + directory: path.join(cwd, directory), })); } diff --git a/packages/ci/src/lib/monorepo/list-projects.unit.test.ts b/packages/ci/src/lib/monorepo/list-projects.unit.test.ts index 23b20b920..63f6a5b70 100644 --- a/packages/ci/src/lib/monorepo/list-projects.unit.test.ts +++ b/packages/ci/src/lib/monorepo/list-projects.unit.test.ts @@ -1,12 +1,14 @@ import { vol } from 'memfs'; -import { join } from 'node:path'; +import path from 'node:path'; import type { PackageJson } from 'type-fest'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; import * as utils from '@code-pushup/utils'; -import { DEFAULT_SETTINGS } from '../constants'; -import type { Settings } from '../models'; -import { listMonorepoProjects } from './list-projects'; -import type { ProjectConfig } from './tools'; +import { DEFAULT_SETTINGS } from '../constants.js'; +import type { Settings } from '../models.js'; +import { + type MonorepoProjects, + listMonorepoProjects, +} from './list-projects.js'; describe('listMonorepoProjects', () => { const MONOREPO_SETTINGS: Settings = { @@ -14,6 +16,7 @@ describe('listMonorepoProjects', () => { monorepo: true, projects: null, task: 'code-pushup', + nxProjectsFilter: '--with-target={task}', directory: MEMFS_VOLUME, bin: 'npx --no-install code-pushup', logger: { @@ -52,10 +55,23 @@ describe('listMonorepoProjects', () => { MEMFS_VOLUME, ); - await expect(listMonorepoProjects(MONOREPO_SETTINGS)).resolves.toEqual([ - { name: 'backend', bin: 'npx nx run backend:code-pushup --' }, - { name: 'frontend', bin: 'npx nx run frontend:code-pushup --' }, - ] satisfies ProjectConfig[]); + await expect(listMonorepoProjects(MONOREPO_SETTINGS)).resolves.toEqual({ + tool: 'nx', + projects: [ + { name: 'backend', bin: 'npx nx run backend:code-pushup --' }, + { name: 'frontend', bin: 'npx nx run frontend:code-pushup --' }, + ], + runManyCommand: expect.any(Function), + } satisfies MonorepoProjects); + + expect(utils.executeProcess).toHaveBeenCalledWith< + Parameters<(typeof utils)['executeProcess']> + >({ + command: 'npx', + args: ['nx', 'show', 'projects', '--with-target=code-pushup', '--json'], + cwd: process.cwd(), + observer: expect.any(Object), + }); }); it('should detect projects in Turborepo which have code-pushup command', async () => { @@ -86,24 +102,44 @@ describe('listMonorepoProjects', () => { 'e2e/package.json': pkgJsonContent({ name: 'e2e', }), - 'frontend/backoffice/package.json': pkgJsonContent({ - name: 'backoffice', + 'frontend/cms/package.json': pkgJsonContent({ + name: 'cms', scripts: { 'code-pushup': 'code-pushup --no-progress' }, }), - 'frontend/website/package.json': pkgJsonContent({ - name: 'website', + 'frontend/web/package.json': pkgJsonContent({ + name: 'web', scripts: { 'code-pushup': 'code-pushup --no-progress' }, }), }, MEMFS_VOLUME, ); - await expect(listMonorepoProjects(MONOREPO_SETTINGS)).resolves.toEqual([ - { name: 'api', bin: 'npx turbo run code-pushup -F api --' }, - { name: 'auth', bin: 'npx turbo run code-pushup -F auth --' }, - { name: 'backoffice', bin: 'npx turbo run code-pushup -F backoffice --' }, - { name: 'website', bin: 'npx turbo run code-pushup -F website --' }, - ] satisfies ProjectConfig[]); + await expect(listMonorepoProjects(MONOREPO_SETTINGS)).resolves.toEqual({ + tool: 'turbo', + projects: [ + { + name: 'api', + directory: path.join(MEMFS_VOLUME, 'backend', 'api'), + bin: 'npx turbo run code-pushup --', + }, + { + name: 'auth', + directory: path.join(MEMFS_VOLUME, 'backend', 'auth'), + bin: 'npx turbo run code-pushup --', + }, + { + name: 'cms', + directory: path.join(MEMFS_VOLUME, 'frontend', 'cms'), + bin: 'npx turbo run code-pushup --', + }, + { + name: 'web', + directory: path.join(MEMFS_VOLUME, 'frontend', 'web'), + bin: 'npx turbo run code-pushup --', + }, + ], + runManyCommand: expect.any(Function), + } satisfies MonorepoProjects); }); it('should detect packages in PNPM workspace with code-pushup script', async () => { @@ -130,11 +166,27 @@ describe('listMonorepoProjects', () => { MEMFS_VOLUME, ); - await expect(listMonorepoProjects(MONOREPO_SETTINGS)).resolves.toEqual([ - { name: 'backend', bin: 'pnpm -F backend run code-pushup' }, - { name: 'frontend', bin: 'pnpm -F frontend run code-pushup' }, - { name: '@repo/utils', bin: 'pnpm -F @repo/utils run code-pushup' }, - ] satisfies ProjectConfig[]); + await expect(listMonorepoProjects(MONOREPO_SETTINGS)).resolves.toEqual({ + tool: 'pnpm', + projects: [ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'apps', 'backend'), + bin: 'pnpm run code-pushup', + }, + { + name: 'frontend', + directory: path.join(MEMFS_VOLUME, 'apps', 'frontend'), + bin: 'pnpm run code-pushup', + }, + { + name: '@repo/utils', + directory: path.join(MEMFS_VOLUME, 'libs', 'utils'), + bin: 'pnpm run code-pushup', + }, + ], + runManyCommand: expect.any(Function), + } satisfies MonorepoProjects); }); it('should detect Yarn workspaces with code-pushup installed individually', async () => { @@ -160,10 +212,22 @@ describe('listMonorepoProjects', () => { MEMFS_VOLUME, ); - await expect(listMonorepoProjects(MONOREPO_SETTINGS)).resolves.toEqual([ - { name: 'cli', bin: 'yarn workspace cli exec code-pushup' }, - { name: 'core', bin: 'yarn workspace core exec code-pushup' }, - ] satisfies ProjectConfig[]); + await expect(listMonorepoProjects(MONOREPO_SETTINGS)).resolves.toEqual({ + tool: 'yarn', + projects: [ + { + name: 'cli', + directory: path.join(MEMFS_VOLUME, 'packages', 'cli'), + bin: 'yarn exec code-pushup', + }, + { + name: 'core', + directory: path.join(MEMFS_VOLUME, 'packages', 'core'), + bin: 'yarn exec code-pushup', + }, + ], + runManyCommand: expect.any(Function), + } satisfies MonorepoProjects); }); it('should detect NPM workspaces when code-pushup installed at root level', async () => { @@ -185,10 +249,22 @@ describe('listMonorepoProjects', () => { MEMFS_VOLUME, ); - await expect(listMonorepoProjects(MONOREPO_SETTINGS)).resolves.toEqual([ - { name: 'backend', bin: 'npm -w backend exec code-pushup --' }, - { name: 'frontend', bin: 'npm -w frontend exec code-pushup --' }, - ] satisfies ProjectConfig[]); + await expect(listMonorepoProjects(MONOREPO_SETTINGS)).resolves.toEqual({ + tool: 'npm', + projects: [ + { + name: 'backend', + directory: path.join(MEMFS_VOLUME, 'packages', 'backend'), + bin: 'npm exec code-pushup --', + }, + { + name: 'frontend', + directory: path.join(MEMFS_VOLUME, 'packages', 'frontend'), + bin: 'npm exec code-pushup --', + }, + ], + runManyCommand: expect.any(Function), + } satisfies MonorepoProjects); }); it('should list folders matching globs passed as input when no tool detected', async () => { @@ -216,23 +292,26 @@ describe('listMonorepoProjects', () => { monorepo: true, projects: ['backend/*', 'frontend'], }), - ).resolves.toEqual([ - { - name: join('backend', 'api'), - bin: 'npx --no-install code-pushup', - directory: join(MEMFS_VOLUME, 'backend', 'api'), - }, - { - name: join('backend', 'auth'), - bin: 'npx --no-install code-pushup', - directory: join(MEMFS_VOLUME, 'backend', 'auth'), - }, - { - name: 'frontend', - bin: 'npx --no-install code-pushup', - directory: join(MEMFS_VOLUME, 'frontend'), - }, - ] satisfies ProjectConfig[]); + ).resolves.toEqual({ + tool: null, + projects: [ + { + name: path.join('backend', 'api'), + bin: 'npx --no-install code-pushup', + directory: path.join(MEMFS_VOLUME, 'backend', 'api'), + }, + { + name: path.join('backend', 'auth'), + bin: 'npx --no-install code-pushup', + directory: path.join(MEMFS_VOLUME, 'backend', 'auth'), + }, + { + name: 'frontend', + bin: 'npx --no-install code-pushup', + directory: path.join(MEMFS_VOLUME, 'frontend'), + }, + ], + } satisfies MonorepoProjects); }); it('should list all folders with a package.json when no tool detected and no patterns provided', async () => { @@ -255,28 +334,31 @@ describe('listMonorepoProjects', () => { monorepo: true, projects: null, }), - ).resolves.toEqual([ - { - name: 'my-app', - bin: 'npx --no-install code-pushup', - directory: join(MEMFS_VOLUME), - }, - { - name: 'migrate', - bin: 'npx --no-install code-pushup', - directory: join(MEMFS_VOLUME, 'scripts', 'db', 'migrate'), - }, - { - name: 'seed', - bin: 'npx --no-install code-pushup', - directory: join(MEMFS_VOLUME, 'scripts', 'db', 'seed'), - }, - { - name: 'generate-token', - bin: 'npx --no-install code-pushup', - directory: join(MEMFS_VOLUME, 'scripts', 'generate-token'), - }, - ] satisfies ProjectConfig[]); + ).resolves.toEqual({ + tool: null, + projects: [ + { + name: 'my-app', + bin: 'npx --no-install code-pushup', + directory: path.join(MEMFS_VOLUME), + }, + { + name: 'migrate', + bin: 'npx --no-install code-pushup', + directory: path.join(MEMFS_VOLUME, 'scripts', 'db', 'migrate'), + }, + { + name: 'seed', + bin: 'npx --no-install code-pushup', + directory: path.join(MEMFS_VOLUME, 'scripts', 'db', 'seed'), + }, + { + name: 'generate-token', + bin: 'npx --no-install code-pushup', + directory: path.join(MEMFS_VOLUME, 'scripts', 'generate-token'), + }, + ], + } satisfies MonorepoProjects); }); it('should prefer tool provided as input (PNPM) over tool which would be auto-detected otherwise (Turborepo)', async () => { @@ -309,11 +391,31 @@ describe('listMonorepoProjects', () => { await expect( listMonorepoProjects({ ...MONOREPO_SETTINGS, monorepo: 'pnpm' }), - ).resolves.toEqual([ - { name: 'backoffice', bin: 'pnpm -F backoffice exec code-pushup' }, - { name: 'frontoffice', bin: 'pnpm -F frontoffice exec code-pushup' }, - { name: '@repo/models', bin: 'pnpm -F @repo/models exec code-pushup' }, - { name: '@repo/ui', bin: 'pnpm -F @repo/ui exec code-pushup' }, - ] satisfies ProjectConfig[]); + ).resolves.toEqual({ + tool: 'pnpm', + projects: [ + { + name: 'backoffice', + directory: path.join(MEMFS_VOLUME, 'apps', 'backoffice'), + bin: 'pnpm exec code-pushup', + }, + { + name: 'frontoffice', + directory: path.join(MEMFS_VOLUME, 'apps', 'frontoffice'), + bin: 'pnpm exec code-pushup', + }, + { + name: '@repo/models', + directory: path.join(MEMFS_VOLUME, 'packages', 'models'), + bin: 'pnpm exec code-pushup', + }, + { + name: '@repo/ui', + directory: path.join(MEMFS_VOLUME, 'packages', 'ui'), + bin: 'pnpm exec code-pushup', + }, + ], + runManyCommand: expect.any(Function), + } satisfies MonorepoProjects); }); }); diff --git a/packages/ci/src/lib/monorepo/packages.ts b/packages/ci/src/lib/monorepo/packages.ts index 514c53e93..43b43a778 100644 --- a/packages/ci/src/lib/monorepo/packages.ts +++ b/packages/ci/src/lib/monorepo/packages.ts @@ -1,5 +1,5 @@ import { glob } from 'glob'; -import { basename, dirname, join } from 'node:path'; +import path from 'node:path'; import type { PackageJson } from 'type-fest'; import { readJsonFile } from '@code-pushup/utils'; @@ -20,9 +20,9 @@ export async function listPackages( return Promise.all( files.toSorted().map(async (file): Promise => { - const packageJson = await readJsonFile(join(cwd, file)); - const directory = join(cwd, dirname(file)); - const name = packageJson.name || basename(directory); + const packageJson = await readJsonFile(path.join(cwd, file)); + const directory = path.join(cwd, path.dirname(file)); + const name = packageJson.name || path.basename(directory); return { name, directory, packageJson }; }), ); @@ -56,7 +56,7 @@ export async function hasWorkspacesEnabled(cwd: string): Promise { } export async function readRootPackageJson(cwd: string): Promise { - return await readJsonFile(join(cwd, 'package.json')); + return await readJsonFile(path.join(cwd, 'package.json')); } export function hasDependency(packageJson: PackageJson, name: string): boolean { diff --git a/packages/ci/src/lib/monorepo/packages.unit.test.ts b/packages/ci/src/lib/monorepo/packages.unit.test.ts new file mode 100644 index 000000000..2677c6b0d --- /dev/null +++ b/packages/ci/src/lib/monorepo/packages.unit.test.ts @@ -0,0 +1,377 @@ +import { vol } from 'memfs'; +import path from 'node:path'; +import type { PackageJson } from 'type-fest'; +import { MEMFS_VOLUME } from '@code-pushup/test-utils'; +import { + hasCodePushUpDependency, + hasDependency, + hasScript, + hasWorkspacesEnabled, + listPackages, + listWorkspaces, + readRootPackageJson, +} from './packages.js'; + +const pkgJsonContent = (content: PackageJson) => + JSON.stringify(content, null, 2); + +describe('listPackages', () => { + it('should search for all npm packages recursively by default', async () => { + vol.fromJSON( + { + 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), + 'package.json': pkgJsonContent({ name: 'example-monorepo' }), + 'packages/cli/package.json': pkgJsonContent({ name: '@example/cli' }), + 'packages/core/package.json': pkgJsonContent({ name: '@example/core' }), + }, + MEMFS_VOLUME, + ); + + await expect(listPackages(MEMFS_VOLUME)).resolves.toEqual([ + { + name: 'e2e', + directory: path.join(MEMFS_VOLUME, 'e2e'), + packageJson: { name: 'e2e' }, + }, + { + name: 'example-monorepo', + directory: path.join(MEMFS_VOLUME), + packageJson: { name: 'example-monorepo' }, + }, + { + name: '@example/cli', + directory: path.join(MEMFS_VOLUME, 'packages', 'cli'), + packageJson: { name: '@example/cli' }, + }, + { + name: '@example/core', + directory: path.join(MEMFS_VOLUME, 'packages', 'core'), + packageJson: { name: '@example/core' }, + }, + ]); + }); + + it('should search for package.json files with custom glob patterns', async () => { + vol.fromJSON( + { + 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), + 'package.json': pkgJsonContent({ name: 'example-monorepo' }), // not in patterns + 'packages/cli/package.json': pkgJsonContent({ name: '@example/cli' }), + 'packages/core/package.json': pkgJsonContent({ name: '@example/core' }), + 'scripts/docs/index.js': 'console.log("not yet implemented")', // no package.json + }, + MEMFS_VOLUME, + ); + + await expect( + listPackages(MEMFS_VOLUME, ['packages/*', 'e2e', 'scripts/*']), + ).resolves.toEqual([ + expect.objectContaining({ name: 'e2e' }), + expect.objectContaining({ name: '@example/cli' }), + expect.objectContaining({ name: '@example/core' }), + ]); + }); + + it('should sort packages by package.json path', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ name: 'example-monorepo' }), + 'packages/core/package.json': pkgJsonContent({ name: '@example/core' }), + 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), + 'packages/cli/package.json': pkgJsonContent({ name: '@example/cli' }), + }, + MEMFS_VOLUME, + ); + + await expect(listPackages(MEMFS_VOLUME)).resolves.toEqual([ + expect.objectContaining({ name: 'e2e' }), + expect.objectContaining({ name: 'example-monorepo' }), + expect.objectContaining({ name: '@example/cli' }), + expect.objectContaining({ name: '@example/core' }), + ]); + }); + + it('should use parent folder name if "name" missing in package.json', async () => { + vol.fromJSON( + { + 'e2e/package.json': pkgJsonContent({}), + 'package.json': pkgJsonContent({}), + 'packages/cli/package.json': pkgJsonContent({ name: '@example/cli' }), + 'packages/core/package.json': pkgJsonContent({ name: '@example/core' }), + 'packages/utils/package.json': pkgJsonContent({}), + }, + MEMFS_VOLUME, + ); + + await expect(listPackages(MEMFS_VOLUME)).resolves.toEqual([ + expect.objectContaining({ name: 'e2e' }), + expect.objectContaining({ name: path.basename(MEMFS_VOLUME) }), + expect.objectContaining({ name: '@example/cli' }), + expect.objectContaining({ name: '@example/core' }), + expect.objectContaining({ name: 'utils' }), + ]); + }); +}); + +describe('listWorkspaces', () => { + it('should list workspaces named in root package.json', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['ui', 'api'], + }), + 'api/package.json': pkgJsonContent({ name: 'api' }), + 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), // not in workspaces + 'ui/package.json': pkgJsonContent({ name: 'ui' }), + }, + MEMFS_VOLUME, + ); + + await expect(listWorkspaces(MEMFS_VOLUME)).resolves.toEqual({ + workspaces: [ + { + name: 'api', + directory: path.join(MEMFS_VOLUME, 'api'), + packageJson: { name: 'api' }, + }, + { + name: 'ui', + directory: path.join(MEMFS_VOLUME, 'ui'), + packageJson: { name: 'ui' }, + }, + ], + rootPackageJson: { + private: true, + workspaces: ['ui', 'api'], + }, + }); + }); + + it('should list workspaces matched by glob in root package.json', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['packages/*'], + }), + 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), // not in workspaces + 'packages/cli/package.json': pkgJsonContent({ name: 'cli' }), + 'packages/core/package.json': pkgJsonContent({ name: 'core' }), + }, + MEMFS_VOLUME, + ); + + await expect(listWorkspaces(MEMFS_VOLUME)).resolves.toEqual({ + workspaces: [ + { + name: 'cli', + directory: path.join(MEMFS_VOLUME, 'packages', 'cli'), + packageJson: { name: 'cli' }, + }, + { + name: 'core', + directory: path.join(MEMFS_VOLUME, 'packages', 'core'), + packageJson: { name: 'core' }, + }, + ], + rootPackageJson: { + private: true, + workspaces: ['packages/*'], + }, + }); + }); + + it('should parse patterns from workspaces object config in root package.json', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: { + packages: ['apps/*'], + nohoist: ['**/mobile'], + }, + }), + 'apps/desktop/package.json': pkgJsonContent({ name: 'desktop' }), + 'apps/mobile/package.json': pkgJsonContent({ name: 'mobile' }), + }, + MEMFS_VOLUME, + ); + + await expect(listWorkspaces(MEMFS_VOLUME)).resolves.toEqual({ + workspaces: [ + { + name: 'desktop', + directory: path.join(MEMFS_VOLUME, 'apps', 'desktop'), + packageJson: { name: 'desktop' }, + }, + { + name: 'mobile', + directory: path.join(MEMFS_VOLUME, 'apps', 'mobile'), + packageJson: { name: 'mobile' }, + }, + ], + rootPackageJson: { + private: true, + workspaces: { + packages: ['apps/*'], + nohoist: ['**/mobile'], + }, + }, + }); + }); +}); + +describe('hasWorkspacesEnabled', () => { + it('should identify as NOT enabled if "workspaces" missing in root package.json', async () => { + vol.fromJSON( + { 'package.json': pkgJsonContent({ name: 'example', private: true }) }, + MEMFS_VOLUME, + ); + await expect(hasWorkspacesEnabled(MEMFS_VOLUME)).resolves.toBe(false); + }); + + it('should identify as NOT enabled if `"private": true` missing in root package.json', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + name: 'example', + workspaces: ['packages/*'], + }), + }, + MEMFS_VOLUME, + ); + await expect(hasWorkspacesEnabled(MEMFS_VOLUME)).resolves.toBe(false); + }); + + it('should identify as enabled if private and workspaces array set in root package.json', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: ['packages/*'], + }), + }, + MEMFS_VOLUME, + ); + await expect(hasWorkspacesEnabled(MEMFS_VOLUME)).resolves.toBe(true); + }); + + it('should identify as enabled if private and workspaces object set in root package.json', async () => { + vol.fromJSON( + { + 'package.json': pkgJsonContent({ + private: true, + workspaces: { + packages: ['packages/*'], + nohoist: ['**/react-native'], + }, + }), + }, + MEMFS_VOLUME, + ); + await expect(hasWorkspacesEnabled(MEMFS_VOLUME)).resolves.toBe(true); + }); +}); + +describe('readRootPackageJson', () => { + it('should read and parse package.json from current working directory', async () => { + vol.fromJSON( + { 'package.json': pkgJsonContent({ name: 'example' }) }, + MEMFS_VOLUME, + ); + await expect(readRootPackageJson(MEMFS_VOLUME)).resolves.toEqual({ + name: 'example', + }); + }); + + it("should throw if root package.json doesn't exist", async () => { + vol.fromJSON( + { + 'api/package.json': pkgJsonContent({ name: 'api' }), + 'ui/package.json': pkgJsonContent({ name: 'ui' }), + }, + MEMFS_VOLUME, + ); + await expect(readRootPackageJson(MEMFS_VOLUME)).rejects.toThrow( + 'no such file or directory', + ); + }); + + it("should throw if package.json exists but isn't valid JSON", async () => { + vol.fromJSON({ 'package.json': '' }, MEMFS_VOLUME); + await expect(readRootPackageJson(MEMFS_VOLUME)).rejects.toThrow( + 'Unexpected end of JSON input', + ); + }); +}); + +describe('hasScript', () => { + it('should return true if script in package.json "scripts"', () => { + expect( + hasScript( + { scripts: { 'code-pushup': 'code-pushup --no-progress' } }, + 'code-pushup', + ), + ).toBe(true); + }); + + it('should return false if script not in package.json "scripts"', () => { + expect(hasScript({}, 'code-pushup')).toBe(false); + }); +}); + +describe('hasDependency', () => { + it('should return true if package name in "dependencies"', () => { + expect(hasDependency({ dependencies: { react: '^19.0.0' } }, 'react')).toBe( + true, + ); + }); + + it('should return true if package name in "devDependencies"', () => { + expect(hasDependency({ devDependencies: { nx: '20.1.3' } }, 'nx')).toBe( + true, + ); + }); + + it('should return false if package name is neither in "dependencies" nor "devDependencies"', () => { + expect( + hasDependency( + { + dependencies: { react: '^19.0.0' }, + devDependencies: { typescript: '5.5.4' }, + }, + 'svelte', + ), + ).toBe(false); + }); +}); + +describe('hasCodePushUpDependency', () => { + it('should return true if @code-pushup/cli in "devDependencies"', () => { + expect( + hasCodePushUpDependency({ + devDependencies: { '@code-pushup/cli': '^0.55.0' }, + }), + ).toBe(true); + }); + + it('should return true if @code-pushup/cli in "dependencies"', () => { + expect( + hasCodePushUpDependency({ + dependencies: { '@code-pushup/cli': 'latest' }, + }), + ).toBe(true); + }); + + it('should return false if @code-pushup/cli is neither in "dependencies" nor "devDependencies"', () => { + expect( + hasCodePushUpDependency({ + dependencies: { + '@code-pushup/models': 'latest', + '@code-pushup/utils': 'latest', + }, + }), + ).toBe(false); + }); +}); diff --git a/packages/ci/src/lib/monorepo/tools.ts b/packages/ci/src/lib/monorepo/tools.ts index 6dd307c60..ef5554bbc 100644 --- a/packages/ci/src/lib/monorepo/tools.ts +++ b/packages/ci/src/lib/monorepo/tools.ts @@ -7,12 +7,23 @@ export type MonorepoToolHandler = { tool: MonorepoTool; isConfigured: (options: MonorepoHandlerOptions) => Promise; listProjects: (options: MonorepoHandlerOptions) => Promise; + createRunManyCommand: ( + options: MonorepoHandlerOptions, + projects: MonorepoHandlerProjectsContext, + ) => string | Promise; }; export type MonorepoHandlerOptions = { task: string; cwd: string; + parallel: boolean | number; observer?: ProcessObserver; + nxProjectsFilter: string | string[]; +}; + +export type MonorepoHandlerProjectsContext = { + only?: string[]; + all: ProjectConfig[]; }; export type ProjectConfig = { diff --git a/packages/ci/src/lib/run-monorepo.ts b/packages/ci/src/lib/run-monorepo.ts new file mode 100644 index 000000000..6b339dc75 --- /dev/null +++ b/packages/ci/src/lib/run-monorepo.ts @@ -0,0 +1,286 @@ +import { copyFile, readFile } from 'node:fs/promises'; +import path from 'node:path'; +import { + type CoreConfig, + DEFAULT_PERSIST_OUTPUT_DIR, +} from '@code-pushup/models'; +import { + type ExcludeNullableProps, + hasNoNullableProps, +} from '@code-pushup/utils'; +import { + type CommandContext, + createCommandContext, + persistedFilesFromConfig, + runCollect, + runMergeDiffs, +} from './cli/index.js'; +import { commentOnPR } from './comment.js'; +import type { + GitBranch, + MonorepoRunResult, + OutputFiles, + ProjectRunResult, +} from './models.js'; +import { + type ProjectConfig, + type RunManyCommand, + listMonorepoProjects, +} from './monorepo/index.js'; +import { + type BaseReportArgs, + type CompareReportsResult, + type RunEnv, + checkPrintConfig, + compareReports, + loadCachedBaseReport, + printPersistConfig, + runInBaseBranch, + runOnProject, +} from './run-utils.js'; + +export async function runInMonorepoMode( + env: RunEnv, +): Promise { + const { api, settings } = env; + const { logger, directory } = settings; + + logger.info('Running Code PushUp in monorepo mode'); + + const { projects, runManyCommand } = await listMonorepoProjects(settings); + const projectResults = runManyCommand + ? await runProjectsInBulk(projects, runManyCommand, env) + : await runProjectsIndividually(projects, env); + + const diffJsonPaths = projectResults + .map(({ files }) => files.diff?.json) + .filter((file): file is string => file != null); + if (diffJsonPaths.length > 0) { + const tmpDiffPath = await runMergeDiffs( + diffJsonPaths, + createCommandContext(settings, projects[0]), + ); + logger.debug(`Merged ${diffJsonPaths.length} diffs into ${tmpDiffPath}`); + const diffPath = path.join( + directory, + DEFAULT_PERSIST_OUTPUT_DIR, + path.basename(tmpDiffPath), + ); + if (tmpDiffPath !== diffPath) { + await copyFile(tmpDiffPath, diffPath); + logger.debug(`Copied ${tmpDiffPath} to ${diffPath}`); + } + const commentId = await commentOnPR(tmpDiffPath, api, logger); + return { + mode: 'monorepo', + projects: projectResults, + commentId, + diffPath, + }; + } + + return { mode: 'monorepo', projects: projectResults }; +} + +type ProjectReport = { + project: ProjectConfig; + reports: OutputFiles; + config: Pick; + ctx: CommandContext; +}; + +function runProjectsIndividually( + projects: ProjectConfig[], + env: RunEnv, +): Promise { + env.settings.logger.info( + `Running on ${projects.length} projects individually`, + ); + return projects.reduce>( + async (acc, project) => [...(await acc), await runOnProject(project, env)], + Promise.resolve([]), + ); +} + +async function runProjectsInBulk( + projects: ProjectConfig[], + runManyCommand: RunManyCommand, + env: RunEnv, +): Promise { + const { + refs: { base }, + settings, + } = env; + const logger = settings.logger; + + logger.info( + `Running on ${projects.length} projects in bulk (parallel: ${settings.parallel})`, + ); + + await collectMany(runManyCommand, env); + + const currProjectReports = await Promise.all( + projects.map(async (project): Promise => { + const ctx = createCommandContext(settings, project); + const config = await printPersistConfig(ctx, settings); + const reports = persistedFilesFromConfig(config, ctx); + return { project, reports, config, ctx }; + }), + ); + logger.debug( + `Loaded ${currProjectReports.length} persist configs by running print-config command for each project`, + ); + + if (base == null) { + return finalizeProjectReports(currProjectReports); + } + + return compareProjectsInBulk(currProjectReports, base, runManyCommand, env); +} + +async function compareProjectsInBulk( + currProjectReports: ProjectReport[], + base: GitBranch, + runManyCommand: RunManyCommand, + env: RunEnv, +): Promise { + const projectReportsWithCache = await Promise.all( + currProjectReports.map(async ({ project, ctx, reports, config }) => { + const args = { project, base, ctx, env }; + return { + ...args, + config, + currReport: await readFile(reports.json, 'utf8'), + prevReport: await loadCachedBaseReport(args), + }; + }), + ); + const uncachedProjectReports = projectReportsWithCache.filter( + ({ prevReport }) => !prevReport, + ); + env.settings.logger.info( + `${currProjectReports.length - uncachedProjectReports.length} out of ${currProjectReports.length} projects loaded previous report from artifact cache`, + ); + + const collectedPrevReports = await collectPreviousReports( + base, + uncachedProjectReports, + runManyCommand, + env, + ); + + const projectsToCompare = projectReportsWithCache + .map(args => ({ + ...args, + prevReport: args.prevReport || collectedPrevReports[args.project.name], + })) + .filter(hasNoNullableProps); + + const projectComparisons = await projectsToCompare.reduce< + Promise> + >( + async (acc, args) => ({ + ...(await acc), + [args.project.name]: await compareReports(args), + }), + Promise.resolve({}), + ); + + return finalizeProjectReports(currProjectReports, projectComparisons); +} + +function finalizeProjectReports( + projectReports: ProjectReport[], + projectComparisons?: Record, +): ProjectRunResult[] { + return projectReports.map(({ project, reports }): ProjectRunResult => { + const comparison = projectComparisons?.[project.name]; + return { + name: project.name, + files: { + report: reports, + ...(comparison && { diff: comparison.files }), + }, + ...(comparison?.newIssues && { newIssues: comparison.newIssues }), + }; + }); +} + +async function collectPreviousReports( + base: GitBranch, + uncachedProjectReports: ExcludeNullableProps[], + runManyCommand: RunManyCommand, + env: RunEnv, +): Promise> { + const { + settings: { logger }, + } = env; + + if (uncachedProjectReports.length === 0) { + return {}; + } + + return runInBaseBranch(base, env, async () => { + const uncachedProjectConfigs = await Promise.all( + uncachedProjectReports.map(async args => ({ + name: args.project.name, + ctx: args.ctx, + config: await checkPrintConfig(args), + })), + ); + + const validProjectConfigs = + uncachedProjectConfigs.filter(hasNoNullableProps); + const onlyProjects = validProjectConfigs.map(({ name }) => name); + const invalidProjects = uncachedProjectConfigs + .map(({ name }) => name) + .filter(name => !onlyProjects.includes(name)); + if (invalidProjects.length > 0) { + logger.debug( + `Printing config failed for ${invalidProjects.length} projects - ${invalidProjects.join(', ')}`, + ); + logger.info( + `Skipping ${invalidProjects.length} projects which aren't configured in base branch ${base.ref}`, + ); + } + + if (onlyProjects.length > 0) { + logger.info( + `Collecting previous reports for ${onlyProjects.length} projects`, + ); + await collectMany(runManyCommand, env, onlyProjects); + } + + const projectFiles = validProjectConfigs.map( + async ({ name, ctx, config }) => + [ + name, + await readFile(persistedFilesFromConfig(config, ctx).json, 'utf8'), + ] as const, + ); + + return Object.fromEntries(await Promise.all(projectFiles)); + }); +} + +async function collectMany( + runManyCommand: RunManyCommand, + env: RunEnv, + onlyProjects?: string[], +): Promise { + const { settings } = env; + const command = await runManyCommand(onlyProjects); + const ctx: CommandContext = { + ...createCommandContext(settings, null), + bin: command, + }; + + await runCollect(ctx); + + const countText = onlyProjects + ? `${onlyProjects.length} previous` + : 'all current'; + settings.logger.debug( + `Collected ${countText} reports using command \`${command}\``, + ); +} diff --git a/packages/ci/src/lib/run-standalone.ts b/packages/ci/src/lib/run-standalone.ts new file mode 100644 index 000000000..7d6a96a99 --- /dev/null +++ b/packages/ci/src/lib/run-standalone.ts @@ -0,0 +1,28 @@ +import { commentOnPR } from './comment.js'; +import type { StandaloneRunResult } from './models.js'; +import { type RunEnv, runOnProject } from './run-utils.js'; + +export async function runInStandaloneMode( + env: RunEnv, +): Promise { + const { + api, + settings: { logger }, + } = env; + + logger.info('Running Code PushUp in standalone project mode'); + + const { files, newIssues } = await runOnProject(null, env); + + const commentMdPath = files.diff?.md; + if (commentMdPath) { + const commentId = await commentOnPR(commentMdPath, api, logger); + return { + mode: 'standalone', + files, + commentId, + newIssues, + }; + } + return { mode: 'standalone', files, newIssues }; +} diff --git a/packages/ci/src/lib/run-utils.ts b/packages/ci/src/lib/run-utils.ts new file mode 100644 index 000000000..c7f65f4dd --- /dev/null +++ b/packages/ci/src/lib/run-utils.ts @@ -0,0 +1,314 @@ +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import path from 'node:path'; +import type { SimpleGit } from 'simple-git'; +import type { CoreConfig, Report, ReportsDiff } from '@code-pushup/models'; +import { stringifyError } from '@code-pushup/utils'; +import { + type CommandContext, + createCommandContext, + persistedFilesFromConfig, + runCollect, + runCompare, + runPrintConfig, +} from './cli/index.js'; +import { parsePersistConfig } from './cli/persist.js'; +import { listChangedFiles } from './git.js'; +import { type SourceFileIssue, filterRelevantIssues } from './issues.js'; +import type { + GitBranch, + GitRefs, + Logger, + OutputFiles, + ProjectRunResult, + ProviderAPIClient, + Settings, +} from './models.js'; +import type { ProjectConfig } from './monorepo/index.js'; + +export type RunEnv = { + refs: GitRefs; + api: ProviderAPIClient; + settings: Settings; + git: SimpleGit; +}; + +export type CompareReportsArgs = { + project: ProjectConfig | null; + env: RunEnv; + base: GitBranch; + currReport: string; + prevReport: string; + config: Pick; +}; + +export type CompareReportsResult = { + files: OutputFiles; + newIssues?: SourceFileIssue[]; +}; + +export type BaseReportArgs = { + project: ProjectConfig | null; + env: RunEnv; + base: GitBranch; + ctx: CommandContext; +}; + +export async function runOnProject( + project: ProjectConfig | null, + env: RunEnv, +): Promise { + const { + refs: { head, base }, + settings, + } = env; + const logger = settings.logger; + + const ctx = createCommandContext(settings, project); + + if (project) { + logger.info(`Running Code PushUp on monorepo project ${project.name}`); + } + + const config = await printPersistConfig(ctx, settings); + logger.debug( + `Loaded persist config from print-config command - ${JSON.stringify(config.persist)}`, + ); + + await runCollect(ctx); + const reportFiles = persistedFilesFromConfig(config, ctx); + const currReport = await readFile(reportFiles.json, 'utf8'); + logger.debug(`Collected current report at ${reportFiles.json}`); + + const noDiffOutput = { + name: project?.name ?? '-', + files: { + report: reportFiles, + }, + } satisfies ProjectRunResult; + + if (base == null) { + return noDiffOutput; + } + + logger.info( + `PR/MR detected, preparing to compare base branch ${base.ref} to head ${head.ref}`, + ); + + const prevReport = await collectPreviousReport({ project, env, base, ctx }); + if (!prevReport) { + return noDiffOutput; + } + + const compareArgs = { project, env, base, config, currReport, prevReport }; + const { files: diffFiles, newIssues } = await compareReports(compareArgs); + + return { + ...noDiffOutput, + files: { + ...noDiffOutput.files, + diff: diffFiles, + }, + ...(newIssues && { newIssues }), + }; +} + +export async function compareReports( + args: CompareReportsArgs, +): Promise { + const { + project, + env: { settings, git }, + base, + currReport, + prevReport, + config, + } = args; + const logger = settings.logger; + + const ctx = createCommandContext(settings, project); + + const reportsDir = path.join(settings.directory, '.code-pushup'); + const currPath = path.join(reportsDir, 'curr-report.json'); + const prevPath = path.join(reportsDir, 'prev-report.json'); + await mkdir(reportsDir, { recursive: true }); + await writeFile(currPath, currReport); + await writeFile(prevPath, prevReport); + logger.debug(`Saved reports to ${currPath} and ${prevPath}`); + + await runCompare( + { before: prevPath, after: currPath, label: project?.name }, + ctx, + ); + const comparisonFiles = persistedFilesFromConfig(config, { + directory: ctx.directory, + isDiff: true, + }); + logger.info('Compared reports and generated diff files'); + logger.debug( + `Generated diff files at ${comparisonFiles.json} and ${comparisonFiles.md}`, + ); + + if (!settings.detectNewIssues) { + return { files: comparisonFiles }; + } + + const newIssues = await findNewIssues({ + base, + currReport, + prevReport, + comparisonFiles, + logger, + git, + }); + + return { files: comparisonFiles, newIssues }; +} + +export async function collectPreviousReport( + args: BaseReportArgs, +): Promise { + const { ctx, env, base } = args; + + const cachedBaseReport = await loadCachedBaseReport(args); + if (cachedBaseReport) { + return cachedBaseReport; + } + + return runInBaseBranch(base, env, async () => { + const config = await checkPrintConfig(args); + if (!config) { + return null; + } + + await runCollect(ctx); + const { json: prevReportPath } = persistedFilesFromConfig(config, ctx); + const prevReport = await readFile(prevReportPath, 'utf8'); + env.settings.logger.debug(`Collected previous report at ${prevReportPath}`); + return prevReport; + }); +} + +export async function loadCachedBaseReport( + args: BaseReportArgs, +): Promise { + const { + project, + env: { + api, + settings: { logger }, + }, + } = args; + + const cachedBaseReport = await api + .downloadReportArtifact?.(project?.name) + .catch((error: unknown) => { + logger.warn( + `Error when downloading previous report artifact, skipping - ${stringifyError(error)}`, + ); + }); + if (api.downloadReportArtifact != null) { + logger.info( + `Previous report artifact ${cachedBaseReport ? 'found' : 'not found'}`, + ); + if (cachedBaseReport) { + logger.debug( + `Previous report artifact downloaded to ${cachedBaseReport}`, + ); + } + } + + if (cachedBaseReport) { + return readFile(cachedBaseReport, 'utf8'); + } + return null; +} + +export async function runInBaseBranch( + base: GitBranch, + env: RunEnv, + fn: () => Promise, +): Promise { + const { + git, + settings: { logger }, + } = env; + + await git.fetch('origin', base.ref, ['--depth=1']); + await git.checkout(['-f', base.ref]); + logger.info(`Switched to base branch ${base.ref}`); + + const result = await fn(); + + await git.checkout(['-f', '-']); + logger.info('Switched back to PR/MR branch'); + + return result; +} + +export async function checkPrintConfig( + args: BaseReportArgs, +): Promise | null> { + const { + project, + ctx, + base, + env: { settings }, + } = args; + const { logger } = settings; + + const operation = project + ? `Executing print-config for project ${project.name}` + : 'Executing print-config'; + try { + const config = await printPersistConfig(ctx, settings); + logger.debug( + `${operation} verified code-pushup installed in base branch ${base.ref}`, + ); + return config; + } catch (error) { + logger.debug(`Error from print-config - ${stringifyError(error)}`); + logger.info( + `${operation} failed, assuming code-pushup not installed in base branch ${base.ref} and skipping comparison`, + ); + return null; + } +} + +export async function printPersistConfig( + ctx: CommandContext, + settings: Settings, +): Promise> { + const json = await runPrintConfig({ ...ctx, silent: !settings.debug }); + return parsePersistConfig(json); +} + +export async function findNewIssues(args: { + base: GitBranch; + currReport: string; + prevReport: string; + comparisonFiles: OutputFiles; + logger: Logger; + git: SimpleGit; +}): Promise { + const { base, currReport, prevReport, comparisonFiles, logger, git } = args; + + await git.fetch('origin', base.ref, ['--depth=1']); + const reportsDiff = await readFile(comparisonFiles.json, 'utf8'); + const changedFiles = await listChangedFiles( + { base: 'FETCH_HEAD', head: 'HEAD' }, + git, + ); + const issues = filterRelevantIssues({ + currReport: JSON.parse(currReport) as Report, + prevReport: JSON.parse(prevReport) as Report, + reportsDiff: JSON.parse(reportsDiff) as ReportsDiff, + changedFiles, + }); + logger.debug( + `Found ${issues.length} relevant issues for ${ + Object.keys(changedFiles).length + } changed files`, + ); + + return issues; +} diff --git a/packages/ci/src/lib/run.integration.test.ts b/packages/ci/src/lib/run.integration.test.ts index dc3371c59..bd362834d 100644 --- a/packages/ci/src/lib/run.integration.test.ts +++ b/packages/ci/src/lib/run.integration.test.ts @@ -1,21 +1,18 @@ import { copyFile, + cp, mkdir, readFile, rename, - rm, writeFile, } from 'node:fs/promises'; -import { dirname, join } from 'node:path'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; -import { - type DiffResult, - type FetchResult, - type SimpleGit, - simpleGit, -} from 'simple-git'; +import { type SimpleGit, simpleGit } from 'simple-git'; import type { MockInstance } from 'vitest'; -import { initGitRepo } from '@code-pushup/test-utils'; +import type { CoreConfig } from '@code-pushup/models'; +import { cleanTestFolder, teardownTestFolder } from '@code-pushup/test-setup'; +import { initGitRepo, simulateGitFetch } from '@code-pushup/test-utils'; import * as utils from '@code-pushup/utils'; import type { Comment, @@ -24,19 +21,43 @@ import type { Options, ProviderAPIClient, RunResult, -} from './models'; -import { runInCI } from './run'; +} from './models.js'; +import type { MonorepoTool } from './monorepo/index.js'; +import { runInCI } from './run.js'; describe('runInCI', () => { - const fixturesDir = join( - fileURLToPath(dirname(import.meta.url)), + const fixturesDir = path.join( + fileURLToPath(path.dirname(import.meta.url)), '..', '..', 'mocks', 'fixtures', ); - const workDir = join('tmp', 'ci', 'run-test'); - const outputDir = join(workDir, '.code-pushup'); + const reportsDir = path.join(fixturesDir, 'outputs'); + const workDir = path.join(process.cwd(), 'tmp', 'ci', 'run-test'); + + const fixturePaths = { + reports: { + before: { + json: path.join(reportsDir, 'report-before.json'), + md: path.join(reportsDir, 'report-before.md'), + }, + after: { + json: path.join(reportsDir, 'report-after.json'), + md: path.join(reportsDir, 'report-after.md'), + }, + }, + diffs: { + project: { + json: path.join(reportsDir, 'diff-project.json'), + md: path.join(reportsDir, 'diff-project.md'), + }, + merged: { + md: path.join(reportsDir, 'diff-merged.md'), + }, + }, + config: path.join(reportsDir, 'config.json'), + }; const logger: Logger = { error: vi.fn(), @@ -46,11 +67,17 @@ describe('runInCI', () => { }; const options = { - bin: 'code-pushup', + bin: 'npx code-pushup', directory: workDir, logger, } satisfies Options; + const mockComment: Comment = { + id: 42, + body: '... ', + url: 'https://fake.hosted.git/comments/42', + }; + let git: SimpleGit; let cwdSpy: MockInstance< @@ -62,62 +89,109 @@ describe('runInCI', () => { Promise >; + let yarnVersion: string; + + async function simulateCodePushUpExecution({ + command, + args, + cwd, + }: utils.ProcessConfig): Promise { + const nxMatch = command.match(/nx run (\w+):code-pushup/); + const outputDir = nxMatch + ? path.join(workDir, `packages/${nxMatch[1]}/.code-pushup`) + : path.join(cwd as string, '.code-pushup'); + await mkdir(outputDir, { recursive: true }); + let stdout = ''; + + switch (args![0]) { + case 'compare': + const diffs = fixturePaths.diffs.project; + await copyFile(diffs.json, path.join(outputDir, 'report-diff.json')); + await copyFile(diffs.md, path.join(outputDir, 'report-diff.md')); + break; + + case 'print-config': + stdout = await readFile(fixturePaths.config, 'utf8'); + if (nxMatch) { + // simulate effect of custom persist.outputDir per Nx project + const config = JSON.parse(stdout) as CoreConfig; + // eslint-disable-next-line functional/immutable-data + config.persist!.outputDir = outputDir; + stdout = JSON.stringify(config, null, 2); + } + break; + + case 'merge-diffs': + await copyFile( + fixturePaths.diffs.merged.md, + path.join( + nxMatch ? workDir : (cwd as string), + '.code-pushup/merged-report-diff.md', + ), + ); + break; + + default: + const kind = + (await git.branch()).current === 'main' ? 'before' : 'after'; + const reports = fixturePaths.reports[kind]; + if (/workspaces|concurrency|parallel/.test(command)) { + // eslint-disable-next-line functional/no-loop-statements + for (const project of ['cli', 'core', 'utils']) { + const projectOutputDir = path.join( + workDir, + `packages/${project}/.code-pushup`, + ); + await mkdir(projectOutputDir, { recursive: true }); + await copyFile( + reports.json, + path.join(projectOutputDir, 'report.json'), + ); + await copyFile( + reports.json, + path.join(projectOutputDir, 'report.md'), + ); + } + } else { + await copyFile(reports.json, path.join(outputDir, 'report.json')); + await copyFile(reports.md, path.join(outputDir, 'report.md')); + } + break; + } + + return { code: 0, stdout, stderr: '' } as utils.ProcessResult; + } + beforeEach(async () => { + const originalExecuteProcess = utils.executeProcess; executeProcessSpy = vi .spyOn(utils, 'executeProcess') - .mockImplementation(async ({ command, args }) => { - if (command === options.bin) { - await mkdir(outputDir, { recursive: true }); - let stdout = ''; - switch (args![0]) { - case 'compare': - await Promise.all( - ['report-diff.json', 'report-diff.md'].map(file => - copyFile(join(fixturesDir, file), join(outputDir, file)), - ), - ); - break; - case 'print-config': - stdout = await readFile(join(fixturesDir, 'config.json'), 'utf8'); - break; - case 'merge-diffs': // not tested here - break; - default: - const reportDir = join(fixturesDir, (await git.branch()).current); - await Promise.all( - ['report.json', 'report.md'].map(file => - copyFile(join(reportDir, file), join(outputDir, file)), - ), - ); - break; - } - return { code: 0, stdout, stderr: '' } as utils.ProcessResult; + .mockImplementation(cfg => { + if (cfg.command.includes('code-pushup')) { + return simulateCodePushUpExecution(cfg); } - throw new Error( - `Unexpected executeProcess call: ${command} ${args?.join(' ') ?? ''}`, - ); + if (cfg.command === 'yarn' && cfg.args![0] === '-v') { + return Promise.resolve({ + code: 0, + stdout: yarnVersion, + stderr: '', + } as utils.ProcessResult); + } + return originalExecuteProcess(cfg); }); cwdSpy = vi.spyOn(process, 'cwd').mockReturnValue(workDir); - await rm(workDir, { recursive: true, force: true }); - await mkdir(workDir, { recursive: true }); - await copyFile( - join(fixturesDir, 'code-pushup.config.ts'), - join(workDir, 'code-pushup.config.ts'), - ); - await writeFile(join(workDir, 'index.js'), 'console.log("Hello, world!")'); + await cleanTestFolder(workDir); git = await initGitRepo(simpleGit, { baseDir: workDir }); + await simulateGitFetch(git); - vi.spyOn(git, 'fetch').mockResolvedValue({} as FetchResult); - vi.spyOn(git, 'diffSummary').mockResolvedValue({ - files: [{ file: 'index.ts', binary: false }], - } as DiffResult); - vi.spyOn(git, 'diff').mockResolvedValue(''); - + await writeFile( + path.join(workDir, 'index.js'), + 'console.log("Hello, world!")', + ); await git.add('index.js'); - await git.add('code-pushup.config.ts'); await git.commit('Initial commit'); }); @@ -125,240 +199,827 @@ describe('runInCI', () => { cwdSpy.mockRestore(); executeProcessSpy.mockRestore(); - await rm(workDir, { recursive: true, force: true }); + await teardownTestFolder(workDir); }); - describe('push event', () => { - beforeEach(async () => { - await git.checkout('main'); + describe('standalone mode', () => { + const outputDir = path.join(workDir, '.code-pushup'); + + describe('push event', () => { + beforeEach(async () => { + await git.checkout('main'); + }); + + it('should collect report', async () => { + await expect( + runInCI( + { head: { ref: 'main', sha: await git.revparse('main') } }, + {} as ProviderAPIClient, + options, + git, + ), + ).resolves.toEqual({ + mode: 'standalone', + files: { + report: { + json: path.join(outputDir, 'report.json'), + md: path.join(outputDir, 'report.md'), + }, + }, + } satisfies RunResult); + + expect(utils.executeProcess).toHaveBeenCalledTimes(2); + expect(utils.executeProcess).toHaveBeenNthCalledWith(1, { + command: options.bin, + args: ['print-config'], + cwd: workDir, + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenNthCalledWith(2, { + command: options.bin, + args: ['--persist.format=json', '--persist.format=md'], + cwd: workDir, + } satisfies utils.ProcessConfig); + + expect(logger.error).not.toHaveBeenCalled(); + expect(logger.warn).not.toHaveBeenCalled(); + expect(logger.info).toHaveBeenCalled(); + expect(logger.debug).toHaveBeenCalled(); + }); }); - it('should collect report', async () => { - await expect( - runInCI( - { head: { ref: 'main', sha: await git.revparse('main') } }, - {} as ProviderAPIClient, - options, - git, - ), - ).resolves.toEqual({ - mode: 'standalone', - artifacts: { - report: { - rootDir: outputDir, - files: [ - join(outputDir, 'report.json'), - join(outputDir, 'report.md'), - ], + describe('pull request event', () => { + let refs: GitRefs; + let diffMdString: string; + + beforeEach(async () => { + await git.checkoutLocalBranch('feature-1'); + + await rename( + path.join(workDir, 'index.js'), + path.join(workDir, 'index.ts'), + ); + + await git.add('index.ts'); + await git.commit('Convert JS file to TS'); + + refs = { + head: { ref: 'feature-1', sha: await git.revparse('feature-1') }, + base: { ref: 'main', sha: await git.revparse('main') }, + }; + + diffMdString = await readFile(fixturePaths.diffs.project.md, 'utf8'); + }); + + it('should collect both reports when uncached, compare and create new comment', async () => { + const api: ProviderAPIClient = { + maxCommentChars: 1_000_000, + createComment: vi.fn().mockResolvedValue(mockComment), + updateComment: vi.fn(), + listComments: vi.fn().mockResolvedValue([]), + }; + + await expect(runInCI(refs, api, options, git)).resolves.toEqual({ + mode: 'standalone', + commentId: mockComment.id, + newIssues: [], + files: { + report: { + json: path.join(outputDir, 'report.json'), + md: path.join(outputDir, 'report.md'), + }, + diff: { + json: path.join(outputDir, 'report-diff.json'), + md: path.join(outputDir, 'report-diff.md'), + }, + }, + } satisfies RunResult); + + expect(api.listComments).toHaveBeenCalledWith(); + expect(api.createComment).toHaveBeenCalledWith( + expect.stringContaining(diffMdString), + ); + expect(api.updateComment).not.toHaveBeenCalled(); + + expect(utils.executeProcess).toHaveBeenCalledTimes(5); + expect(utils.executeProcess).toHaveBeenNthCalledWith(1, { + command: options.bin, + args: ['print-config'], + cwd: workDir, + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenNthCalledWith(2, { + command: options.bin, + args: ['--persist.format=json', '--persist.format=md'], + cwd: workDir, + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenNthCalledWith(3, { + command: options.bin, + args: ['print-config'], + cwd: workDir, + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenNthCalledWith(4, { + command: options.bin, + args: ['--persist.format=json', '--persist.format=md'], + cwd: workDir, + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenNthCalledWith(5, { + command: options.bin, + args: [ + 'compare', + `--before=${path.join(outputDir, 'prev-report.json')}`, + `--after=${path.join(outputDir, 'curr-report.json')}`, + '--persist.format=json', + '--persist.format=md', + ], + cwd: workDir, + } satisfies utils.ProcessConfig); + + expect(logger.error).not.toHaveBeenCalled(); + expect(logger.warn).not.toHaveBeenCalled(); + expect(logger.info).toHaveBeenCalled(); + expect(logger.debug).toHaveBeenCalled(); + }); + + it('should collect new report and use cached old report, compare and update existing comment', async () => { + const api: ProviderAPIClient = { + maxCommentChars: 1_000_000, + createComment: vi.fn(), + updateComment: vi.fn().mockResolvedValue(mockComment), + listComments: vi.fn().mockResolvedValue([mockComment]), + downloadReportArtifact: vi.fn().mockImplementation(async () => { + const downloadPath = path.join(workDir, 'downloaded-report.json'); + await copyFile(fixturePaths.reports.before.json, downloadPath); + return downloadPath; + }), + }; + + await expect(runInCI(refs, api, options, git)).resolves.toEqual({ + mode: 'standalone', + commentId: mockComment.id, + newIssues: [], + files: { + report: { + json: path.join(outputDir, 'report.json'), + md: path.join(outputDir, 'report.md'), + }, + diff: { + json: path.join(outputDir, 'report-diff.json'), + md: path.join(outputDir, 'report-diff.md'), + }, }, - }, - } satisfies RunResult); - - expect(utils.executeProcess).toHaveBeenCalledTimes(1); - expect(utils.executeProcess).toHaveBeenCalledWith({ - command: options.bin, - args: [ - `--persist.outputDir=${outputDir}`, - '--persist.filename=report', - '--persist.format=json', - '--persist.format=md', - ], - cwd: workDir, - } satisfies utils.ProcessConfig); - - expect(logger.error).not.toHaveBeenCalled(); - expect(logger.warn).not.toHaveBeenCalled(); - expect(logger.info).toHaveBeenCalled(); - expect(logger.debug).toHaveBeenCalled(); + } satisfies RunResult); + + expect(api.listComments).toHaveBeenCalledWith(); + expect(api.updateComment).toHaveBeenCalledWith( + mockComment.id, + expect.stringContaining(diffMdString), + ); + expect(api.createComment).not.toHaveBeenCalled(); + expect(api.downloadReportArtifact).toHaveBeenCalledWith(undefined); + + expect(utils.executeProcess).toHaveBeenCalledTimes(3); + expect(utils.executeProcess).toHaveBeenNthCalledWith(1, { + command: options.bin, + args: ['print-config'], + cwd: workDir, + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenNthCalledWith(2, { + command: options.bin, + args: ['--persist.format=json', '--persist.format=md'], + cwd: workDir, + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenNthCalledWith(3, { + command: options.bin, + args: [ + 'compare', + `--before=${path.join(outputDir, 'prev-report.json')}`, + `--after=${path.join(outputDir, 'curr-report.json')}`, + '--persist.format=json', + '--persist.format=md', + ], + cwd: workDir, + } satisfies utils.ProcessConfig); + + expect(logger.error).not.toHaveBeenCalled(); + expect(logger.warn).not.toHaveBeenCalled(); + expect(logger.info).toHaveBeenCalled(); + expect(logger.debug).toHaveBeenCalled(); + }); }); }); - describe('pull request event', () => { - let refs: GitRefs; - let diffMdString: string; + describe.each<{ + name: string; + tool: MonorepoTool; + run: string; + runMany: string; + setup?: () => void; + }>([ + { + name: 'Nx', + tool: 'nx', + run: expect.stringMatching( + /^npx nx run (cli|core|utils):code-pushup --$/, + ), + runMany: + 'npx nx run-many --targets=code-pushup --parallel=false --projects=cli,core,utils --', + }, + { + name: 'Turborepo', + tool: 'turbo', + run: 'npx turbo run code-pushup --', + runMany: 'npx turbo run code-pushup --concurrency=1 --', + }, + { + name: 'pnpm workspace', + tool: 'pnpm', + run: 'pnpm run code-pushup', + runMany: 'pnpm --recursive --workspace-concurrency=1 code-pushup', + }, + { + name: 'Yarn workspaces (modern)', + tool: 'yarn', + run: 'yarn run code-pushup', + runMany: 'yarn workspaces foreach --all code-pushup', + setup: () => { + yarnVersion = '2.0.0'; + }, + }, + { + name: 'Yarn workspaces (classic)', + tool: 'yarn', + run: 'yarn run code-pushup', + runMany: 'yarn workspaces run code-pushup', + setup: () => { + yarnVersion = '1.0.0'; + }, + }, + { + name: 'npm workspaces', + tool: 'npm', + run: 'npm run code-pushup --', + runMany: 'npm run code-pushup --workspaces --if-present --', + }, + ])('monorepo mode - $name', ({ tool, run, runMany, setup }) => { + beforeEach(async () => { + const monorepoDir = path.join(fixturesDir, 'monorepos', tool); + await cp(monorepoDir, workDir, { recursive: true }); + await git.add('.'); + await git.commit(`Create packages in ${tool} monorepo`); + setup?.(); + }); + + describe('push event', () => { + beforeEach(async () => { + await git.checkout('main'); + }); - const mockComment: Comment = { - id: 42, - body: '... ', - url: 'https://fake.hosted.git/comments/42', - }; + it('should collect reports for all projects', async () => { + await expect( + runInCI( + { head: { ref: 'main', sha: await git.revparse('main') } }, + {} as ProviderAPIClient, + { ...options, monorepo: tool }, + git, + ), + ).resolves.toEqual({ + mode: 'monorepo', + projects: [ + { + name: 'cli', + files: { + report: { + json: path.join( + workDir, + 'packages/cli/.code-pushup/report.json', + ), + md: path.join(workDir, 'packages/cli/.code-pushup/report.md'), + }, + }, + }, + { + name: 'core', + files: { + report: { + json: path.join( + workDir, + 'packages/core/.code-pushup/report.json', + ), + md: path.join( + workDir, + 'packages/core/.code-pushup/report.md', + ), + }, + }, + }, + { + name: 'utils', + files: { + report: { + json: path.join( + workDir, + 'packages/utils/.code-pushup/report.json', + ), + md: path.join( + workDir, + 'packages/utils/.code-pushup/report.md', + ), + }, + }, + }, + ], + } satisfies RunResult); - beforeEach(async () => { - await git.checkoutLocalBranch('feature-1'); + expect( + executeProcessSpy.mock.calls.filter(([cfg]) => + cfg.command.includes('code-pushup'), + ), + ).toHaveLength(4); // 1 autorun for all projects, 3 print-configs for each project + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: run, + args: ['print-config'], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: runMany, + args: ['--persist.format=json', '--persist.format=md'], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + + expect(logger.error).not.toHaveBeenCalled(); + expect(logger.warn).not.toHaveBeenCalled(); + expect(logger.info).toHaveBeenCalled(); + expect(logger.debug).toHaveBeenCalled(); + }); + }); - await rename(join(workDir, 'index.js'), join(workDir, 'index.ts')); + describe('pull request event', () => { + let refs: GitRefs; + let diffMdString: string; - await git.add('index.ts'); - await git.commit('Convert JS file to TS'); + beforeEach(async () => { + await git.checkoutLocalBranch('feature-1'); - refs = { - head: { ref: 'feature-1', sha: await git.revparse('feature-1') }, - base: { ref: 'main', sha: await git.revparse('main') }, - }; + await writeFile(path.join(workDir, 'README.md'), '# Hello, world\n'); + await git.add('README.md'); + await git.commit('Create README'); - diffMdString = await readFile( - join(fixturesDir, 'report-diff.md'), - 'utf8', - ); + refs = { + head: { ref: 'feature-1', sha: await git.revparse('feature-1') }, + base: { ref: 'main', sha: await git.revparse('main') }, + }; + + diffMdString = await readFile(fixturePaths.diffs.merged.md, 'utf8'); + }); + + it('should collect and compare reports for all projects and comment merged diff', async () => { + const api: ProviderAPIClient = { + maxCommentChars: 1_000_000, + createComment: vi.fn().mockResolvedValue(mockComment), + updateComment: vi.fn(), + listComments: vi.fn().mockResolvedValue([]), + downloadReportArtifact: vi.fn().mockImplementation(async project => { + if (project === 'utils') { + // simulates a project which has no cached report + return null; + } + const downloadPath = path.join( + workDir, + 'tmp', + project, + 'report.json', + ); + await mkdir(path.dirname(downloadPath), { recursive: true }); + await copyFile(fixturePaths.reports.before.json, downloadPath); + return downloadPath; + }), + }; + + await expect( + runInCI(refs, api, { ...options, monorepo: tool }, git), + ).resolves.toEqual({ + mode: 'monorepo', + commentId: mockComment.id, + diffPath: path.join(workDir, '.code-pushup/merged-report-diff.md'), + projects: [ + { + name: 'cli', + files: { + report: { + json: path.join( + workDir, + 'packages/cli/.code-pushup/report.json', + ), + md: path.join(workDir, 'packages/cli/.code-pushup/report.md'), + }, + diff: { + json: path.join( + workDir, + 'packages/cli/.code-pushup/report-diff.json', + ), + md: path.join( + workDir, + 'packages/cli/.code-pushup/report-diff.md', + ), + }, + }, + newIssues: [], + }, + { + name: 'core', + files: { + report: { + json: path.join( + workDir, + 'packages/core/.code-pushup/report.json', + ), + md: path.join( + workDir, + 'packages/core/.code-pushup/report.md', + ), + }, + diff: { + json: path.join( + workDir, + 'packages/core/.code-pushup/report-diff.json', + ), + md: path.join( + workDir, + 'packages/core/.code-pushup/report-diff.md', + ), + }, + }, + newIssues: [], + }, + { + name: 'utils', + files: { + report: { + json: path.join( + workDir, + 'packages/utils/.code-pushup/report.json', + ), + md: path.join( + workDir, + 'packages/utils/.code-pushup/report.md', + ), + }, + diff: { + json: path.join( + workDir, + 'packages/utils/.code-pushup/report-diff.json', + ), + md: path.join( + workDir, + 'packages/utils/.code-pushup/report-diff.md', + ), + }, + }, + newIssues: [], + }, + ], + } satisfies RunResult); + + await expect( + readFile( + path.join(workDir, '.code-pushup/merged-report-diff.md'), + 'utf8', + ), + ).resolves.toBe(diffMdString); + + expect(api.listComments).toHaveBeenCalledWith(); + expect(api.createComment).toHaveBeenCalledWith( + expect.stringContaining(diffMdString), + ); + expect(api.updateComment).not.toHaveBeenCalled(); + + // 1 autorun for all projects + // 3 print-configs for each project + // 1 print-config for uncached project + // 1 autorun for uncached projects + // 3 compares for each project + // 1 merge-diffs for all projects + expect( + executeProcessSpy.mock.calls.filter(([cfg]) => + cfg.command.includes('code-pushup'), + ), + ).toHaveLength(10); + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: run, + args: ['print-config'], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: runMany, + args: ['--persist.format=json', '--persist.format=md'], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: run, + args: [ + 'compare', + expect.stringMatching(/^--before=.*prev-report.json$/), + expect.stringMatching(/^--after=.*curr-report.json$/), + expect.stringMatching(/^--label=\w+$/), + '--persist.format=json', + '--persist.format=md', + ], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: run, + args: [ + 'merge-diffs', + `--files=${path.join(workDir, 'packages/cli/.code-pushup/report-diff.json')}`, + `--files=${path.join(workDir, 'packages/core/.code-pushup/report-diff.json')}`, + `--files=${path.join(workDir, 'packages/utils/.code-pushup/report-diff.json')}`, + expect.stringMatching(/^--persist.outputDir=.*\.code-pushup$/), + '--persist.filename=merged-report', + ], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + + expect(logger.error).not.toHaveBeenCalled(); + expect(logger.warn).not.toHaveBeenCalled(); + expect(logger.info).toHaveBeenCalled(); + expect(logger.debug).toHaveBeenCalled(); + }); }); + }); - it('should collect both reports when uncached, compare and create new comment', async () => { - const api: ProviderAPIClient = { - maxCommentChars: 1_000_000, - createComment: vi.fn().mockResolvedValue(mockComment), - updateComment: vi.fn(), - listComments: vi.fn().mockResolvedValue([]), - }; - - await expect(runInCI(refs, api, options, git)).resolves.toEqual({ - mode: 'standalone', - commentId: mockComment.id, - newIssues: [], - artifacts: { - report: { - rootDir: outputDir, - files: [ - join(outputDir, 'report.json'), - join(outputDir, 'report.md'), - ], - }, - diff: { - rootDir: outputDir, - files: [ - join(outputDir, 'report-diff.json'), - join(outputDir, 'report-diff.md'), - ], - }, - }, - } satisfies RunResult); - - expect(api.listComments).toHaveBeenCalledWith(); - expect(api.createComment).toHaveBeenCalledWith( - expect.stringContaining(diffMdString), - ); - expect(api.updateComment).not.toHaveBeenCalled(); - - expect(utils.executeProcess).toHaveBeenCalledTimes(4); - expect(utils.executeProcess).toHaveBeenNthCalledWith(1, { - command: options.bin, - args: [ - `--persist.outputDir=${outputDir}`, - '--persist.filename=report', - '--persist.format=json', - '--persist.format=md', - ], - cwd: workDir, - } satisfies utils.ProcessConfig); - expect(utils.executeProcess).toHaveBeenNthCalledWith(2, { - command: options.bin, - args: ['print-config'], - cwd: workDir, - } satisfies utils.ProcessConfig); - expect(utils.executeProcess).toHaveBeenNthCalledWith(3, { - command: options.bin, - args: [ - `--persist.outputDir=${outputDir}`, - '--persist.filename=report', - '--persist.format=json', - '--persist.format=md', - ], - cwd: workDir, - } satisfies utils.ProcessConfig); - expect(utils.executeProcess).toHaveBeenNthCalledWith(4, { - command: options.bin, - args: [ - 'compare', - `--before=${join(outputDir, 'prev-report.json')}`, - `--after=${join(outputDir, 'curr-report.json')}`, - `--persist.outputDir=${outputDir}`, - '--persist.filename=report', - '--persist.format=json', - '--persist.format=md', - ], - cwd: workDir, - } satisfies utils.ProcessConfig); - - expect(logger.error).not.toHaveBeenCalled(); - expect(logger.warn).not.toHaveBeenCalled(); - expect(logger.info).toHaveBeenCalled(); - expect(logger.debug).toHaveBeenCalled(); + describe.each<[string, Options]>([ + [ + 'projects explicitly configured using folder patterns', + { + monorepo: true, + projects: ['frontend', 'backend/*'], + }, + ], + [ + 'projects implicitly determined by package.json files', + { + monorepo: true, + }, + ], + ])('monorepo mode - custom: %s', (_, monorepoOptions) => { + beforeEach(async () => { + const monorepoDir = path.join(fixturesDir, 'monorepos', 'custom'); + await cp(monorepoDir, workDir, { recursive: true }); + await git.add('.'); + await git.commit('Create projects in monorepo'); }); - it('should collect new report and use cached old report, compare and update existing comment', async () => { - const api: ProviderAPIClient = { - maxCommentChars: 1_000_000, - createComment: vi.fn(), - updateComment: vi.fn().mockResolvedValue(mockComment), - listComments: vi.fn().mockResolvedValue([mockComment]), - downloadReportArtifact: vi.fn().mockImplementation(async () => { - const downloadPath = join(workDir, 'downloaded-report.json'); - await copyFile( - join(fixturesDir, 'main', 'report.json'), - downloadPath, - ); - return downloadPath; - }), - }; - - await expect(runInCI(refs, api, options, git)).resolves.toEqual({ - mode: 'standalone', - commentId: mockComment.id, - newIssues: [], - artifacts: { - report: { - rootDir: outputDir, - files: [ - join(outputDir, 'report.json'), - join(outputDir, 'report.md'), - ], - }, - diff: { - rootDir: outputDir, - files: [ - join(outputDir, 'report-diff.json'), - join(outputDir, 'report-diff.md'), - ], - }, - }, - } satisfies RunResult); - - expect(api.listComments).toHaveBeenCalledWith(); - expect(api.updateComment).toHaveBeenCalledWith( - mockComment.id, - expect.stringContaining(diffMdString), - ); - expect(api.createComment).not.toHaveBeenCalled(); - expect(api.downloadReportArtifact).toHaveBeenCalledWith(undefined); - - expect(utils.executeProcess).toHaveBeenCalledTimes(2); - expect(utils.executeProcess).toHaveBeenNthCalledWith(1, { - command: options.bin, - args: [ - `--persist.outputDir=${outputDir}`, - '--persist.filename=report', - '--persist.format=json', - '--persist.format=md', - ], - cwd: workDir, - } satisfies utils.ProcessConfig); - expect(utils.executeProcess).toHaveBeenNthCalledWith(2, { - command: options.bin, - args: [ - 'compare', - `--before=${join(outputDir, 'prev-report.json')}`, - `--after=${join(outputDir, 'curr-report.json')}`, - `--persist.outputDir=${outputDir}`, - '--persist.filename=report', - '--persist.format=json', - '--persist.format=md', - ], - cwd: workDir, - } satisfies utils.ProcessConfig); - - expect(logger.error).not.toHaveBeenCalled(); - expect(logger.warn).not.toHaveBeenCalled(); - expect(logger.info).toHaveBeenCalled(); - expect(logger.debug).toHaveBeenCalled(); + describe('push event', () => { + beforeEach(async () => { + await git.checkout('main'); + }); + + it('should collect reports for all projects', async () => { + await expect( + runInCI( + { head: { ref: 'main', sha: await git.revparse('main') } }, + {} as ProviderAPIClient, + { ...options, ...monorepoOptions }, + git, + ), + ).resolves.toEqual({ + mode: 'monorepo', + projects: [ + { + name: expect.stringContaining('api'), + files: { + report: { + json: path.join( + workDir, + 'backend/api/.code-pushup/report.json', + ), + md: path.join(workDir, 'backend/api/.code-pushup/report.md'), + }, + }, + }, + { + name: expect.stringContaining('auth'), + files: { + report: { + json: path.join( + workDir, + 'backend/auth/.code-pushup/report.json', + ), + md: path.join(workDir, 'backend/auth/.code-pushup/report.md'), + }, + }, + }, + { + name: 'frontend', + files: { + report: { + json: path.join(workDir, 'frontend/.code-pushup/report.json'), + md: path.join(workDir, 'frontend/.code-pushup/report.md'), + }, + }, + }, + ], + } satisfies RunResult); + + expect( + executeProcessSpy.mock.calls.filter(([cfg]) => + cfg.command.includes('code-pushup'), + ), + ).toHaveLength(6); // 3 autoruns and 3 print-configs for each project + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: options.bin, + args: ['print-config'], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: options.bin, + args: ['--persist.format=json', '--persist.format=md'], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + + expect(logger.error).not.toHaveBeenCalled(); + expect(logger.warn).not.toHaveBeenCalled(); + expect(logger.info).toHaveBeenCalled(); + expect(logger.debug).toHaveBeenCalled(); + }); + }); + + describe('pull request event', () => { + let refs: GitRefs; + let diffMdString: string; + + beforeEach(async () => { + await git.checkoutLocalBranch('feature-1'); + + await writeFile(path.join(workDir, 'README.md'), '# Hello, world\n'); + await git.add('README.md'); + await git.commit('Create README'); + + refs = { + head: { ref: 'feature-1', sha: await git.revparse('feature-1') }, + base: { ref: 'main', sha: await git.revparse('main') }, + }; + + diffMdString = await readFile(fixturePaths.diffs.merged.md, 'utf8'); + }); + + it('should collect and compare reports for all projects and comment merged diff', async () => { + const api: ProviderAPIClient = { + maxCommentChars: 1_000_000, + createComment: vi.fn().mockResolvedValue(mockComment), + updateComment: vi.fn(), + listComments: vi.fn().mockResolvedValue([]), + downloadReportArtifact: vi.fn().mockImplementation(async project => { + const downloadPath = path.join( + workDir, + 'tmp', + project, + 'report.json', + ); + await mkdir(path.dirname(downloadPath), { recursive: true }); + await copyFile(fixturePaths.reports.before.json, downloadPath); + return downloadPath; + }), + }; + + await expect( + runInCI(refs, api, { ...options, ...monorepoOptions }, git), + ).resolves.toEqual({ + mode: 'monorepo', + commentId: mockComment.id, + diffPath: path.join(workDir, '.code-pushup/merged-report-diff.md'), + projects: [ + { + name: expect.stringContaining('api'), + files: { + report: { + json: path.join( + workDir, + 'backend/api/.code-pushup/report.json', + ), + md: path.join(workDir, 'backend/api/.code-pushup/report.md'), + }, + diff: { + json: path.join( + workDir, + 'backend/api/.code-pushup/report-diff.json', + ), + md: path.join( + workDir, + 'backend/api/.code-pushup/report-diff.md', + ), + }, + }, + newIssues: [], + }, + { + name: expect.stringContaining('auth'), + files: { + report: { + json: path.join( + workDir, + 'backend/auth/.code-pushup/report.json', + ), + md: path.join(workDir, 'backend/auth/.code-pushup/report.md'), + }, + diff: { + json: path.join( + workDir, + 'backend/auth/.code-pushup/report-diff.json', + ), + md: path.join( + workDir, + 'backend/auth/.code-pushup/report-diff.md', + ), + }, + }, + newIssues: [], + }, + { + name: 'frontend', + files: { + report: { + json: path.join(workDir, 'frontend/.code-pushup/report.json'), + md: path.join(workDir, 'frontend/.code-pushup/report.md'), + }, + diff: { + json: path.join( + workDir, + 'frontend/.code-pushup/report-diff.json', + ), + md: path.join( + workDir, + 'frontend/.code-pushup/report-diff.md', + ), + }, + }, + newIssues: [], + }, + ], + } satisfies RunResult); + + await expect( + readFile( + path.join(workDir, '.code-pushup/merged-report-diff.md'), + 'utf8', + ), + ).resolves.toBe(diffMdString); + + expect(api.listComments).toHaveBeenCalledWith(); + expect(api.createComment).toHaveBeenCalledWith( + expect.stringContaining(diffMdString), + ); + expect(api.updateComment).not.toHaveBeenCalled(); + + // 3 autoruns for each project + // 3 print-configs for each project + // 3 compares for each project + // 0 autoruns and print-configs for uncached projects + // 1 merge-diffs for all projects + expect( + executeProcessSpy.mock.calls.filter(([cfg]) => + cfg.command.includes('code-pushup'), + ), + ).toHaveLength(10); + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: options.bin, + args: ['print-config'], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: options.bin, + args: ['--persist.format=json', '--persist.format=md'], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: options.bin, + args: [ + 'compare', + expect.stringMatching(/^--before=.*prev-report.json$/), + expect.stringMatching(/^--after=.*curr-report.json$/), + expect.stringMatching(/^--label=\w+$/), + '--persist.format=json', + '--persist.format=md', + ], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + expect(utils.executeProcess).toHaveBeenCalledWith({ + command: options.bin, + args: [ + 'merge-diffs', + `--files=${path.join(workDir, 'backend/api/.code-pushup/report-diff.json')}`, + `--files=${path.join(workDir, 'backend/auth/.code-pushup/report-diff.json')}`, + `--files=${path.join(workDir, 'frontend/.code-pushup/report-diff.json')}`, + expect.stringMatching(/^--persist.outputDir=.*\.code-pushup$/), + '--persist.filename=merged-report', + ], + cwd: expect.stringContaining(workDir), + } satisfies utils.ProcessConfig); + + expect(logger.error).not.toHaveBeenCalled(); + expect(logger.warn).not.toHaveBeenCalled(); + expect(logger.info).toHaveBeenCalled(); + expect(logger.debug).toHaveBeenCalled(); + }); }); }); }); diff --git a/packages/ci/src/lib/run.ts b/packages/ci/src/lib/run.ts index 276f50ce0..49473a1db 100644 --- a/packages/ci/src/lib/run.ts +++ b/packages/ci/src/lib/run.ts @@ -1,32 +1,15 @@ -import fs from 'node:fs/promises'; -import path from 'node:path'; import { type SimpleGit, simpleGit } from 'simple-git'; -import type { Report, ReportsDiff } from '@code-pushup/models'; -import { stringifyError } from '@code-pushup/utils'; -import { - type CommandContext, - type PersistedCliFiles, - createCommandContext, - runCollect, - runCompare, - runMergeDiffs, - runPrintConfig, -} from './cli'; -import { commentOnPR } from './comment'; -import { DEFAULT_SETTINGS } from './constants'; -import { listChangedFiles } from './git'; -import { type SourceFileIssue, filterRelevantIssues } from './issues'; +import { DEFAULT_SETTINGS } from './constants.js'; import type { - GitBranch, GitRefs, - Logger, Options, - ProjectRunResult, ProviderAPIClient, RunResult, Settings, -} from './models'; -import { type ProjectConfig, listMonorepoProjects } from './monorepo'; +} from './models.js'; +import { runInMonorepoMode } from './run-monorepo.js'; +import { runInStandaloneMode } from './run-standalone.js'; +import type { RunEnv } from './run-utils.js'; /** * Runs Code PushUp in CI environment. @@ -36,247 +19,22 @@ import { type ProjectConfig, listMonorepoProjects } from './monorepo'; * @param git instance of simple-git - useful for testing * @returns result of run (standalone or monorepo) */ -// eslint-disable-next-line max-lines-per-function export async function runInCI( refs: GitRefs, api: ProviderAPIClient, options?: Options, git: SimpleGit = simpleGit(), ): Promise { - const settings: Settings = { ...DEFAULT_SETTINGS, ...options }; - const logger = settings.logger; + const settings: Settings = { + ...DEFAULT_SETTINGS, + ...options, + }; - if (settings.monorepo) { - logger.info('Running Code PushUp in monorepo mode'); - const projects = await listMonorepoProjects(settings); - const projectResults = await projects.reduce>( - async (acc, project) => [ - ...(await acc), - await runOnProject({ project, settings, refs, api, git }), - ], - Promise.resolve([]), - ); - const diffJsonPaths = projectResults - .map(({ artifacts: { diff } }) => - diff?.files.find(file => file.endsWith('.json')), - ) - .filter((file): file is string => file != null); - if (diffJsonPaths.length > 0) { - const { mdFilePath, artifactData: diffArtifact } = await runMergeDiffs( - diffJsonPaths, - createCommandContext(settings, projects[0]), - ); - logger.debug(`Merged ${diffJsonPaths.length} diffs into ${mdFilePath}`); - const commentId = await commentOnPR(mdFilePath, api, logger); - return { - mode: 'monorepo', - projects: projectResults, - commentId, - diffArtifact, - }; - } - return { mode: 'monorepo', projects: projectResults }; - } - - logger.info('Running Code PushUp in standalone project mode'); - const { artifacts, newIssues } = await runOnProject({ - project: null, - settings, - api, - refs, - git, - }); - const commentMdPath = artifacts.diff?.files.find(file => - file.endsWith('.md'), - ); - if (commentMdPath) { - const commentId = await commentOnPR(commentMdPath, api, logger); - return { - mode: 'standalone', - artifacts, - commentId, - newIssues, - }; - } - return { mode: 'standalone', artifacts, newIssues }; -} - -type RunOnProjectArgs = { - project: ProjectConfig | null; - refs: GitRefs; - api: ProviderAPIClient; - settings: Settings; - git: SimpleGit; -}; - -// eslint-disable-next-line max-lines-per-function -async function runOnProject(args: RunOnProjectArgs): Promise { - const { - project, - refs: { head, base }, - settings, - git, - } = args; - const logger = settings.logger; - - const ctx = createCommandContext(settings, project); - - if (project) { - logger.info(`Running Code PushUp on monorepo project ${project.name}`); - } - - const { jsonFilePath: currReportPath, artifactData: reportArtifact } = - await runCollect(ctx); - const currReport = await fs.readFile(currReportPath, 'utf8'); - logger.debug(`Collected current report at ${currReportPath}`); - - const noDiffOutput = { - name: project?.name ?? '-', - artifacts: { - report: reportArtifact, - }, - } satisfies ProjectRunResult; - - if (base == null) { - return noDiffOutput; - } - - logger.info( - `PR/MR detected, preparing to compare base branch ${base.ref} to head ${head.ref}`, - ); - - const prevReport = await collectPreviousReport({ ...args, base, ctx }); - if (!prevReport) { - return noDiffOutput; - } - - const reportsDir = path.join(settings.directory, '.code-pushup'); - const currPath = path.join(reportsDir, 'curr-report.json'); - const prevPath = path.join(reportsDir, 'prev-report.json'); - await fs.writeFile(currPath, currReport); - await fs.writeFile(prevPath, prevReport); - logger.debug(`Saved reports to ${currPath} and ${prevPath}`); - - const comparisonFiles = await runCompare( - { before: prevPath, after: currPath, label: project?.name }, - ctx, - ); - logger.info('Compared reports and generated diff files'); - logger.debug( - `Generated diff files at ${comparisonFiles.jsonFilePath} and ${comparisonFiles.mdFilePath}`, - ); + const env: RunEnv = { refs, api, settings, git }; - const diffOutput = { - ...noDiffOutput, - artifacts: { - ...noDiffOutput.artifacts, - diff: comparisonFiles.artifactData, - }, - } satisfies ProjectRunResult; - - if (!settings.detectNewIssues) { - return diffOutput; - } - - const newIssues = await findNewIssues({ - base, - currReport, - prevReport, - comparisonFiles, - logger, - git, - }); - - return { ...diffOutput, newIssues }; -} - -type CollectPreviousReportArgs = RunOnProjectArgs & { - base: GitBranch; - ctx: CommandContext; -}; - -async function collectPreviousReport( - args: CollectPreviousReportArgs, -): Promise { - const { project, base, api, settings, ctx, git } = args; - const logger = settings.logger; - - const cachedBaseReport = await api - .downloadReportArtifact?.(project?.name) - .catch((error: unknown) => { - logger.warn( - `Error when downloading previous report artifact, skipping - ${stringifyError(error)}`, - ); - }); - if (api.downloadReportArtifact != null) { - logger.info( - `Previous report artifact ${cachedBaseReport ? 'found' : 'not found'}`, - ); - if (cachedBaseReport) { - logger.debug( - `Previous report artifact downloaded to ${cachedBaseReport}`, - ); - } - } - - if (cachedBaseReport) { - return fs.readFile(cachedBaseReport, 'utf8'); - } else { - await git.fetch('origin', base.ref, ['--depth=1']); - await git.checkout(['-f', base.ref]); - logger.info(`Switched to base branch ${base.ref}`); - - try { - await runPrintConfig({ ...ctx, silent: !settings.debug }); - logger.debug( - `Executing print-config verified code-pushup installed in base branch ${base.ref}`, - ); - } catch (error) { - logger.debug(`Error from print-config - ${stringifyError(error)}`); - logger.info( - `Executing print-config failed, assuming code-pushup not installed in base branch ${base.ref} and skipping comparison`, - ); - return null; - } - - const { jsonFilePath: prevReportPath } = await runCollect(ctx); - const prevReport = await fs.readFile(prevReportPath, 'utf8'); - logger.debug(`Collected previous report at ${prevReportPath}`); - - await git.checkout(['-f', '-']); - logger.info('Switched back to PR/MR branch'); - - return prevReport; + if (settings.monorepo) { + return runInMonorepoMode(env); } -} - -async function findNewIssues(args: { - base: GitBranch; - currReport: string; - prevReport: string; - comparisonFiles: PersistedCliFiles; - logger: Logger; - git: SimpleGit; -}): Promise { - const { base, currReport, prevReport, comparisonFiles, logger, git } = args; - - await git.fetch('origin', base.ref, ['--depth=1']); - const reportsDiff = await fs.readFile(comparisonFiles.jsonFilePath, 'utf8'); - const changedFiles = await listChangedFiles( - { base: 'FETCH_HEAD', head: 'HEAD' }, - git, - ); - const issues = filterRelevantIssues({ - currReport: JSON.parse(currReport) as Report, - prevReport: JSON.parse(prevReport) as Report, - reportsDiff: JSON.parse(reportsDiff) as ReportsDiff, - changedFiles, - }); - logger.debug( - `Found ${issues.length} relevant issues for ${ - Object.keys(changedFiles).length - } changed files`, - ); - return issues; + return runInStandaloneMode(env); } diff --git a/packages/ci/vite.config.integration.ts b/packages/ci/vite.config.integration.ts index 3952d46ce..88517c4c7 100644 --- a/packages/ci/vite.config.integration.ts +++ b/packages/ci/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/ci', diff --git a/packages/ci/vite.config.unit.ts b/packages/ci/vite.config.unit.ts index c342a0176..e6dcce6bd 100644 --- a/packages/ci/vite.config.unit.ts +++ b/packages/ci/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/ci', diff --git a/packages/cli/.eslintrc.json b/packages/cli/.eslintrc.json deleted file mode 100644 index eea0f7e47..000000000 --- a/packages/cli/.eslintrc.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["packages/cli/tsconfig.*?.json"] - }, - "rules": {} - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": ["error"] - } - } - ] -} diff --git a/packages/cli/docs/custom-plugins.md b/packages/cli/docs/custom-plugins.md index 773d3e496..93c1bb725 100644 --- a/packages/cli/docs/custom-plugins.md +++ b/packages/cli/docs/custom-plugins.md @@ -208,7 +208,7 @@ of `AuditOutputs`: // file-size.plugin.ts import { AuditOutput } from '@code-pushup/models'; import { crawlFileSystem, pluralizeToken } from '@code-pushup/utils'; -import { RunnerFunction } from './plugin-config-runner'; +import { RunnerFunction } from './plugin-config-runner.js'; // ... @@ -328,7 +328,7 @@ The basic implementation of a `RunnerConfig` for the above command looks like th ```typescript // lighthouse.plugin.ts // ... -import { join } from 'path'; +import path from 'node:path'; import { AuditOutputs } from '@code-pushup/models'; import { objectToCliArgs } from '@code-pushup/utils'; @@ -336,7 +336,7 @@ function runnerConfig(options: Options): RunnerConfig { const { url } = options; // hardcoded to run only the LCP audit const audits = [lcpAuditMeta.slug]; - const outputFile = join(process.cwd(), '.code-pushup', 'lighthouse-report.json'); + const outputFile = path.join(process.cwd(), '.code-pushup', 'lighthouse-report.json'); return { // npx lighthouse https://example.com --output=json --outputFile=lighthouse-report.json --onlyAudits=largest-contentful-paint command: 'npx', @@ -496,7 +496,7 @@ We will extend the `fileSizeAuditOutput` with `details` show which files exceed // ... import { basename } from 'path'; import { formatBytes } from '@code-pushup/utils'; -import { AuditOutput } from './plugin-process-output'; +import { AuditOutput } from './plugin-process-output.js'; async function runnerFunction(options: Options): Promise { // ... diff --git a/packages/cli/eslint.config.js b/packages/cli/eslint.config.js new file mode 100644 index 000000000..40165321a --- /dev/null +++ b/packages/cli/eslint.config.js @@ -0,0 +1,21 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config( + ...baseConfig, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': 'error', + }, + }, +); diff --git a/packages/cli/mocks/constants.ts b/packages/cli/mocks/constants.ts index df2fc0812..dc9713937 100644 --- a/packages/cli/mocks/constants.ts +++ b/packages/cli/mocks/constants.ts @@ -1,6 +1,6 @@ -import { commands } from '../src/lib/commands'; -import { middlewares } from '../src/lib/middlewares'; -import { options } from '../src/lib/options'; +import { commands } from '../src/lib/commands.js'; +import { middlewares } from '../src/lib/middlewares.js'; +import { options } from '../src/lib/options.js'; export const DEFAULT_CLI_CONFIGURATION = { usageMessage: 'Code PushUp CLI', diff --git a/packages/cli/package.json b/packages/cli/package.json index 2cfa1d491..673df53b5 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@code-pushup/cli", - "version": "0.55.0", + "version": "0.57.0", "license": "MIT", "description": "A CLI to run all kinds of code quality measurements to align your team with company goals", "homepage": "https://code-pushup.dev", @@ -38,15 +38,13 @@ "access": "public" }, "type": "module", - "main": "./index.js", - "types": "./src/index.d.ts", "bin": { - "code-pushup": "index.js" + "code-pushup": "./src/index.js" }, "dependencies": { - "@code-pushup/models": "0.55.0", - "@code-pushup/core": "0.55.0", - "@code-pushup/utils": "0.55.0", + "@code-pushup/models": "0.57.0", + "@code-pushup/core": "0.57.0", + "@code-pushup/utils": "0.57.0", "yargs": "^17.7.2", "ansis": "^3.3.0", "simple-git": "^3.20.0" diff --git a/packages/cli/project.json b/packages/cli/project.json index 4449eead3..ad1330e08 100644 --- a/packages/cli/project.json +++ b/packages/cli/project.json @@ -5,14 +5,13 @@ "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/packages/cli", "main": "packages/cli/src/index.ts", "tsConfig": "packages/cli/tsconfig.lib.json", - "assets": ["packages/cli/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["packages/cli/*.md"] } }, "lint": { diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 70c8f312d..b43351712 100755 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,6 +1,6 @@ #! /usr/bin/env node import { hideBin } from 'yargs/helpers'; -import { cli } from './lib/cli'; +import { cli } from './lib/cli.js'; // bootstrap Yargs, parse arguments and execute command await cli(hideBin(process.argv)).argv; diff --git a/packages/cli/src/lib/autorun/autorun-command.ts b/packages/cli/src/lib/autorun/autorun-command.ts index dd0dfeb53..0771c3237 100644 --- a/packages/cli/src/lib/autorun/autorun-command.ts +++ b/packages/cli/src/lib/autorun/autorun-command.ts @@ -7,13 +7,13 @@ import { upload, } from '@code-pushup/core'; import { ui } from '@code-pushup/utils'; -import { CLI_NAME } from '../constants'; +import { CLI_NAME } from '../constants.js'; import { collectSuccessfulLog, renderConfigureCategoriesHint, renderIntegratePortalHint, uploadSuccessfulLog, -} from '../implementation/logging'; +} from '../implementation/logging.js'; type AutorunOptions = CollectOptions & UploadOptions; diff --git a/packages/cli/src/lib/autorun/autorun-command.unit.test.ts b/packages/cli/src/lib/autorun/autorun-command.unit.test.ts index cb5d3b17e..891b49dfb 100644 --- a/packages/cli/src/lib/autorun/autorun-command.unit.test.ts +++ b/packages/cli/src/lib/autorun/autorun-command.unit.test.ts @@ -3,9 +3,9 @@ import { describe, expect, it, vi } from 'vitest'; import { uploadToPortal } from '@code-pushup/portal-client'; import { collectAndPersistReports, readRcByPath } from '@code-pushup/core'; import { MEMFS_VOLUME, MINIMAL_REPORT_MOCK } from '@code-pushup/test-utils'; -import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants'; -import { yargsCli } from '../yargs-cli'; -import { yargsAutorunCommandObject } from './autorun-command'; +import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants.js'; +import { yargsCli } from '../yargs-cli.js'; +import { yargsAutorunCommandObject } from './autorun-command.js'; vi.mock('@code-pushup/core', async () => { const { CORE_CONFIG_MOCK }: typeof import('@code-pushup/test-utils') = diff --git a/packages/cli/src/lib/cli.ts b/packages/cli/src/lib/cli.ts index afb561853..50eef57be 100644 --- a/packages/cli/src/lib/cli.ts +++ b/packages/cli/src/lib/cli.ts @@ -1,8 +1,8 @@ -import { commands } from './commands'; -import { CLI_NAME, CLI_SCRIPT_NAME } from './constants'; -import { middlewares } from './middlewares'; -import { groups, options } from './options'; -import { yargsCli } from './yargs-cli'; +import { commands } from './commands.js'; +import { CLI_NAME, CLI_SCRIPT_NAME } from './constants.js'; +import { middlewares } from './middlewares.js'; +import { groups, options } from './options.js'; +import { yargsCli } from './yargs-cli.js'; export const cli = (args: string[]) => yargsCli(args, { diff --git a/packages/cli/src/lib/collect/collect-command.ts b/packages/cli/src/lib/collect/collect-command.ts index fc51781b1..0f295d0fa 100644 --- a/packages/cli/src/lib/collect/collect-command.ts +++ b/packages/cli/src/lib/collect/collect-command.ts @@ -5,11 +5,11 @@ import { collectAndPersistReports, } from '@code-pushup/core'; import { link, ui } from '@code-pushup/utils'; -import { CLI_NAME } from '../constants'; +import { CLI_NAME } from '../constants.js'; import { collectSuccessfulLog, renderConfigureCategoriesHint, -} from '../implementation/logging'; +} from '../implementation/logging.js'; export function yargsCollectCommandObject(): CommandModule { const command = 'collect'; diff --git a/packages/cli/src/lib/collect/collect-command.unit.test.ts b/packages/cli/src/lib/collect/collect-command.unit.test.ts index 99e3eb0b4..796fee62b 100644 --- a/packages/cli/src/lib/collect/collect-command.unit.test.ts +++ b/packages/cli/src/lib/collect/collect-command.unit.test.ts @@ -6,9 +6,9 @@ import { DEFAULT_PERSIST_OUTPUT_DIR, type PersistConfig, } from '@code-pushup/models'; -import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants'; -import { yargsCli } from '../yargs-cli'; -import { yargsCollectCommandObject } from './collect-command'; +import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants.js'; +import { yargsCli } from '../yargs-cli.js'; +import { yargsCollectCommandObject } from './collect-command.js'; vi.mock('@code-pushup/core', async () => { const { CORE_CONFIG_MOCK }: typeof import('@code-pushup/test-utils') = diff --git a/packages/cli/src/lib/commands.ts b/packages/cli/src/lib/commands.ts index b31a0f257..7dacdf981 100644 --- a/packages/cli/src/lib/commands.ts +++ b/packages/cli/src/lib/commands.ts @@ -1,11 +1,11 @@ import type { CommandModule } from 'yargs'; -import { yargsAutorunCommandObject } from './autorun/autorun-command'; -import { yargsCollectCommandObject } from './collect/collect-command'; -import { yargsCompareCommandObject } from './compare/compare-command'; -import { yargsHistoryCommandObject } from './history/history-command'; -import { yargsMergeDiffsCommandObject } from './merge-diffs/merge-diffs-command'; -import { yargsConfigCommandObject } from './print-config/print-config-command'; -import { yargsUploadCommandObject } from './upload/upload-command'; +import { yargsAutorunCommandObject } from './autorun/autorun-command.js'; +import { yargsCollectCommandObject } from './collect/collect-command.js'; +import { yargsCompareCommandObject } from './compare/compare-command.js'; +import { yargsHistoryCommandObject } from './history/history-command.js'; +import { yargsMergeDiffsCommandObject } from './merge-diffs/merge-diffs-command.js'; +import { yargsConfigCommandObject } from './print-config/print-config-command.js'; +import { yargsUploadCommandObject } from './upload/upload-command.js'; export const commands: CommandModule[] = [ { diff --git a/packages/cli/src/lib/compare/compare-command.ts b/packages/cli/src/lib/compare/compare-command.ts index 0c11245fb..c098fb848 100644 --- a/packages/cli/src/lib/compare/compare-command.ts +++ b/packages/cli/src/lib/compare/compare-command.ts @@ -3,9 +3,9 @@ import type { CommandModule } from 'yargs'; import { compareReportFiles } from '@code-pushup/core'; import type { PersistConfig, UploadConfig } from '@code-pushup/models'; import { ui } from '@code-pushup/utils'; -import { CLI_NAME } from '../constants'; -import type { CompareOptions } from '../implementation/compare.model'; -import { yargsCompareOptionsDefinition } from '../implementation/compare.options'; +import { CLI_NAME } from '../constants.js'; +import type { CompareOptions } from '../implementation/compare.model.js'; +import { yargsCompareOptionsDefinition } from '../implementation/compare.options.js'; export function yargsCompareCommandObject() { const command = 'compare'; diff --git a/packages/cli/src/lib/compare/compare-command.unit.test.ts b/packages/cli/src/lib/compare/compare-command.unit.test.ts index 781c61142..d38e69517 100644 --- a/packages/cli/src/lib/compare/compare-command.unit.test.ts +++ b/packages/cli/src/lib/compare/compare-command.unit.test.ts @@ -7,9 +7,9 @@ import { } from '@code-pushup/models'; import { getLogMessages } from '@code-pushup/test-utils'; import { ui } from '@code-pushup/utils'; -import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants'; -import { yargsCli } from '../yargs-cli'; -import { yargsCompareCommandObject } from './compare-command'; +import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants.js'; +import { yargsCli } from '../yargs-cli.js'; +import { yargsCompareCommandObject } from './compare-command.js'; vi.mock('@code-pushup/core', async () => { const core: object = await vi.importActual('@code-pushup/core'); diff --git a/packages/cli/src/lib/history/history-command.ts b/packages/cli/src/lib/history/history-command.ts index 12b208d84..1895ba80e 100644 --- a/packages/cli/src/lib/history/history-command.ts +++ b/packages/cli/src/lib/history/history-command.ts @@ -9,11 +9,11 @@ import { safeCheckout, ui, } from '@code-pushup/utils'; -import { CLI_NAME } from '../constants'; -import { yargsFilterOptionsDefinition } from '../implementation/filter.options'; -import type { HistoryCliOptions } from './history.model'; -import { yargsHistoryOptionsDefinition } from './history.options'; -import { normalizeHashOptions } from './utils'; +import { CLI_NAME } from '../constants.js'; +import { yargsFilterOptionsDefinition } from '../implementation/filter.options.js'; +import type { HistoryCliOptions } from './history.model.js'; +import { yargsHistoryOptionsDefinition } from './history.options.js'; +import { normalizeHashOptions } from './utils.js'; const command = 'history'; async function handler(args: unknown) { diff --git a/packages/cli/src/lib/history/history-command.unit.test.ts b/packages/cli/src/lib/history/history-command.unit.test.ts index b796c53be..e1892d7f0 100644 --- a/packages/cli/src/lib/history/history-command.unit.test.ts +++ b/packages/cli/src/lib/history/history-command.unit.test.ts @@ -1,9 +1,9 @@ import { describe, expect, vi } from 'vitest'; import { type HistoryOptions, history } from '@code-pushup/core'; import { safeCheckout } from '@code-pushup/utils'; -import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants'; -import { yargsCli } from '../yargs-cli'; -import { yargsHistoryCommandObject } from './history-command'; +import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants.js'; +import { yargsCli } from '../yargs-cli.js'; +import { yargsHistoryCommandObject } from './history-command.js'; vi.mock('@code-pushup/core', async () => { const { diff --git a/packages/cli/src/lib/history/history.options.ts b/packages/cli/src/lib/history/history.options.ts index b48e1b7e0..29dc7f4b3 100644 --- a/packages/cli/src/lib/history/history.options.ts +++ b/packages/cli/src/lib/history/history.options.ts @@ -1,5 +1,5 @@ import type { Options } from 'yargs'; -import type { HistoryCliOptions } from './history.model'; +import type { HistoryCliOptions } from './history.model.js'; export function yargsHistoryOptionsDefinition(): Record< keyof HistoryCliOptions, @@ -30,7 +30,7 @@ export function yargsHistoryOptionsDefinition(): Record< // https://git-scm.com/docs/git-log#Documentation/git-log.txt---max-countltnumbergt describe: 'Number of steps in history', type: 'number', - // eslint-disable-next-line no-magic-numbers + // eslint-disable-next-line @typescript-eslint/no-magic-numbers default: 5, }, from: { diff --git a/packages/cli/src/lib/history/utils.ts b/packages/cli/src/lib/history/utils.ts index 413e9b56c..adc0b0a02 100644 --- a/packages/cli/src/lib/history/utils.ts +++ b/packages/cli/src/lib/history/utils.ts @@ -1,6 +1,6 @@ import type { HistoryOptions } from '@code-pushup/core'; import { getHashFromTag, isSemver } from '@code-pushup/utils'; -import type { HistoryCliOptions } from './history.model'; +import type { HistoryCliOptions } from './history.model.js'; export async function normalizeHashOptions( processArgs: HistoryCliOptions & HistoryOptions, diff --git a/packages/cli/src/lib/history/utils.unit.test.ts b/packages/cli/src/lib/history/utils.unit.test.ts index 30e5913f7..fe42bae77 100644 --- a/packages/cli/src/lib/history/utils.unit.test.ts +++ b/packages/cli/src/lib/history/utils.unit.test.ts @@ -1,7 +1,7 @@ import { describe, expect, vi } from 'vitest'; import type { HistoryOptions } from '@code-pushup/core'; -import type { HistoryCliOptions } from './history.model'; -import { normalizeHashOptions } from './utils'; +import type { HistoryCliOptions } from './history.model.js'; +import { normalizeHashOptions } from './utils.js'; vi.mock('simple-git', async () => { const actual = await vi.importActual('simple-git'); diff --git a/packages/cli/src/lib/implementation/compare.options.ts b/packages/cli/src/lib/implementation/compare.options.ts index c7e2cb22b..d7ab52985 100644 --- a/packages/cli/src/lib/implementation/compare.options.ts +++ b/packages/cli/src/lib/implementation/compare.options.ts @@ -1,5 +1,5 @@ import type { Options } from 'yargs'; -import type { CompareOptions } from './compare.model'; +import type { CompareOptions } from './compare.model.js'; export function yargsCompareOptionsDefinition(): Record< keyof CompareOptions, diff --git a/packages/cli/src/lib/implementation/core-config.integration.test.ts b/packages/cli/src/lib/implementation/core-config.integration.test.ts index 94ea12093..5cca9ee80 100644 --- a/packages/cli/src/lib/implementation/core-config.integration.test.ts +++ b/packages/cli/src/lib/implementation/core-config.integration.test.ts @@ -8,9 +8,9 @@ import { type UploadConfig, } from '@code-pushup/models'; import { CORE_CONFIG_MOCK, MINIMAL_CONFIG_MOCK } from '@code-pushup/test-utils'; -import { yargsCli } from '../yargs-cli'; -import { coreConfigMiddleware } from './core-config.middleware'; -import { yargsCoreConfigOptionsDefinition } from './core-config.options'; +import { yargsCli } from '../yargs-cli.js'; +import { coreConfigMiddleware } from './core-config.middleware.js'; +import { yargsCoreConfigOptionsDefinition } from './core-config.options.js'; vi.mock('@code-pushup/core', async () => { const core = await vi.importActual('@code-pushup/core'); diff --git a/packages/cli/src/lib/implementation/core-config.middleware.integration.test.ts b/packages/cli/src/lib/implementation/core-config.middleware.integration.test.ts index 2d592fc3f..8ea4bb283 100644 --- a/packages/cli/src/lib/implementation/core-config.middleware.integration.test.ts +++ b/packages/cli/src/lib/implementation/core-config.middleware.integration.test.ts @@ -1,10 +1,10 @@ -import { dirname, join } from 'node:path'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { describe, expect } from 'vitest'; -import { coreConfigMiddleware } from './core-config.middleware'; +import { coreConfigMiddleware } from './core-config.middleware.js'; -const configDirPath = join( - fileURLToPath(dirname(import.meta.url)), +const configDirPath = path.join( + fileURLToPath(path.dirname(import.meta.url)), '..', '..', '..', @@ -30,7 +30,7 @@ describe('coreConfigMiddleware', () => { 'should load a valid .%s config', async extension => { const config = await coreConfigMiddleware({ - config: join(configDirPath, `code-pushup.config.${extension}`), + config: path.join(configDirPath, `code-pushup.config.${extension}`), ...CLI_DEFAULTS, }); expect(config.config).toContain(`code-pushup.config.${extension}`); @@ -47,8 +47,11 @@ describe('coreConfigMiddleware', () => { it('should load config which relies on provided --tsconfig', async () => { await expect( coreConfigMiddleware({ - config: join(configDirPath, 'code-pushup.needs-tsconfig.config.ts'), - tsconfig: join(configDirPath, 'tsconfig.json'), + config: path.join( + configDirPath, + 'code-pushup.needs-tsconfig.config.ts', + ), + tsconfig: path.join(configDirPath, 'tsconfig.json'), ...CLI_DEFAULTS, }), ).resolves.toBeTruthy(); @@ -57,7 +60,10 @@ describe('coreConfigMiddleware', () => { it('should throw if --tsconfig is missing but needed to resolve import', async () => { await expect( coreConfigMiddleware({ - config: join(configDirPath, 'code-pushup.needs-tsconfig.config.ts'), + config: path.join( + configDirPath, + 'code-pushup.needs-tsconfig.config.ts', + ), ...CLI_DEFAULTS, }), ).rejects.toThrow("Cannot find package '@example/custom-plugin'"); diff --git a/packages/cli/src/lib/implementation/core-config.middleware.ts b/packages/cli/src/lib/implementation/core-config.middleware.ts index 7be073286..0f2891178 100644 --- a/packages/cli/src/lib/implementation/core-config.middleware.ts +++ b/packages/cli/src/lib/implementation/core-config.middleware.ts @@ -7,9 +7,9 @@ import { type Format, uploadConfigSchema, } from '@code-pushup/models'; -import type { CoreConfigCliOptions } from './core-config.model'; -import type { FilterOptions } from './filter.model'; -import type { GeneralCliOptions } from './global.model'; +import type { CoreConfigCliOptions } from './core-config.model.js'; +import type { FilterOptions } from './filter.model.js'; +import type { GeneralCliOptions } from './global.model.js'; export type CoreConfigMiddlewareOptions = GeneralCliOptions & CoreConfigCliOptions & diff --git a/packages/cli/src/lib/implementation/core-config.middleware.unit.test.ts b/packages/cli/src/lib/implementation/core-config.middleware.unit.test.ts index 4c85365c9..134b8f183 100644 --- a/packages/cli/src/lib/implementation/core-config.middleware.unit.test.ts +++ b/packages/cli/src/lib/implementation/core-config.middleware.unit.test.ts @@ -3,10 +3,10 @@ import { autoloadRc, readRcByPath } from '@code-pushup/core'; import { coreConfigMiddleware, normalizeFormats, -} from './core-config.middleware'; -import type { CoreConfigCliOptions } from './core-config.model'; -import type { FilterOptions } from './filter.model'; -import type { GeneralCliOptions } from './global.model'; +} from './core-config.middleware.js'; +import type { CoreConfigCliOptions } from './core-config.model.js'; +import type { FilterOptions } from './filter.model.js'; +import type { GeneralCliOptions } from './global.model.js'; vi.mock('@code-pushup/core', async () => { const { CORE_CONFIG_MOCK }: typeof import('@code-pushup/test-utils') = diff --git a/packages/cli/src/lib/implementation/core-config.model.ts b/packages/cli/src/lib/implementation/core-config.model.ts index 7293c7420..612c071cc 100644 --- a/packages/cli/src/lib/implementation/core-config.model.ts +++ b/packages/cli/src/lib/implementation/core-config.model.ts @@ -1,6 +1,5 @@ import type { CoreConfig, Format, UploadConfig } from '@code-pushup/models'; -/* eslint-disable @typescript-eslint/naming-convention */ export type PersistConfigCliOptions = { 'persist.outputDir'?: string; 'persist.filename'?: string; @@ -13,7 +12,6 @@ export type UploadConfigCliOptions = { 'upload.apiKey'?: string; 'upload.server'?: string; }; -/* eslint-enable @typescript-eslint/naming-convention */ export type ConfigCliOptions = { config?: string; diff --git a/packages/cli/src/lib/implementation/core-config.options.ts b/packages/cli/src/lib/implementation/core-config.options.ts index c507a8956..79d62346a 100644 --- a/packages/cli/src/lib/implementation/core-config.options.ts +++ b/packages/cli/src/lib/implementation/core-config.options.ts @@ -2,7 +2,7 @@ import type { Options } from 'yargs'; import type { PersistConfigCliOptions, UploadConfigCliOptions, -} from './core-config.model'; +} from './core-config.model.js'; export function yargsCoreConfigOptionsDefinition(): Record< keyof (PersistConfigCliOptions & UploadConfigCliOptions), diff --git a/packages/cli/src/lib/implementation/filter.middleware.ts b/packages/cli/src/lib/implementation/filter.middleware.ts index 716f6a2cc..92f380f2b 100644 --- a/packages/cli/src/lib/implementation/filter.middleware.ts +++ b/packages/cli/src/lib/implementation/filter.middleware.ts @@ -1,11 +1,11 @@ import type { CoreConfig } from '@code-pushup/models'; import { filterItemRefsBy } from '@code-pushup/utils'; -import type { FilterOptions, Filterables } from './filter.model'; +import type { FilterOptions, Filterables } from './filter.model.js'; import { handleConflictingOptions, validateFilterOption, validateFinalState, -} from './validate-filter-options.utils'; +} from './validate-filter-options.utils.js'; export function filterMiddleware( originalProcessArgs: T, diff --git a/packages/cli/src/lib/implementation/filter.middleware.unit.test.ts b/packages/cli/src/lib/implementation/filter.middleware.unit.test.ts index c81bc9e86..5a8ad6a03 100644 --- a/packages/cli/src/lib/implementation/filter.middleware.unit.test.ts +++ b/packages/cli/src/lib/implementation/filter.middleware.unit.test.ts @@ -1,7 +1,7 @@ import type { CategoryConfig, PluginConfig } from '@code-pushup/models'; import { ui } from '@code-pushup/utils'; -import { filterMiddleware } from './filter.middleware'; -import { OptionValidationError } from './validate-filter-options.utils'; +import { filterMiddleware } from './filter.middleware.js'; +import { OptionValidationError } from './validate-filter-options.utils.js'; vi.mock('@code-pushup/core', async () => { const { CORE_CONFIG_MOCK }: typeof import('@code-pushup/test-utils') = diff --git a/packages/cli/src/lib/implementation/filter.options.ts b/packages/cli/src/lib/implementation/filter.options.ts index 6917b3bde..6139b109b 100644 --- a/packages/cli/src/lib/implementation/filter.options.ts +++ b/packages/cli/src/lib/implementation/filter.options.ts @@ -1,6 +1,6 @@ import type { Options } from 'yargs'; -import type { FilterCliOptions } from './filter.model'; -import { coerceArray } from './global.utils'; +import type { FilterCliOptions } from './filter.model.js'; +import { coerceArray } from './global.utils.js'; export const skipCategoriesOption: Options = { describe: 'List of categories to skip. If not set all categories are run.', diff --git a/packages/cli/src/lib/implementation/formatting.unit.test.ts b/packages/cli/src/lib/implementation/formatting.unit.test.ts index 492537862..3ba992c11 100644 --- a/packages/cli/src/lib/implementation/formatting.unit.test.ts +++ b/packages/cli/src/lib/implementation/formatting.unit.test.ts @@ -6,7 +6,7 @@ import { formatObjectValue, headerStyle, titleStyle, -} from './formatting'; +} from './formatting.js'; describe('titleStyle', () => { it('should return a string with green color', () => { diff --git a/packages/cli/src/lib/implementation/global.model.ts b/packages/cli/src/lib/implementation/global.model.ts index 02e186801..5c5c408b7 100644 --- a/packages/cli/src/lib/implementation/global.model.ts +++ b/packages/cli/src/lib/implementation/global.model.ts @@ -1,4 +1,4 @@ import type { GlobalOptions } from '@code-pushup/core'; -import type { ConfigCliOptions } from './core-config.model'; +import type { ConfigCliOptions } from './core-config.model.js'; export type GeneralCliOptions = ConfigCliOptions & GlobalOptions; diff --git a/packages/cli/src/lib/implementation/global.options.ts b/packages/cli/src/lib/implementation/global.options.ts index 7f2b20ae3..9cbf4c8df 100644 --- a/packages/cli/src/lib/implementation/global.options.ts +++ b/packages/cli/src/lib/implementation/global.options.ts @@ -1,5 +1,5 @@ import type { Options } from 'yargs'; -import type { GeneralCliOptions } from './global.model'; +import type { GeneralCliOptions } from './global.model.js'; export function yargsGlobalOptionsDefinition(): Record< keyof GeneralCliOptions, diff --git a/packages/cli/src/lib/implementation/global.utils.ts b/packages/cli/src/lib/implementation/global.utils.ts index ddc46334e..83d18beac 100644 --- a/packages/cli/src/lib/implementation/global.utils.ts +++ b/packages/cli/src/lib/implementation/global.utils.ts @@ -1,6 +1,6 @@ import yargs from 'yargs'; import { toArray, ui } from '@code-pushup/utils'; -import { OptionValidationError } from './validate-filter-options.utils'; +import { OptionValidationError } from './validate-filter-options.utils.js'; export function filterKebabCaseKeys>( obj: T, @@ -33,7 +33,6 @@ export function logErrorBeforeThrow any>( // eslint-disable-next-line @typescript-eslint/no-explicit-any return (async (...args: any[]) => { try { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument return await fn(...args); } catch (error) { if (error instanceof OptionValidationError) { diff --git a/packages/cli/src/lib/implementation/global.utils.unit.test.ts b/packages/cli/src/lib/implementation/global.utils.unit.test.ts index 2e6390e67..07627f060 100644 --- a/packages/cli/src/lib/implementation/global.utils.unit.test.ts +++ b/packages/cli/src/lib/implementation/global.utils.unit.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest'; import { ui } from '@code-pushup/utils'; -import { filterKebabCaseKeys, logErrorBeforeThrow } from './global.utils'; -import { OptionValidationError } from './validate-filter-options.utils'; +import { filterKebabCaseKeys, logErrorBeforeThrow } from './global.utils.js'; +import { OptionValidationError } from './validate-filter-options.utils.js'; describe('filterKebabCaseKeys', () => { it('should filter root level kebab-case keys', () => { diff --git a/packages/cli/src/lib/implementation/merge-diffs.options.ts b/packages/cli/src/lib/implementation/merge-diffs.options.ts index 48a25e9f1..b35020580 100644 --- a/packages/cli/src/lib/implementation/merge-diffs.options.ts +++ b/packages/cli/src/lib/implementation/merge-diffs.options.ts @@ -1,5 +1,5 @@ import type { Options } from 'yargs'; -import type { MergeDiffsOptions } from './merge-diffs.model'; +import type { MergeDiffsOptions } from './merge-diffs.model.js'; export function yargsMergeDiffsOptionsDefinition(): Record< keyof MergeDiffsOptions, diff --git a/packages/cli/src/lib/implementation/validate-filter-options.utils.ts b/packages/cli/src/lib/implementation/validate-filter-options.utils.ts index d4baa8948..c84b4af03 100644 --- a/packages/cli/src/lib/implementation/validate-filter-options.utils.ts +++ b/packages/cli/src/lib/implementation/validate-filter-options.utils.ts @@ -5,7 +5,7 @@ import { pluralize, ui, } from '@code-pushup/utils'; -import type { FilterOptionType, Filterables } from './filter.model'; +import type { FilterOptionType, Filterables } from './filter.model.js'; export class OptionValidationError extends Error {} diff --git a/packages/cli/src/lib/implementation/validate-filter-options.utils.unit.test.ts b/packages/cli/src/lib/implementation/validate-filter-options.utils.unit.test.ts index f6f0be6c3..770ffd520 100644 --- a/packages/cli/src/lib/implementation/validate-filter-options.utils.unit.test.ts +++ b/packages/cli/src/lib/implementation/validate-filter-options.utils.unit.test.ts @@ -2,7 +2,7 @@ import { describe, expect } from 'vitest'; import type { CategoryConfig, PluginConfig } from '@code-pushup/models'; import { getLogMessages } from '@code-pushup/test-utils'; import { ui } from '@code-pushup/utils'; -import type { FilterOptionType } from './filter.model'; +import type { FilterOptionType } from './filter.model.js'; import { OptionValidationError, createValidationMessage, @@ -10,7 +10,7 @@ import { handleConflictingOptions, validateFilterOption, validateFinalState, -} from './validate-filter-options.utils'; +} from './validate-filter-options.utils.js'; describe('validateFilterOption', () => { it.each([ diff --git a/packages/cli/src/lib/merge-diffs/merge-diffs-command.ts b/packages/cli/src/lib/merge-diffs/merge-diffs-command.ts index d72c53373..3a3a7308c 100644 --- a/packages/cli/src/lib/merge-diffs/merge-diffs-command.ts +++ b/packages/cli/src/lib/merge-diffs/merge-diffs-command.ts @@ -3,9 +3,9 @@ import type { CommandModule } from 'yargs'; import { mergeDiffs } from '@code-pushup/core'; import type { PersistConfig } from '@code-pushup/models'; import { ui } from '@code-pushup/utils'; -import { CLI_NAME } from '../constants'; -import type { MergeDiffsOptions } from '../implementation/merge-diffs.model'; -import { yargsMergeDiffsOptionsDefinition } from '../implementation/merge-diffs.options'; +import { CLI_NAME } from '../constants.js'; +import type { MergeDiffsOptions } from '../implementation/merge-diffs.model.js'; +import { yargsMergeDiffsOptionsDefinition } from '../implementation/merge-diffs.options.js'; export function yargsMergeDiffsCommandObject() { const command = 'merge-diffs'; diff --git a/packages/cli/src/lib/merge-diffs/merge-diffs-command.unit.test.ts b/packages/cli/src/lib/merge-diffs/merge-diffs-command.unit.test.ts index 1481e8e33..6e95f5a90 100644 --- a/packages/cli/src/lib/merge-diffs/merge-diffs-command.unit.test.ts +++ b/packages/cli/src/lib/merge-diffs/merge-diffs-command.unit.test.ts @@ -7,9 +7,9 @@ import { } from '@code-pushup/models'; import { getLogMessages } from '@code-pushup/test-utils'; import { ui } from '@code-pushup/utils'; -import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants'; -import { yargsCli } from '../yargs-cli'; -import { yargsMergeDiffsCommandObject } from './merge-diffs-command'; +import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants.js'; +import { yargsCli } from '../yargs-cli.js'; +import { yargsMergeDiffsCommandObject } from './merge-diffs-command.js'; vi.mock('@code-pushup/core', async () => { const core: object = await vi.importActual('@code-pushup/core'); diff --git a/packages/cli/src/lib/middlewares.ts b/packages/cli/src/lib/middlewares.ts index e4e4f0eb7..b163a8085 100644 --- a/packages/cli/src/lib/middlewares.ts +++ b/packages/cli/src/lib/middlewares.ts @@ -1,6 +1,6 @@ import type { MiddlewareFunction } from 'yargs'; -import { coreConfigMiddleware } from './implementation/core-config.middleware'; -import { filterMiddleware } from './implementation/filter.middleware'; +import { coreConfigMiddleware } from './implementation/core-config.middleware.js'; +import { filterMiddleware } from './implementation/filter.middleware.js'; export const middlewares = [ { diff --git a/packages/cli/src/lib/options.ts b/packages/cli/src/lib/options.ts index 07e401e78..e1835ed5c 100644 --- a/packages/cli/src/lib/options.ts +++ b/packages/cli/src/lib/options.ts @@ -2,9 +2,9 @@ import { yargsCoreConfigOptionsDefinition, yargsPersistConfigOptionsDefinition, yargsUploadConfigOptionsDefinition, -} from './implementation/core-config.options'; -import { yargsFilterOptionsDefinition } from './implementation/filter.options'; -import { yargsGlobalOptionsDefinition } from './implementation/global.options'; +} from './implementation/core-config.options.js'; +import { yargsFilterOptionsDefinition } from './implementation/filter.options.js'; +import { yargsGlobalOptionsDefinition } from './implementation/global.options.js'; export const options = { ...yargsGlobalOptionsDefinition(), diff --git a/packages/cli/src/lib/print-config/print-config-command.ts b/packages/cli/src/lib/print-config/print-config-command.ts index ff6e3bd7b..278d7d5ac 100644 --- a/packages/cli/src/lib/print-config/print-config-command.ts +++ b/packages/cli/src/lib/print-config/print-config-command.ts @@ -1,6 +1,6 @@ import type { CommandModule } from 'yargs'; import { ui } from '@code-pushup/utils'; -import { filterKebabCaseKeys } from '../implementation/global.utils'; +import { filterKebabCaseKeys } from '../implementation/global.utils.js'; export function yargsConfigCommandObject() { const command = 'print-config'; @@ -8,7 +8,6 @@ export function yargsConfigCommandObject() { command, describe: 'Print config', handler: yargsArgs => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars const { _, $0, ...args } = yargsArgs; // it is important to filter out kebab case keys // because yargs duplicates options in camel case and kebab case diff --git a/packages/cli/src/lib/print-config/print-config-command.unit.test.ts b/packages/cli/src/lib/print-config/print-config-command.unit.test.ts index 403b36a92..8e3c8cae4 100644 --- a/packages/cli/src/lib/print-config/print-config-command.unit.test.ts +++ b/packages/cli/src/lib/print-config/print-config-command.unit.test.ts @@ -1,9 +1,9 @@ import { describe, expect, vi } from 'vitest'; import { getLogMessages } from '@code-pushup/test-utils'; import { ui } from '@code-pushup/utils'; -import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants'; -import { yargsCli } from '../yargs-cli'; -import { yargsConfigCommandObject } from './print-config-command'; +import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants.js'; +import { yargsCli } from '../yargs-cli.js'; +import { yargsConfigCommandObject } from './print-config-command.js'; vi.mock('@code-pushup/core', async () => { const { CORE_CONFIG_MOCK }: typeof import('@code-pushup/test-utils') = diff --git a/packages/cli/src/lib/upload/upload-command.ts b/packages/cli/src/lib/upload/upload-command.ts index aeba2a609..23adad16a 100644 --- a/packages/cli/src/lib/upload/upload-command.ts +++ b/packages/cli/src/lib/upload/upload-command.ts @@ -2,11 +2,11 @@ import { bold, gray } from 'ansis'; import type { ArgumentsCamelCase, CommandModule } from 'yargs'; import { type UploadOptions, upload } from '@code-pushup/core'; import { ui } from '@code-pushup/utils'; -import { CLI_NAME } from '../constants'; +import { CLI_NAME } from '../constants.js'; import { renderIntegratePortalHint, uploadSuccessfulLog, -} from '../implementation/logging'; +} from '../implementation/logging.js'; export function yargsUploadCommandObject() { const command = 'upload'; diff --git a/packages/cli/src/lib/upload/upload-command.unit.test.ts b/packages/cli/src/lib/upload/upload-command.unit.test.ts index 040e07999..5bd722b55 100644 --- a/packages/cli/src/lib/upload/upload-command.unit.test.ts +++ b/packages/cli/src/lib/upload/upload-command.unit.test.ts @@ -7,9 +7,9 @@ import { MEMFS_VOLUME, MINIMAL_REPORT_MOCK, } from '@code-pushup/test-utils'; -import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants'; -import { yargsCli } from '../yargs-cli'; -import { yargsUploadCommandObject } from './upload-command'; +import { DEFAULT_CLI_CONFIGURATION } from '../../../mocks/constants.js'; +import { yargsCli } from '../yargs-cli.js'; +import { yargsUploadCommandObject } from './upload-command.js'; vi.mock('@code-pushup/core', async () => { const { CORE_CONFIG_MOCK }: typeof import('@code-pushup/test-utils') = diff --git a/packages/cli/src/lib/yargs-cli.integration.test.ts b/packages/cli/src/lib/yargs-cli.integration.test.ts index e4ffbe931..4e99a2311 100644 --- a/packages/cli/src/lib/yargs-cli.integration.test.ts +++ b/packages/cli/src/lib/yargs-cli.integration.test.ts @@ -1,19 +1,19 @@ import { describe, expect, it } from 'vitest'; import type { CoreConfig, Format } from '@code-pushup/models'; -import { yargsHistoryOptionsDefinition } from './history/history.options'; -import type { CompareOptions } from './implementation/compare.model'; -import { yargsCompareOptionsDefinition } from './implementation/compare.options'; +import { yargsHistoryOptionsDefinition } from './history/history.options.js'; +import type { CompareOptions } from './implementation/compare.model.js'; +import { yargsCompareOptionsDefinition } from './implementation/compare.options.js'; import type { PersistConfigCliOptions, UploadConfigCliOptions, -} from './implementation/core-config.model'; -import type { FilterOptions } from './implementation/filter.model'; -import { yargsFilterOptionsDefinition } from './implementation/filter.options'; -import type { GeneralCliOptions } from './implementation/global.model'; -import type { MergeDiffsOptions } from './implementation/merge-diffs.model'; -import { yargsMergeDiffsOptionsDefinition } from './implementation/merge-diffs.options'; -import { options } from './options'; -import { yargsCli } from './yargs-cli'; +} from './implementation/core-config.model.js'; +import type { FilterOptions } from './implementation/filter.model.js'; +import { yargsFilterOptionsDefinition } from './implementation/filter.options.js'; +import type { GeneralCliOptions } from './implementation/global.model.js'; +import type { MergeDiffsOptions } from './implementation/merge-diffs.model.js'; +import { yargsMergeDiffsOptionsDefinition } from './implementation/merge-diffs.options.js'; +import { options } from './options.js'; +import { yargsCli } from './yargs-cli.js'; describe('yargsCli', () => { it('should provide correct default values for global options', async () => { diff --git a/packages/cli/src/lib/yargs-cli.ts b/packages/cli/src/lib/yargs-cli.ts index 92bee9aa5..989ca8d5d 100644 --- a/packages/cli/src/lib/yargs-cli.ts +++ b/packages/cli/src/lib/yargs-cli.ts @@ -1,5 +1,6 @@ /* eslint-disable max-lines-per-function */ import { blue, dim, green } from 'ansis'; +import { createRequire } from 'node:module'; import yargs, { type Argv, type CommandModule, @@ -9,15 +10,14 @@ import yargs, { } from 'yargs'; import { type PersistConfig, formatSchema } from '@code-pushup/models'; import { TERMINAL_WIDTH } from '@code-pushup/utils'; -import { version } from '../../package.json'; import { descriptionStyle, formatNestedValues, formatObjectValue, headerStyle, titleStyle, -} from './implementation/formatting'; -import { logErrorBeforeThrow } from './implementation/global.utils'; +} from './implementation/formatting.js'; +import { logErrorBeforeThrow } from './implementation/global.utils.js'; export const yargsDecorator = { 'Commands:': `${green('Commands')}:`, @@ -65,6 +65,10 @@ export function yargsCli( const examples = cfg.examples ?? []; const cli = yargs(argv); + const packageJson = createRequire(import.meta.url)( + '../../package.json', + ) as typeof import('../../package.json'); + // setup yargs cli .updateLocale(yargsDecorator) @@ -73,7 +77,7 @@ export function yargsCli( .help('help', descriptionStyle('Show help')) .alias('h', 'help') .showHelpOnFail(false) - .version('version', dim`Show version`, version) + .version('version', dim`Show version`, packageJson.version) .check(args => { const persist = args['persist'] as PersistConfig | undefined; return persist == null || validatePersistFormat(persist); diff --git a/packages/cli/vite.config.integration.ts b/packages/cli/vite.config.integration.ts index 6d633a928..f16f21744 100644 --- a/packages/cli/vite.config.integration.ts +++ b/packages/cli/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/cli', diff --git a/packages/cli/vite.config.unit.ts b/packages/cli/vite.config.unit.ts index eadf41526..8ce1638f4 100644 --- a/packages/cli/vite.config.unit.ts +++ b/packages/cli/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/cli', diff --git a/packages/core/.eslintrc.json b/packages/core/.eslintrc.json deleted file mode 100644 index 16cb0bd58..000000000 --- a/packages/core/.eslintrc.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["packages/core/tsconfig.*?.json"] - }, - "rules": {} - }, - { - "files": ["*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": "error" - } - } - ] -} diff --git a/packages/core/eslint.config.js b/packages/core/eslint.config.js new file mode 100644 index 000000000..40165321a --- /dev/null +++ b/packages/core/eslint.config.js @@ -0,0 +1,21 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config( + ...baseConfig, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': 'error', + }, + }, +); diff --git a/packages/core/package.json b/packages/core/package.json index 77de10f2c..13b13cd2c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@code-pushup/core", - "version": "0.55.0", + "version": "0.57.0", "license": "MIT", "description": "Core business logic for the used by the Code PushUp CLI", "homepage": "https://github.com/code-pushup/cli/tree/main/packages/core#readme", @@ -38,12 +38,11 @@ "access": "public" }, "type": "module", - "main": "./index.js", - "types": "./src/index.d.ts", "dependencies": { - "@code-pushup/models": "0.55.0", - "@code-pushup/utils": "0.55.0", - "ansis": "^3.3.0" + "@code-pushup/models": "0.57.0", + "@code-pushup/utils": "0.57.0", + "ansis": "^3.3.0", + "zod-validation-error": "^3.4.0" }, "peerDependencies": { "@code-pushup/portal-client": "^0.9.0" diff --git a/packages/core/project.json b/packages/core/project.json index d9b10a238..0236cb78e 100644 --- a/packages/core/project.json +++ b/packages/core/project.json @@ -5,14 +5,13 @@ "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/packages/core", "main": "packages/core/src/index.ts", "tsConfig": "packages/core/tsconfig.lib.json", - "assets": ["packages/core/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["packages/core/*.md"] } }, "lint": { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 3871141b7..0dc27e77e 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,30 +1,30 @@ export { type CollectAndPersistReportsOptions, collectAndPersistReports, -} from './lib/collect-and-persist'; -export { compareReportFiles, compareReports } from './lib/compare'; -export { type CollectOptions, collect } from './lib/implementation/collect'; -export type { ReportsToCompare } from './lib/implementation/compare-scorables'; +} from './lib/collect-and-persist.js'; +export { compareReportFiles, compareReports } from './lib/compare.js'; +export { type CollectOptions, collect } from './lib/implementation/collect.js'; +export type { ReportsToCompare } from './lib/implementation/compare-scorables.js'; export { PluginOutputMissingAuditError, executePlugin, executePlugins, -} from './lib/implementation/execute-plugin'; +} from './lib/implementation/execute-plugin.js'; export { PersistDirError, PersistError, persistReport, -} from './lib/implementation/persist'; +} from './lib/implementation/persist.js'; export { history, type HistoryOptions, type HistoryOnlyOptions, -} from './lib/history'; +} from './lib/history.js'; export { ConfigPathError, autoloadRc, readRcByPath, -} from './lib/implementation/read-rc-file'; -export type { GlobalOptions } from './lib/types'; -export { type UploadOptions, upload } from './lib/upload'; -export { mergeDiffs } from './lib/merge-diffs'; +} from './lib/implementation/read-rc-file.js'; +export type { GlobalOptions } from './lib/types.js'; +export { type UploadOptions, upload } from './lib/upload.js'; +export { mergeDiffs } from './lib/merge-diffs.js'; diff --git a/packages/core/src/lib/collect-and-persist.ts b/packages/core/src/lib/collect-and-persist.ts index 036479a72..21c379695 100644 --- a/packages/core/src/lib/collect-and-persist.ts +++ b/packages/core/src/lib/collect-and-persist.ts @@ -9,9 +9,12 @@ import { sortReport, verboseUtils, } from '@code-pushup/utils'; -import { collect } from './implementation/collect'; -import { logPersistedResults, persistReport } from './implementation/persist'; -import type { GlobalOptions } from './types'; +import { collect } from './implementation/collect.js'; +import { + logPersistedResults, + persistReport, +} from './implementation/persist.js'; +import type { GlobalOptions } from './types.js'; export type CollectAndPersistReportsOptions = Pick< CoreConfig, diff --git a/packages/core/src/lib/collect-and-persist.unit.test.ts b/packages/core/src/lib/collect-and-persist.unit.test.ts index e36529694..f9b6f8d22 100644 --- a/packages/core/src/lib/collect-and-persist.unit.test.ts +++ b/packages/core/src/lib/collect-and-persist.unit.test.ts @@ -16,9 +16,12 @@ import * as utils from '@code-pushup/utils'; import { type CollectAndPersistReportsOptions, collectAndPersistReports, -} from './collect-and-persist'; -import { collect } from './implementation/collect'; -import { logPersistedResults, persistReport } from './implementation/persist'; +} from './collect-and-persist.js'; +import { collect } from './implementation/collect.js'; +import { + logPersistedResults, + persistReport, +} from './implementation/persist.js'; vi.mock('./implementation/collect', () => ({ collect: vi.fn().mockResolvedValue(MINIMAL_REPORT_MOCK), diff --git a/packages/core/src/lib/compare.ts b/packages/core/src/lib/compare.ts index 40e9a89a7..c56ff63d8 100644 --- a/packages/core/src/lib/compare.ts +++ b/packages/core/src/lib/compare.ts @@ -1,5 +1,6 @@ import { writeFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import { createRequire } from 'node:module'; +import path from 'node:path'; import { type Format, type PersistConfig, @@ -17,14 +18,13 @@ import { scoreReport, ui, } from '@code-pushup/utils'; -import { name as packageName, version } from '../../package.json'; import { type ReportsToCompare, compareAudits, compareCategories, compareGroups, -} from './implementation/compare-scorables'; -import { loadPortalClient } from './load-portal-client'; +} from './implementation/compare-scorables.js'; +import { loadPortalClient } from './load-portal-client.js'; export async function compareReportFiles( inputPaths: Diff, @@ -58,7 +58,7 @@ export async function compareReportFiles( return Promise.all( format.map(async fmt => { - const outputPath = join(outputDir, `${filename}-diff.${fmt}`); + const outputPath = path.join(outputDir, `${filename}-diff.${fmt}`); const content = reportsDiffToFileContent(diff, fmt); await ensureDirectoryExists(outputDir); await writeFile(outputPath, content); @@ -87,13 +87,17 @@ export function compareReports(reports: Diff): ReportsDiff { const duration = calcDuration(start); + const packageJson = createRequire(import.meta.url)( + '../../package.json', + ) as typeof import('../../package.json'); + return { commits, categories, groups, audits, - packageName, - version, + packageName: packageJson.name, + version: packageJson.version, date, duration, }; diff --git a/packages/core/src/lib/compare.unit.test.ts b/packages/core/src/lib/compare.unit.test.ts index 277500665..d1ea58ddd 100644 --- a/packages/core/src/lib/compare.unit.test.ts +++ b/packages/core/src/lib/compare.unit.test.ts @@ -1,6 +1,6 @@ import { vol } from 'memfs'; import { readFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { getPortalComparisonLink } from '@code-pushup/portal-client'; import { type Commit, @@ -16,7 +16,7 @@ import { reportMock, } from '@code-pushup/test-utils'; import { type Diff, fileExists, readJsonFile } from '@code-pushup/utils'; -import { compareReportFiles, compareReports } from './compare'; +import { compareReportFiles, compareReports } from './compare.js'; describe('compareReportFiles', () => { const commitShas = { @@ -37,15 +37,15 @@ describe('compareReportFiles', () => { it('should create valid report-diff.json from report.json files', async () => { await compareReportFiles( { - before: join(MEMFS_VOLUME, 'source-report.json'), - after: join(MEMFS_VOLUME, 'target-report.json'), + before: path.join(MEMFS_VOLUME, 'source-report.json'), + after: path.join(MEMFS_VOLUME, 'target-report.json'), }, { outputDir: MEMFS_VOLUME, filename: 'report', format: ['json'] }, undefined, ); const reportsDiffPromise = readJsonFile( - join(MEMFS_VOLUME, 'report-diff.json'), + path.join(MEMFS_VOLUME, 'report-diff.json'), ); await expect(reportsDiffPromise).resolves.toBeTruthy(); @@ -56,26 +56,26 @@ describe('compareReportFiles', () => { it('should create all diff files specified by persist.format', async () => { await compareReportFiles( { - before: join(MEMFS_VOLUME, 'source-report.json'), - after: join(MEMFS_VOLUME, 'target-report.json'), + before: path.join(MEMFS_VOLUME, 'source-report.json'), + after: path.join(MEMFS_VOLUME, 'target-report.json'), }, { outputDir: MEMFS_VOLUME, filename: 'report', format: ['json', 'md'] }, undefined, ); await expect( - fileExists(join(MEMFS_VOLUME, 'report-diff.json')), + fileExists(path.join(MEMFS_VOLUME, 'report-diff.json')), ).resolves.toBeTruthy(); await expect( - fileExists(join(MEMFS_VOLUME, 'report-diff.md')), + fileExists(path.join(MEMFS_VOLUME, 'report-diff.md')), ).resolves.toBeTruthy(); }); it('should include portal link (fetched using upload config) in Markdown file', async () => { await compareReportFiles( { - before: join(MEMFS_VOLUME, 'source-report.json'), - after: join(MEMFS_VOLUME, 'target-report.json'), + before: path.join(MEMFS_VOLUME, 'source-report.json'), + after: path.join(MEMFS_VOLUME, 'target-report.json'), }, { outputDir: MEMFS_VOLUME, filename: 'report', format: ['json', 'md'] }, { @@ -87,7 +87,7 @@ describe('compareReportFiles', () => { ); await expect( - readFile(join(MEMFS_VOLUME, 'report-diff.md'), 'utf8'), + readFile(path.join(MEMFS_VOLUME, 'report-diff.md'), 'utf8'), ).resolves.toContain( `[🕵️ See full comparison in Code PushUp portal 🔍](https://code-pushup.example.com/portal/dunder-mifflin/website/comparison/${commitShas.before}/${commitShas.after})`, ); @@ -109,15 +109,15 @@ describe('compareReportFiles', () => { it('should not include portal link in Markdown if upload config is missing', async () => { await compareReportFiles( { - before: join(MEMFS_VOLUME, 'source-report.json'), - after: join(MEMFS_VOLUME, 'target-report.json'), + before: path.join(MEMFS_VOLUME, 'source-report.json'), + after: path.join(MEMFS_VOLUME, 'target-report.json'), }, { outputDir: MEMFS_VOLUME, filename: 'report', format: ['json', 'md'] }, undefined, ); await expect( - readFile(join(MEMFS_VOLUME, 'report-diff.md'), 'utf8'), + readFile(path.join(MEMFS_VOLUME, 'report-diff.md'), 'utf8'), ).resolves.not.toContain( '[🕵️ See full comparison in Code PushUp portal 🔍]', ); @@ -138,8 +138,8 @@ describe('compareReportFiles', () => { ); await compareReportFiles( { - before: join(MEMFS_VOLUME, 'source-report.json'), - after: join(MEMFS_VOLUME, 'target-report.json'), + before: path.join(MEMFS_VOLUME, 'source-report.json'), + after: path.join(MEMFS_VOLUME, 'target-report.json'), }, { outputDir: MEMFS_VOLUME, filename: 'report', format: ['json', 'md'] }, { @@ -151,7 +151,7 @@ describe('compareReportFiles', () => { ); await expect( - readFile(join(MEMFS_VOLUME, 'report-diff.md'), 'utf8'), + readFile(path.join(MEMFS_VOLUME, 'report-diff.md'), 'utf8'), ).resolves.not.toContain( '[🕵️ See full comparison in Code PushUp portal 🔍]', ); @@ -162,8 +162,8 @@ describe('compareReportFiles', () => { it('should include portal link in JSON file', async () => { await compareReportFiles( { - before: join(MEMFS_VOLUME, 'source-report.json'), - after: join(MEMFS_VOLUME, 'target-report.json'), + before: path.join(MEMFS_VOLUME, 'source-report.json'), + after: path.join(MEMFS_VOLUME, 'target-report.json'), }, { outputDir: MEMFS_VOLUME, filename: 'report', format: ['json', 'md'] }, { @@ -175,7 +175,7 @@ describe('compareReportFiles', () => { ); await expect( - readJsonFile(join(MEMFS_VOLUME, 'report-diff.json')), + readJsonFile(path.join(MEMFS_VOLUME, 'report-diff.json')), ).resolves.toEqual( expect.objectContaining({ portalUrl: `https://code-pushup.example.com/portal/dunder-mifflin/website/comparison/${commitShas.before}/${commitShas.after}`, @@ -186,8 +186,8 @@ describe('compareReportFiles', () => { it('should include label in JSON file', async () => { await compareReportFiles( { - before: join(MEMFS_VOLUME, 'source-report.json'), - after: join(MEMFS_VOLUME, 'target-report.json'), + before: path.join(MEMFS_VOLUME, 'source-report.json'), + after: path.join(MEMFS_VOLUME, 'target-report.json'), }, { outputDir: MEMFS_VOLUME, filename: 'report', format: ['json', 'md'] }, undefined, @@ -195,7 +195,7 @@ describe('compareReportFiles', () => { ); await expect( - readJsonFile(join(MEMFS_VOLUME, 'report-diff.json')), + readJsonFile(path.join(MEMFS_VOLUME, 'report-diff.json')), ).resolves.toEqual( expect.objectContaining({ label: 'backoffice', diff --git a/packages/core/src/lib/history.ts b/packages/core/src/lib/history.ts index 6761138f6..9f094bb71 100644 --- a/packages/core/src/lib/history.ts +++ b/packages/core/src/lib/history.ts @@ -4,9 +4,9 @@ import type { UploadConfig, } from '@code-pushup/models'; import { getCurrentBranchOrTag, safeCheckout, ui } from '@code-pushup/utils'; -import { collectAndPersistReports } from './collect-and-persist'; -import type { GlobalOptions } from './types'; -import { upload } from './upload'; +import { collectAndPersistReports } from './collect-and-persist.js'; +import type { GlobalOptions } from './types.js'; +import { upload } from './upload.js'; export type HistoryOnlyOptions = { targetBranch?: string; diff --git a/packages/core/src/lib/history.unit.test.ts b/packages/core/src/lib/history.unit.test.ts index 85cfbf5e1..787ef5a51 100644 --- a/packages/core/src/lib/history.unit.test.ts +++ b/packages/core/src/lib/history.unit.test.ts @@ -1,9 +1,9 @@ import { describe, expect, vi } from 'vitest'; import { MINIMAL_PLUGIN_CONFIG_MOCK } from '@code-pushup/test-utils'; import { getCurrentBranchOrTag, safeCheckout } from '@code-pushup/utils'; -import { collectAndPersistReports } from './collect-and-persist'; -import { type HistoryOptions, history } from './history'; -import { upload } from './upload'; +import { collectAndPersistReports } from './collect-and-persist.js'; +import { type HistoryOptions, history } from './history.js'; +import { upload } from './upload.js'; vi.mock('@code-pushup/utils', async () => { const utils: object = await vi.importActual('@code-pushup/utils'); @@ -31,6 +31,7 @@ describe('history', () => { }, plugins: [MINIMAL_PLUGIN_CONFIG_MOCK], }; + it('should check out all passed commits and reset to initial branch or tag', async () => { await history(historyBaseOptions, ['abc', 'def']); diff --git a/packages/core/src/lib/implementation/collect.integration.test.ts b/packages/core/src/lib/implementation/collect.integration.test.ts index 8de4662ae..ec2365aad 100644 --- a/packages/core/src/lib/implementation/collect.integration.test.ts +++ b/packages/core/src/lib/implementation/collect.integration.test.ts @@ -2,7 +2,7 @@ import { vol } from 'memfs'; import { describe, expect, it } from 'vitest'; import { commitSchema } from '@code-pushup/models'; import { MEMFS_VOLUME, MINIMAL_CONFIG_MOCK } from '@code-pushup/test-utils'; -import { collect } from './collect'; +import { collect } from './collect.js'; describe('collect', () => { it('should execute with valid options', async () => { diff --git a/packages/core/src/lib/implementation/collect.ts b/packages/core/src/lib/implementation/collect.ts index 783437a57..99cc47740 100644 --- a/packages/core/src/lib/implementation/collect.ts +++ b/packages/core/src/lib/implementation/collect.ts @@ -1,8 +1,8 @@ +import { createRequire } from 'node:module'; import type { CoreConfig, Report } from '@code-pushup/models'; import { calcDuration, getLatestCommit } from '@code-pushup/utils'; -import { name, version } from '../../../package.json'; -import type { GlobalOptions } from '../types'; -import { executePlugins } from './execute-plugin'; +import type { GlobalOptions } from '../types.js'; +import { executePlugins } from './execute-plugin.js'; export type CollectOptions = Pick & Partial; @@ -17,10 +17,13 @@ export async function collect(options: CollectOptions): Promise { const start = performance.now(); const commit = await getLatestCommit(); const pluginOutputs = await executePlugins(plugins, options); + const packageJson = createRequire(import.meta.url)( + '../../../package.json', + ) as typeof import('../../../package.json'); return { commit, - packageName: name, - version, + packageName: packageJson.name, + version: packageJson.version, date, duration: calcDuration(start), categories, diff --git a/packages/core/src/lib/implementation/compare-scorables.unit.test.ts b/packages/core/src/lib/implementation/compare-scorables.unit.test.ts index 8b5f5261a..535a28438 100644 --- a/packages/core/src/lib/implementation/compare-scorables.unit.test.ts +++ b/packages/core/src/lib/implementation/compare-scorables.unit.test.ts @@ -4,7 +4,7 @@ import { compareAudits, compareCategories, compareGroups, -} from './compare-scorables'; +} from './compare-scorables.js'; describe('compareCategories', () => { it('should match categories by slug and check for equal scores', () => { diff --git a/packages/core/src/lib/implementation/execute-plugin.ts b/packages/core/src/lib/implementation/execute-plugin.ts index 29d721600..2d558bb71 100644 --- a/packages/core/src/lib/implementation/execute-plugin.ts +++ b/packages/core/src/lib/implementation/execute-plugin.ts @@ -16,8 +16,8 @@ import { logMultipleResults, pluralizeToken, } from '@code-pushup/utils'; -import { normalizeAuditOutputs } from '../normalize'; -import { executeRunnerConfig, executeRunnerFunction } from './runner'; +import { normalizeAuditOutputs } from '../normalize.js'; +import { executeRunnerConfig, executeRunnerFunction } from './runner.js'; /** * Error thrown when plugin output is invalid. @@ -156,19 +156,15 @@ export async function executePlugins( const progressBar = progress ? getProgressBar('Run plugins') : null; - const pluginsResult = await plugins.reduce( - async (acc, pluginCfg) => [ - ...(await acc), - wrapProgress(pluginCfg, plugins.length, progressBar), - ], - Promise.resolve([] as Promise[]), + const pluginsResult = plugins.map(pluginCfg => + wrapProgress(pluginCfg, plugins.length, progressBar), ); - progressBar?.endProgress('Done running plugins'); - const errorsTransform = ({ reason }: PromiseRejectedResult) => String(reason); const results = await Promise.allSettled(pluginsResult); + progressBar?.endProgress('Done running plugins'); + logMultipleResults(results, 'Plugins', undefined, errorsTransform); const { fulfilled, rejected } = groupByStatus(results); diff --git a/packages/core/src/lib/implementation/execute-plugin.unit.test.ts b/packages/core/src/lib/implementation/execute-plugin.unit.test.ts index 43d3ff210..c74a9e509 100644 --- a/packages/core/src/lib/implementation/execute-plugin.unit.test.ts +++ b/packages/core/src/lib/implementation/execute-plugin.unit.test.ts @@ -10,7 +10,7 @@ import { PluginOutputMissingAuditError, executePlugin, executePlugins, -} from './execute-plugin'; +} from './execute-plugin.js'; describe('executePlugin', () => { it('should execute a valid plugin config', async () => { diff --git a/packages/core/src/lib/implementation/persist.ts b/packages/core/src/lib/implementation/persist.ts index 4a1a5ebdd..0d4c062c2 100644 --- a/packages/core/src/lib/implementation/persist.ts +++ b/packages/core/src/lib/implementation/persist.ts @@ -1,5 +1,5 @@ import { mkdir, stat, writeFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import type { PersistConfig, Report } from '@code-pushup/models'; import { type MultipleFileResults, @@ -58,7 +58,7 @@ export async function persistReport( return Promise.allSettled( results.map(result => persistResult( - join(outputDir, `${filename}.${result.format}`), + path.join(outputDir, `${filename}.${result.format}`), result.content, ), ), diff --git a/packages/core/src/lib/implementation/persist.unit.test.ts b/packages/core/src/lib/implementation/persist.unit.test.ts index 74f9c6b9f..d512a355a 100644 --- a/packages/core/src/lib/implementation/persist.unit.test.ts +++ b/packages/core/src/lib/implementation/persist.unit.test.ts @@ -1,6 +1,6 @@ import { vol } from 'memfs'; import { readFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { beforeEach, describe, expect, it } from 'vitest'; import type { Report } from '@code-pushup/models'; import { @@ -10,7 +10,7 @@ import { getLogMessages, } from '@code-pushup/test-utils'; import { scoreReport, sortReport, ui } from '@code-pushup/utils'; -import { logPersistedResults, persistReport } from './persist'; +import { logPersistedResults, persistReport } from './persist.js'; describe('persistReport', () => { beforeEach(() => { @@ -26,7 +26,7 @@ describe('persistReport', () => { }); const jsonReport: Report = JSON.parse( - await readFile(join(MEMFS_VOLUME, 'report.json'), 'utf8'), + await readFile(path.join(MEMFS_VOLUME, 'report.json'), 'utf8'), ); expect(jsonReport).toEqual( expect.objectContaining({ @@ -36,7 +36,7 @@ describe('persistReport', () => { ); await expect(() => - readFile(join(MEMFS_VOLUME, 'report.md')), + readFile(path.join(MEMFS_VOLUME, 'report.md')), ).rejects.toThrow('no such file or directory'); }); @@ -48,11 +48,14 @@ describe('persistReport', () => { format: ['md'], }); - const mdReport = await readFile(join(MEMFS_VOLUME, 'report.md'), 'utf8'); + const mdReport = await readFile( + path.join(MEMFS_VOLUME, 'report.md'), + 'utf8', + ); expect(mdReport).toContain('Code PushUp Report'); await expect(() => - readFile(join(MEMFS_VOLUME, 'report.json'), 'utf8'), + readFile(path.join(MEMFS_VOLUME, 'report.json'), 'utf8'), ).rejects.toThrow('no such file or directory'); }); @@ -64,14 +67,17 @@ describe('persistReport', () => { filename: 'report', }); - const mdReport = await readFile(join(MEMFS_VOLUME, 'report.md'), 'utf8'); + const mdReport = await readFile( + path.join(MEMFS_VOLUME, 'report.md'), + 'utf8', + ); expect(mdReport).toContain('Code PushUp Report'); expect(mdReport).toMatch( /\|\s*🏷 Category\s*\|\s*⭐ Score\s*\|\s*🛡 Audits\s*\|/, ); const jsonReport: Report = JSON.parse( - await readFile(join(MEMFS_VOLUME, 'report.json'), 'utf8'), + await readFile(path.join(MEMFS_VOLUME, 'report.json'), 'utf8'), ); expect(jsonReport).toEqual( expect.objectContaining({ diff --git a/packages/core/src/lib/implementation/read-rc-file.integration.test.ts b/packages/core/src/lib/implementation/read-rc-file.integration.test.ts index f3e470de8..78cf90400 100644 --- a/packages/core/src/lib/implementation/read-rc-file.integration.test.ts +++ b/packages/core/src/lib/implementation/read-rc-file.integration.test.ts @@ -1,11 +1,11 @@ -import { dirname, join } from 'node:path'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { describe, expect } from 'vitest'; -import { readRcByPath } from './read-rc-file'; +import { ConfigValidationError, readRcByPath } from './read-rc-file.js'; describe('readRcByPath', () => { - const configDirPath = join( - fileURLToPath(dirname(import.meta.url)), + const configDirPath = path.join( + fileURLToPath(path.dirname(import.meta.url)), '..', '..', '..', @@ -21,7 +21,7 @@ describe('readRcByPath', () => { it('should load the configuration', async () => { await expect( - readRcByPath(join(configDirPath, 'code-pushup.config.js')), + readRcByPath(path.join(configDirPath, 'code-pushup.config.js')), ).resolves.toEqual( expect.objectContaining({ upload: expect.objectContaining({ @@ -40,8 +40,8 @@ describe('readRcByPath', () => { it('should load the configuration using provided tsconfig', async () => { await expect( readRcByPath( - join(configDirPath, 'code-pushup.needs-tsconfig.config.ts'), - join(configDirPath, 'tsconfig.json'), + path.join(configDirPath, 'code-pushup.needs-tsconfig.config.ts'), + path.join(configDirPath, 'tsconfig.json'), ), ).resolves.toEqual({ plugins: [ @@ -62,19 +62,19 @@ describe('readRcByPath', () => { it('should throw if the file does not exist', async () => { await expect( - readRcByPath(join('non-existent', 'config.file.js')), + readRcByPath(path.join('non-existent', 'config.file.js')), ).rejects.toThrow(/Provided path .* is not valid./); }); it('should throw if the configuration is empty', async () => { await expect( - readRcByPath(join(configDirPath, 'code-pushup.empty.config.js')), - ).rejects.toThrow(`"code": "invalid_type",`); + readRcByPath(path.join(configDirPath, 'code-pushup.empty.config.js')), + ).rejects.toThrow(expect.any(ConfigValidationError)); }); it('should throw if the configuration is invalid', async () => { await expect( - readRcByPath(join(configDirPath, 'code-pushup.invalid.config.ts')), + readRcByPath(path.join(configDirPath, 'code-pushup.invalid.config.ts')), ).rejects.toThrow(/refs are duplicates/); }); }); diff --git a/packages/core/src/lib/implementation/read-rc-file.ts b/packages/core/src/lib/implementation/read-rc-file.ts index 093e44460..3b1572c4c 100644 --- a/packages/core/src/lib/implementation/read-rc-file.ts +++ b/packages/core/src/lib/implementation/read-rc-file.ts @@ -1,11 +1,17 @@ -import { join } from 'node:path'; +import { bold } from 'ansis'; +import path from 'node:path'; +import { fromError, isZodErrorLike } from 'zod-validation-error'; import { CONFIG_FILE_NAME, type CoreConfig, SUPPORTED_CONFIG_FILE_FORMATS, coreConfigSchema, } from '@code-pushup/models'; -import { fileExists, importModule } from '@code-pushup/utils'; +import { + fileExists, + importModule, + zodErrorMessageBuilder, +} from '@code-pushup/utils'; export class ConfigPathError extends Error { constructor(configPath: string) { @@ -13,6 +19,13 @@ export class ConfigPathError extends Error { } } +export class ConfigValidationError extends Error { + constructor(configPath: string, message: string) { + const relativePath = path.relative(process.cwd(), configPath); + super(`Failed parsing core config in ${bold(relativePath)}.\n\n${message}`); + } +} + export async function readRcByPath( filepath: string, tsconfig?: string, @@ -27,7 +40,16 @@ export async function readRcByPath( const cfg = await importModule({ filepath, tsconfig, format: 'esm' }); - return coreConfigSchema.parse(cfg); + try { + return coreConfigSchema.parse(cfg); + } catch (error) { + const validationError = fromError(error, { + messageBuilder: zodErrorMessageBuilder, + }); + throw isZodErrorLike(error) + ? new ConfigValidationError(filepath, validationError.message) + : error; + } } export async function autoloadRc(tsconfig?: string): Promise { @@ -35,8 +57,8 @@ export async function autoloadRc(tsconfig?: string): Promise { let ext = ''; // eslint-disable-next-line functional/no-loop-statements for (const extension of SUPPORTED_CONFIG_FILE_FORMATS) { - const path = `${CONFIG_FILE_NAME}.${extension}`; - const exists = await fileExists(path); + const filePath = `${CONFIG_FILE_NAME}.${extension}`; + const exists = await fileExists(filePath); if (exists) { ext = extension; @@ -53,7 +75,7 @@ export async function autoloadRc(tsconfig?: string): Promise { } return readRcByPath( - join(process.cwd(), `${CONFIG_FILE_NAME}.${ext}`), + path.join(process.cwd(), `${CONFIG_FILE_NAME}.${ext}`), tsconfig, ); } diff --git a/packages/core/src/lib/implementation/read-rc-file.unit.test.ts b/packages/core/src/lib/implementation/read-rc-file.unit.test.ts index 7e33f712b..d9c5e2001 100644 --- a/packages/core/src/lib/implementation/read-rc-file.unit.test.ts +++ b/packages/core/src/lib/implementation/read-rc-file.unit.test.ts @@ -2,7 +2,7 @@ import { vol } from 'memfs'; import { describe, expect, vi } from 'vitest'; import { CONFIG_FILE_NAME, type CoreConfig } from '@code-pushup/models'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; -import { autoloadRc } from './read-rc-file'; +import { autoloadRc } from './read-rc-file.js'; // mock bundleRequire inside importEsmModule used for fetching config vi.mock('bundle-require', async () => { diff --git a/packages/core/src/lib/implementation/report-to-gql.unit.test.ts b/packages/core/src/lib/implementation/report-to-gql.unit.test.ts index beef887f8..c8be3b007 100644 --- a/packages/core/src/lib/implementation/report-to-gql.unit.test.ts +++ b/packages/core/src/lib/implementation/report-to-gql.unit.test.ts @@ -1,5 +1,5 @@ import { describe } from 'vitest'; -import { issueToGQL, tableToGQL } from './report-to-gql'; +import { issueToGQL, tableToGQL } from './report-to-gql.js'; describe('issueToGQL', () => { it('transforms issue to GraphQL input type', () => { diff --git a/packages/core/src/lib/implementation/runner.ts b/packages/core/src/lib/implementation/runner.ts index 686b759a5..1cde8cae0 100644 --- a/packages/core/src/lib/implementation/runner.ts +++ b/packages/core/src/lib/implementation/runner.ts @@ -1,4 +1,4 @@ -import { join } from 'node:path'; +import path from 'node:path'; import type { OnProgress, RunnerConfig, @@ -26,7 +26,7 @@ export async function executeRunnerConfig( }); // read process output from file system and parse it - const outputs = await readJsonFile(join(process.cwd(), outputFile)); + const outputs = await readJsonFile(path.join(process.cwd(), outputFile)); // transform unknownAuditOutputs to auditOutputs const audits = outputTransform ? await outputTransform(outputs) : outputs; diff --git a/packages/core/src/lib/implementation/runner.unit.test.ts b/packages/core/src/lib/implementation/runner.unit.test.ts index 4e131c324..db012e761 100644 --- a/packages/core/src/lib/implementation/runner.unit.test.ts +++ b/packages/core/src/lib/implementation/runner.unit.test.ts @@ -10,7 +10,7 @@ import { type RunnerResult, executeRunnerConfig, executeRunnerFunction, -} from './runner'; +} from './runner.js'; describe('executeRunnerConfig', () => { beforeEach(() => { diff --git a/packages/core/src/lib/merge-diffs.ts b/packages/core/src/lib/merge-diffs.ts index 3a49344c2..6470c059c 100644 --- a/packages/core/src/lib/merge-diffs.ts +++ b/packages/core/src/lib/merge-diffs.ts @@ -1,5 +1,5 @@ import { writeFile } from 'node:fs/promises'; -import { basename, dirname, join } from 'node:path'; +import path from 'node:path'; import { type PersistConfig, reportsDiffSchema } from '@code-pushup/models'; import { ensureDirectoryExists, @@ -42,13 +42,13 @@ export async function mergeDiffs( const labeledDiffs = diffs.map(diff => ({ ...diff, - label: diff.label || basename(dirname(diff.file)), // fallback is parent folder name + label: diff.label || path.basename(path.dirname(diff.file)), // fallback is parent folder name })); const markdown = generateMdReportsDiffForMonorepo(labeledDiffs); const { outputDir, filename } = persistConfig; - const outputPath = join(outputDir, `${filename}-diff.md`); + const outputPath = path.join(outputDir, `${filename}-diff.md`); await ensureDirectoryExists(outputDir); await writeFile(outputPath, markdown); diff --git a/packages/core/src/lib/merge-diffs.unit.test.ts b/packages/core/src/lib/merge-diffs.unit.test.ts index 8c6f7c636..483f720c7 100644 --- a/packages/core/src/lib/merge-diffs.unit.test.ts +++ b/packages/core/src/lib/merge-diffs.unit.test.ts @@ -1,6 +1,6 @@ import { vol } from 'memfs'; import { readFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import type { PersistConfig } from '@code-pushup/models'; import { MEMFS_VOLUME, @@ -11,7 +11,7 @@ import { reportsDiffUnchangedMock, } from '@code-pushup/test-utils'; import { fileExists, ui } from '@code-pushup/utils'; -import { mergeDiffs } from './merge-diffs'; +import { mergeDiffs } from './merge-diffs.js'; describe('mergeDiffs', () => { const diffPaths = { @@ -34,7 +34,7 @@ describe('mergeDiffs', () => { it('should create Markdown file', async () => { const outputPath = await mergeDiffs(files, persistConfig); - expect(outputPath).toBe(join(MEMFS_VOLUME, 'report-diff.md')); + expect(outputPath).toBe(path.join(MEMFS_VOLUME, 'report-diff.md')); await expect(fileExists(outputPath)).resolves.toBe(true); await expect(readFile(outputPath, 'utf8')).resolves.toContain( '# Code PushUp', @@ -62,7 +62,7 @@ describe('mergeDiffs', () => { [...files, 'missing-report-diff.json', 'invalid-report-diff.json'], persistConfig, ), - ).resolves.toBe(join(MEMFS_VOLUME, 'report-diff.md')); + ).resolves.toBe(path.join(MEMFS_VOLUME, 'report-diff.md')); expect(getLogMessages(ui().logger)).toEqual([ expect.stringContaining( diff --git a/packages/core/src/lib/normalize.unit.test.ts b/packages/core/src/lib/normalize.unit.test.ts index 1913931b6..05333203d 100644 --- a/packages/core/src/lib/normalize.unit.test.ts +++ b/packages/core/src/lib/normalize.unit.test.ts @@ -1,7 +1,7 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { describe, expect } from 'vitest'; import type { AuditOutput, Issue } from '@code-pushup/models'; -import { normalizeAuditOutputs, normalizeIssue } from './normalize'; +import { normalizeAuditOutputs, normalizeIssue } from './normalize.js'; vi.mock('@code-pushup/utils', async () => { const actual = await vi.importActual('@code-pushup/utils'); @@ -56,10 +56,10 @@ describe('normalizeAuditOutputs', () => { }); it('should normalize audit details with issues that have a source specified', async () => { - const path = '/Users/user/Projects/myProject/utils/index.js'; + const file = '/Users/user/Projects/myProject/utils/index.js'; const issues = [ { source: undefined }, - { source: { file: path } }, + { source: { file } }, { source: undefined }, ] as Issue[]; await expect( @@ -84,11 +84,11 @@ describe('normalizeIssue', () => { message: 'file too big', severity: 'error', } as Issue; - expect(normalizeIssue(issue, join('User', 'code-pushup'))).toBe(issue); + expect(normalizeIssue(issue, path.join('User', 'code-pushup'))).toBe(issue); }); it('should normalize filepath in issue if source file is given', () => { - const path = '/myProject/utils/index.js'; + const file = '/myProject/utils/index.js'; const gitRoot = '/myProject'; expect( normalizeIssue( @@ -96,7 +96,7 @@ describe('normalizeIssue', () => { message: 'file too big', severity: 'error', source: { - file: path, + file, }, }, gitRoot, diff --git a/packages/core/src/lib/upload.ts b/packages/core/src/lib/upload.ts index 157e4c228..cda695a8d 100644 --- a/packages/core/src/lib/upload.ts +++ b/packages/core/src/lib/upload.ts @@ -1,9 +1,9 @@ import type { SaveReportMutationVariables } from '@code-pushup/portal-client'; import type { PersistConfig, Report, UploadConfig } from '@code-pushup/models'; import { loadReport } from '@code-pushup/utils'; -import { reportToGQL } from './implementation/report-to-gql'; -import { loadPortalClient } from './load-portal-client'; -import type { GlobalOptions } from './types'; +import { reportToGQL } from './implementation/report-to-gql.js'; +import { loadPortalClient } from './load-portal-client.js'; +import type { GlobalOptions } from './types.js'; export type UploadOptions = { upload?: UploadConfig } & { persist: Required; diff --git a/packages/core/src/lib/upload.unit.test.ts b/packages/core/src/lib/upload.unit.test.ts index 409c423dc..822950440 100644 --- a/packages/core/src/lib/upload.unit.test.ts +++ b/packages/core/src/lib/upload.unit.test.ts @@ -6,7 +6,7 @@ import { MEMFS_VOLUME, MINIMAL_REPORT_MOCK, } from '@code-pushup/test-utils'; -import { upload } from './upload'; +import { upload } from './upload.js'; describe('upload', () => { beforeEach(() => { diff --git a/packages/core/vite.config.integration.ts b/packages/core/vite.config.integration.ts index c65724a5a..80fba4a58 100644 --- a/packages/core/vite.config.integration.ts +++ b/packages/core/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/core', diff --git a/packages/core/vite.config.unit.ts b/packages/core/vite.config.unit.ts index 18b419e1a..ce56fb16c 100644 --- a/packages/core/vite.config.unit.ts +++ b/packages/core/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/core', diff --git a/packages/create-cli/.eslintrc.json b/packages/create-cli/.eslintrc.json deleted file mode 100644 index 3da6a1047..000000000 --- a/packages/create-cli/.eslintrc.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["packages/create-cli/tsconfig.*?.json"] - }, - "rules": {} - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": [ - "error", - { - "ignoredDependencies": ["@code-pushup/nx-plugin"] // nx-plugin is run via CLI - } - ] - } - } - ] -} diff --git a/packages/create-cli/eslint.config.js b/packages/create-cli/eslint.config.js new file mode 100644 index 000000000..22fda2e40 --- /dev/null +++ b/packages/create-cli/eslint.config.js @@ -0,0 +1,24 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config( + ...baseConfig, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': [ + 'error', + { ignoredDependencies: ['@code-pushup/nx-plugin'] }, // nx-plugin is run via CLI + ], + }, + }, +); diff --git a/packages/create-cli/package.json b/packages/create-cli/package.json index 6c87f1cdc..ed5702ae6 100644 --- a/packages/create-cli/package.json +++ b/packages/create-cli/package.json @@ -1,6 +1,6 @@ { "name": "@code-pushup/create-cli", - "version": "0.55.0", + "version": "0.57.0", "license": "MIT", "bin": "index.js", "homepage": "https://github.com/code-pushup/cli/tree/main/packages/create-cli#readme", @@ -25,10 +25,8 @@ "access": "public" }, "type": "module", - "main": "./index.js", - "types": "./src/index.d.ts", "dependencies": { - "@code-pushup/nx-plugin": "0.55.0", - "@code-pushup/utils": "0.55.0" + "@code-pushup/nx-plugin": "0.57.0", + "@code-pushup/utils": "0.57.0" } } diff --git a/packages/create-cli/project.json b/packages/create-cli/project.json index 3de664f25..52a213363 100644 --- a/packages/create-cli/project.json +++ b/packages/create-cli/project.json @@ -5,14 +5,13 @@ "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/packages/create-cli", "main": "packages/create-cli/src/index.ts", "tsConfig": "packages/create-cli/tsconfig.lib.json", - "assets": ["packages/create-cli/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["packages/create-cli/*.md"] } }, "lint": { @@ -39,7 +38,7 @@ }, "exec-node": { "dependsOn": ["build"], - "command": "node ./dist/packages/create-cli/index.js", + "command": "node ./dist/packages/create-cli/src/index.js", "options": {} }, "exec-npm": { diff --git a/packages/create-cli/src/index.ts b/packages/create-cli/src/index.ts index 456b4421d..221a00a2a 100755 --- a/packages/create-cli/src/index.ts +++ b/packages/create-cli/src/index.ts @@ -1,4 +1,4 @@ #! /usr/bin/env node -import { initCodePushup } from './lib/init'; +import { initCodePushup } from './lib/init.js'; await initCodePushup(); diff --git a/packages/create-cli/src/lib/init.ts b/packages/create-cli/src/lib/init.ts index f5f3fb9bd..5aba7c9bc 100644 --- a/packages/create-cli/src/lib/init.ts +++ b/packages/create-cli/src/lib/init.ts @@ -7,7 +7,7 @@ import { parseNxProcessOutput, setupNxContext, teardownNxContext, -} from './utils'; +} from './utils.js'; export function nxPluginGenerator( generator: 'init' | 'configuration', diff --git a/packages/create-cli/src/lib/init.unit.test.ts b/packages/create-cli/src/lib/init.unit.test.ts index 09073d610..e231b0dfb 100644 --- a/packages/create-cli/src/lib/init.unit.test.ts +++ b/packages/create-cli/src/lib/init.unit.test.ts @@ -3,8 +3,8 @@ import { afterEach, beforeEach, describe, expect } from 'vitest'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; import type { ProcessResult } from '@code-pushup/utils'; import * as utils from '@code-pushup/utils'; -import { initCodePushup, nxPluginGenerator } from './init'; -import * as createUtils from './utils'; +import { initCodePushup, nxPluginGenerator } from './init.js'; +import * as createUtils from './utils.js'; describe('nxPluginGenerator', () => { it('should create valid command', () => { diff --git a/packages/create-cli/src/lib/utils.ts b/packages/create-cli/src/lib/utils.ts index 4a8d3931d..19249661e 100644 --- a/packages/create-cli/src/lib/utils.ts +++ b/packages/create-cli/src/lib/utils.ts @@ -6,7 +6,7 @@ import { PROJECT_JSON_CONTENT, PROJECT_JSON_FILENAME, PROJECT_NAME, -} from './constants'; +} from './constants.js'; export type SetupResult = { filename: string; diff --git a/packages/create-cli/src/lib/utils.unit.test.ts b/packages/create-cli/src/lib/utils.unit.test.ts index ce61b9b85..f3c0ae24d 100644 --- a/packages/create-cli/src/lib/utils.unit.test.ts +++ b/packages/create-cli/src/lib/utils.unit.test.ts @@ -5,7 +5,7 @@ import { parseNxProcessOutput, setupNxContext, teardownNxContext, -} from './utils'; +} from './utils.js'; describe('parseNxProcessOutput', () => { it('should replace NX with <✓>', () => { diff --git a/packages/create-cli/vite.config.integration.ts b/packages/create-cli/vite.config.integration.ts index a33d66f8d..4669fb226 100644 --- a/packages/create-cli/vite.config.integration.ts +++ b/packages/create-cli/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/create-cli', diff --git a/packages/create-cli/vite.config.unit.ts b/packages/create-cli/vite.config.unit.ts index 6ceede6ef..b990c0c6f 100644 --- a/packages/create-cli/vite.config.unit.ts +++ b/packages/create-cli/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/create-cli', diff --git a/packages/models/.eslintrc.json b/packages/models/.eslintrc.json deleted file mode 100644 index 483be7f83..000000000 --- a/packages/models/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "**/tools/**/*.ts", "*.generated.ts"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["packages/models/tsconfig.*?.json"] - } - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": ["error"] - } - } - ] -} diff --git a/packages/models/eslint.config.js b/packages/models/eslint.config.js new file mode 100644 index 000000000..40165321a --- /dev/null +++ b/packages/models/eslint.config.js @@ -0,0 +1,21 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config( + ...baseConfig, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': 'error', + }, + }, +); diff --git a/packages/models/package.json b/packages/models/package.json index 5cc5e97ed..c9535825f 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -1,6 +1,6 @@ { "name": "@code-pushup/models", - "version": "0.55.0", + "version": "0.57.0", "license": "MIT", "description": "Model definitions and validators for the Code PushUp CLI", "homepage": "https://github.com/code-pushup/cli/tree/main/packages/models#readme", @@ -26,8 +26,6 @@ "access": "public" }, "type": "module", - "main": "./index.js", - "types": "./src/index.d.ts", "dependencies": { "zod": "^3.22.1", "vscode-material-icons": "^0.1.0" diff --git a/packages/models/project.json b/packages/models/project.json index b221be20d..dfeb3e2d2 100644 --- a/packages/models/project.json +++ b/packages/models/project.json @@ -5,14 +5,13 @@ "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/packages/models", "main": "packages/models/src/index.ts", "tsConfig": "packages/models/tsconfig.lib.json", - "assets": ["packages/models/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["packages/models/*.md"] } }, "lint": { diff --git a/packages/models/src/index.ts b/packages/models/src/index.ts index 7e901cb49..810d7ca7d 100644 --- a/packages/models/src/index.ts +++ b/packages/models/src/index.ts @@ -1,13 +1,13 @@ export { type TableCellValue, tableCellValueSchema, -} from './lib/implementation/schemas'; +} from './lib/implementation/schemas.js'; export { type SourceFileLocation, sourceFileLocationSchema, -} from './lib/source'; +} from './lib/source.js'; -export { type Audit, auditSchema } from './lib/audit'; +export { type Audit, auditSchema } from './lib/audit.js'; export { type AuditDetails, type AuditOutput, @@ -15,42 +15,42 @@ export { auditDetailsSchema, auditOutputSchema, auditOutputsSchema, -} from './lib/audit-output'; +} from './lib/audit-output.js'; export { type CategoryConfig, type CategoryRef, categoryConfigSchema, categoryRefSchema, -} from './lib/category-config'; -export { type Commit, commitSchema } from './lib/commit'; -export { type CoreConfig, coreConfigSchema } from './lib/core-config'; +} from './lib/category-config.js'; +export { type Commit, commitSchema } from './lib/commit.js'; +export { type CoreConfig, coreConfigSchema } from './lib/core-config.js'; export { type Group, type GroupRef, type GroupMeta, groupRefSchema, groupSchema, -} from './lib/group'; +} from './lib/group.js'; export { CONFIG_FILE_NAME, SUPPORTED_CONFIG_FILE_FORMATS, -} from './lib/implementation/configuration'; +} from './lib/implementation/configuration.js'; export { DEFAULT_PERSIST_FILENAME, DEFAULT_PERSIST_FORMAT, DEFAULT_PERSIST_OUTPUT_DIR, -} from './lib/implementation/constants'; +} from './lib/implementation/constants.js'; export { MAX_DESCRIPTION_LENGTH, MAX_ISSUE_MESSAGE_LENGTH, MAX_SLUG_LENGTH, MAX_TITLE_LENGTH, -} from './lib/implementation/limits'; +} from './lib/implementation/limits.js'; export { type MaterialIcon, materialIconSchema, -} from './lib/implementation/schemas'; -export { exists } from './lib/implementation/utils'; +} from './lib/implementation/schemas.js'; +export { exists } from './lib/implementation/utils.js'; export { type TableAlignment, tableAlignmentSchema, @@ -64,25 +64,25 @@ export { tableColumnObjectSchema, type Table, tableSchema, -} from './lib/table'; +} from './lib/table.js'; export { type Issue, type IssueSeverity, issueSchema, issueSeveritySchema, -} from './lib/issue'; +} from './lib/issue.js'; export { type Format, type PersistConfig, formatSchema, persistConfigSchema, -} from './lib/persist-config'; +} from './lib/persist-config.js'; export { type PluginConfig, type PluginMeta, pluginConfigSchema, pluginMetaSchema, -} from './lib/plugin-config'; +} from './lib/plugin-config.js'; export { type AuditReport, type PluginReport, @@ -90,7 +90,7 @@ export { auditReportSchema, pluginReportSchema, reportSchema, -} from './lib/report'; +} from './lib/report.js'; export { type AuditDiff, type AuditResult, @@ -106,7 +106,7 @@ export { groupDiffSchema, groupResultSchema, reportsDiffSchema, -} from './lib/reports-diff'; +} from './lib/reports-diff.js'; export { type OnProgress, type RunnerConfig, @@ -114,5 +114,5 @@ export { onProgressSchema, runnerConfigSchema, runnerFunctionSchema, -} from './lib/runner-config'; -export { type UploadConfig, uploadConfigSchema } from './lib/upload-config'; +} from './lib/runner-config.js'; +export { type UploadConfig, uploadConfigSchema } from './lib/upload-config.js'; diff --git a/packages/models/src/lib/audit-output.ts b/packages/models/src/lib/audit-output.ts index bfce9f68b..4f9c121dc 100644 --- a/packages/models/src/lib/audit-output.ts +++ b/packages/models/src/lib/audit-output.ts @@ -3,10 +3,10 @@ import { nonnegativeNumberSchema, scoreSchema, slugSchema, -} from './implementation/schemas'; -import { errorItems, hasDuplicateStrings } from './implementation/utils'; -import { issueSchema } from './issue'; -import { tableSchema } from './table'; +} from './implementation/schemas.js'; +import { errorItems, hasDuplicateStrings } from './implementation/utils.js'; +import { issueSchema } from './issue.js'; +import { tableSchema } from './table.js'; export const auditValueSchema = nonnegativeNumberSchema.describe('Raw numeric value'); diff --git a/packages/models/src/lib/audit-output.unit.test.ts b/packages/models/src/lib/audit-output.unit.test.ts index e3607b184..64160ceaa 100644 --- a/packages/models/src/lib/audit-output.unit.test.ts +++ b/packages/models/src/lib/audit-output.unit.test.ts @@ -4,7 +4,7 @@ import { type AuditOutputs, auditOutputSchema, auditOutputsSchema, -} from './audit-output'; +} from './audit-output.js'; describe('auditOutputSchema', () => { it('should accept a valid audit output without details', () => { diff --git a/packages/models/src/lib/audit.ts b/packages/models/src/lib/audit.ts index 2ef9074cb..3b45289a2 100644 --- a/packages/models/src/lib/audit.ts +++ b/packages/models/src/lib/audit.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { metaSchema, slugSchema } from './implementation/schemas'; -import { errorItems, hasDuplicateStrings } from './implementation/utils'; +import { metaSchema, slugSchema } from './implementation/schemas.js'; +import { errorItems, hasDuplicateStrings } from './implementation/utils.js'; export const auditSchema = z .object({ diff --git a/packages/models/src/lib/audit.unit.test.ts b/packages/models/src/lib/audit.unit.test.ts index dce022d80..0f789bafd 100644 --- a/packages/models/src/lib/audit.unit.test.ts +++ b/packages/models/src/lib/audit.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { type Audit, auditSchema, pluginAuditsSchema } from './audit'; +import { type Audit, auditSchema, pluginAuditsSchema } from './audit.js'; describe('auditSchema', () => { it('should accept a valid audit with all information', () => { diff --git a/packages/models/src/lib/category-config.ts b/packages/models/src/lib/category-config.ts index 8110b1db6..16dd04aa9 100644 --- a/packages/models/src/lib/category-config.ts +++ b/packages/models/src/lib/category-config.ts @@ -4,8 +4,8 @@ import { scorableSchema, slugSchema, weightedRefSchema, -} from './implementation/schemas'; -import { errorItems, hasDuplicateStrings } from './implementation/utils'; +} from './implementation/schemas.js'; +import { errorItems, hasDuplicateStrings } from './implementation/utils.js'; export const categoryRefSchema = weightedRefSchema( 'Weighted references to audits and/or groups for the category', diff --git a/packages/models/src/lib/category-config.unit.test.ts b/packages/models/src/lib/category-config.unit.test.ts index 6bf3f4b75..d234c8292 100644 --- a/packages/models/src/lib/category-config.unit.test.ts +++ b/packages/models/src/lib/category-config.unit.test.ts @@ -5,7 +5,7 @@ import { categoriesSchema, categoryConfigSchema, categoryRefSchema, -} from './category-config'; +} from './category-config.js'; describe('categoryRefSchema', () => { it('should accept a valid category reference audit', () => { @@ -129,7 +129,7 @@ describe('categoryConfigSchema', () => { title: 'This category is empty for now', refs: [], } satisfies CategoryConfig), - ).toThrow('In a category there has to be at least one ref'); + ).toThrow('In a category, there has to be at least one ref'); }); it('should throw for duplicate category references', () => { @@ -175,7 +175,9 @@ describe('categoryConfigSchema', () => { }, ], } satisfies CategoryConfig), - ).toThrow('In a category there has to be at least one ref with weight > 0'); + ).toThrow( + 'In a category, there has to be at least one ref with weight > 0. Affected refs: functional/immutable-data, lighthouse-experimental', + ); }); }); diff --git a/packages/models/src/lib/commit.unit.test.ts b/packages/models/src/lib/commit.unit.test.ts index 2d146caf7..f554eea9d 100644 --- a/packages/models/src/lib/commit.unit.test.ts +++ b/packages/models/src/lib/commit.unit.test.ts @@ -1,4 +1,4 @@ -import { type Commit, commitSchema } from './commit'; +import { type Commit, commitSchema } from './commit.js'; describe('commitSchema', () => { it('should accept valid git commit data', () => { diff --git a/packages/models/src/lib/core-config.ts b/packages/models/src/lib/core-config.ts index 711825841..4c5307557 100644 --- a/packages/models/src/lib/core-config.ts +++ b/packages/models/src/lib/core-config.ts @@ -1,12 +1,12 @@ import { z } from 'zod'; -import { categoriesSchema } from './category-config'; +import { categoriesSchema } from './category-config.js'; import { getMissingRefsForCategories, missingRefsForCategoriesErrorMsg, -} from './implementation/utils'; -import { persistConfigSchema } from './persist-config'; -import { pluginConfigSchema } from './plugin-config'; -import { uploadConfigSchema } from './upload-config'; +} from './implementation/utils.js'; +import { persistConfigSchema } from './persist-config.js'; +import { pluginConfigSchema } from './plugin-config.js'; +import { uploadConfigSchema } from './upload-config.js'; export const unrefinedCoreConfigSchema = z.object({ plugins: z @@ -37,7 +37,7 @@ export function refineCoreConfig(schema: typeof unrefinedCoreConfigSchema) { ({ categories, plugins }) => ({ message: missingRefsForCategoriesErrorMsg(categories, plugins), }), - ) as unknown as typeof unrefinedCoreConfigSchema; + ); } -export type CoreConfig = z.infer; +export type CoreConfig = z.infer; diff --git a/packages/models/src/lib/core-config.unit.test.ts b/packages/models/src/lib/core-config.unit.test.ts index 4e9cf8d56..65d2105d4 100644 --- a/packages/models/src/lib/core-config.unit.test.ts +++ b/packages/models/src/lib/core-config.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { type CoreConfig, coreConfigSchema } from './core-config'; +import { type CoreConfig, coreConfigSchema } from './core-config.js'; describe('coreConfigSchema', () => { it('should accept a valid core configuration with all entities', () => { diff --git a/packages/models/src/lib/group.ts b/packages/models/src/lib/group.ts index 90e3dedf9..31e795cd9 100644 --- a/packages/models/src/lib/group.ts +++ b/packages/models/src/lib/group.ts @@ -4,12 +4,12 @@ import { metaSchema, scorableSchema, weightedRefSchema, -} from './implementation/schemas'; +} from './implementation/schemas.js'; import { errorItems, exists, hasDuplicateStrings, -} from './implementation/utils'; +} from './implementation/utils.js'; export const groupRefSchema = weightedRefSchema( 'Weighted reference to a group', @@ -32,6 +32,7 @@ export const groupSchema = scorableSchema( getDuplicateRefsInGroups, duplicateRefsInGroupsErrorMsg, ).merge(groupMetaSchema); + export type Group = z.infer; export const groupsSchema = z diff --git a/packages/models/src/lib/group.unit.test.ts b/packages/models/src/lib/group.unit.test.ts index 97cef6cfa..e0f9b5149 100644 --- a/packages/models/src/lib/group.unit.test.ts +++ b/packages/models/src/lib/group.unit.test.ts @@ -5,7 +5,7 @@ import { groupRefSchema, groupSchema, groupsSchema, -} from './group'; +} from './group.js'; describe('groupRefSchema', () => { it('should accept a valid group reference', () => { @@ -69,7 +69,7 @@ describe('groupSchema', () => { title: 'Empty group', refs: [], } satisfies Group), - ).toThrow('In a category there has to be at least one ref'); + ).toThrow('In a category, there has to be at least one ref'); }); it('should throw for duplicate group references', () => { diff --git a/packages/models/src/lib/implementation/constants.ts b/packages/models/src/lib/implementation/constants.ts index a1cf97f07..6cdc05505 100644 --- a/packages/models/src/lib/implementation/constants.ts +++ b/packages/models/src/lib/implementation/constants.ts @@ -1,4 +1,4 @@ -import type { Format } from '../persist-config'; +import type { Format } from '../persist-config.js'; export const DEFAULT_PERSIST_OUTPUT_DIR = '.code-pushup'; export const DEFAULT_PERSIST_FILENAME = 'report'; diff --git a/packages/models/src/lib/implementation/schemas.ts b/packages/models/src/lib/implementation/schemas.ts index 161e67dfd..f68436687 100644 --- a/packages/models/src/lib/implementation/schemas.ts +++ b/packages/models/src/lib/implementation/schemas.ts @@ -4,8 +4,8 @@ import { MAX_DESCRIPTION_LENGTH, MAX_SLUG_LENGTH, MAX_TITLE_LENGTH, -} from './limits'; -import { filenameRegex, slugRegex } from './utils'; +} from './limits.js'; +import { filenameRegex, slugRegex } from './utils.js'; export const tableCellValueSchema = z .union([z.string(), z.number(), z.boolean(), z.null()]) @@ -38,7 +38,7 @@ export const slugSchema = z 'The slug has to follow the pattern [0-9a-z] followed by multiple optional groups of -[0-9a-z]. e.g. my-slug', }) .max(MAX_SLUG_LENGTH, { - message: `slug can be max ${MAX_SLUG_LENGTH} characters long`, + message: `The slug can be max ${MAX_SLUG_LENGTH} characters long`, }); /** Schema for a general description property */ @@ -105,7 +105,7 @@ export function metaSchema(options?: { export const filePathSchema = z .string() .trim() - .min(1, { message: 'path is invalid' }); + .min(1, { message: 'The path is invalid' }); /** Schema for a fileNameSchema */ export const fileNameSchema = z @@ -114,7 +114,7 @@ export const fileNameSchema = z .regex(filenameRegex, { message: `The filename has to be valid`, }) - .min(1, { message: 'file name is invalid' }); + .min(1, { message: 'The file name is invalid' }); /** Schema for a positiveInt */ export const positiveIntSchema = z.number().int().positive(); @@ -172,7 +172,7 @@ export function scorableSchema>( slug: slugSchema.describe('Human-readable unique ID, e.g. "performance"'), refs: z .array(refSchema) - .min(1) + .min(1, { message: 'In a category, there has to be at least one ref' }) // refs are unique .refine( refs => !duplicateCheckFn(refs), @@ -180,11 +180,13 @@ export function scorableSchema>( message: duplicateMessageFn(refs), }), ) - // categories weights are correct - .refine(hasNonZeroWeightedRef, () => ({ - message: - 'In a category there has to be at least one ref with weight > 0', - })), + // category weights are correct + .refine(hasNonZeroWeightedRef, refs => { + const affectedRefs = refs.map(ref => ref.slug).join(', '); + return { + message: `In a category, there has to be at least one ref with weight > 0. Affected refs: ${affectedRefs}`, + }; + }), }, { description }, ); diff --git a/packages/models/src/lib/implementation/schemas.unit.test.ts b/packages/models/src/lib/implementation/schemas.unit.test.ts index b0e221781..82ed37143 100644 --- a/packages/models/src/lib/implementation/schemas.unit.test.ts +++ b/packages/models/src/lib/implementation/schemas.unit.test.ts @@ -3,7 +3,7 @@ import { type TableCellValue, tableCellValueSchema, weightSchema, -} from './schemas'; +} from './schemas.js'; describe('primitiveValueSchema', () => { it('should accept a valid union', () => { diff --git a/packages/models/src/lib/implementation/utils.ts b/packages/models/src/lib/implementation/utils.ts index f99a4d593..2bd6142e9 100644 --- a/packages/models/src/lib/implementation/utils.ts +++ b/packages/models/src/lib/implementation/utils.ts @@ -1,6 +1,6 @@ -import type { CategoryConfig } from '../category-config'; -import type { PluginConfig } from '../plugin-config'; -import type { PluginReport } from '../report'; +import type { CategoryConfig } from '../category-config.js'; +import type { PluginConfig } from '../plugin-config.js'; +import type { PluginReport } from '../report.js'; /** * Regular expression to validate a slug for categories, plugins and audits. diff --git a/packages/models/src/lib/implementation/utils.unit.test.ts b/packages/models/src/lib/implementation/utils.unit.test.ts index 04456499c..345a5cd36 100644 --- a/packages/models/src/lib/implementation/utils.unit.test.ts +++ b/packages/models/src/lib/implementation/utils.unit.test.ts @@ -4,7 +4,7 @@ import { hasDuplicateStrings, hasMissingStrings, slugRegex, -} from './utils'; +} from './utils.js'; describe('slugRegex', () => { it.each([ diff --git a/packages/models/src/lib/issue.ts b/packages/models/src/lib/issue.ts index fd3d4dd39..c7184f140 100644 --- a/packages/models/src/lib/issue.ts +++ b/packages/models/src/lib/issue.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { MAX_ISSUE_MESSAGE_LENGTH } from './implementation/limits'; -import { sourceFileLocationSchema } from './source'; +import { MAX_ISSUE_MESSAGE_LENGTH } from './implementation/limits.js'; +import { sourceFileLocationSchema } from './source.js'; export const issueSeveritySchema = z.enum(['info', 'warning', 'error'], { description: 'Severity level', diff --git a/packages/models/src/lib/issue.unit.test.ts b/packages/models/src/lib/issue.unit.test.ts index 1fc76c775..0ffcf9683 100644 --- a/packages/models/src/lib/issue.unit.test.ts +++ b/packages/models/src/lib/issue.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { type Issue, issueSchema } from './issue'; +import { type Issue, issueSchema } from './issue.js'; describe('issueSchema', () => { it('should accept a valid issue without source file information', () => { diff --git a/packages/models/src/lib/persist-config.ts b/packages/models/src/lib/persist-config.ts index 7f8dcf7e1..b349343ff 100644 --- a/packages/models/src/lib/persist-config.ts +++ b/packages/models/src/lib/persist-config.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { fileNameSchema, filePathSchema } from './implementation/schemas'; +import { fileNameSchema, filePathSchema } from './implementation/schemas.js'; export const formatSchema = z.enum(['json', 'md']); export type Format = z.infer; diff --git a/packages/models/src/lib/persist-config.unit.test.ts b/packages/models/src/lib/persist-config.unit.test.ts index b298232ba..9693217bc 100644 --- a/packages/models/src/lib/persist-config.unit.test.ts +++ b/packages/models/src/lib/persist-config.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { type PersistConfig, persistConfigSchema } from './persist-config'; +import { type PersistConfig, persistConfigSchema } from './persist-config.js'; describe('persistConfigSchema', () => { it('should accept a valid configuration with all information', () => { diff --git a/packages/models/src/lib/plugin-config.ts b/packages/models/src/lib/plugin-config.ts index 0cf97706c..962dd819c 100644 --- a/packages/models/src/lib/plugin-config.ts +++ b/packages/models/src/lib/plugin-config.ts @@ -1,14 +1,14 @@ import { z } from 'zod'; -import { pluginAuditsSchema } from './audit'; -import { groupsSchema } from './group'; +import { pluginAuditsSchema } from './audit.js'; +import { groupsSchema } from './group.js'; import { materialIconSchema, metaSchema, packageVersionSchema, slugSchema, -} from './implementation/schemas'; -import { errorItems, hasMissingStrings } from './implementation/utils'; -import { runnerConfigSchema, runnerFunctionSchema } from './runner-config'; +} from './implementation/schemas.js'; +import { errorItems, hasMissingStrings } from './implementation/utils.js'; +import { runnerConfigSchema, runnerFunctionSchema } from './runner-config.js'; export const pluginMetaSchema = packageVersionSchema() .merge( diff --git a/packages/models/src/lib/plugin-config.unit.test.ts b/packages/models/src/lib/plugin-config.unit.test.ts index cfc78bf84..56c0ddec5 100644 --- a/packages/models/src/lib/plugin-config.unit.test.ts +++ b/packages/models/src/lib/plugin-config.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { type PluginConfig, pluginConfigSchema } from './plugin-config'; +import { type PluginConfig, pluginConfigSchema } from './plugin-config.js'; describe('pluginConfigSchema', () => { it('should accept a valid plugin configuration with all entities', () => { diff --git a/packages/models/src/lib/report.ts b/packages/models/src/lib/report.ts index ea3b11c88..72da71453 100644 --- a/packages/models/src/lib/report.ts +++ b/packages/models/src/lib/report.ts @@ -1,20 +1,20 @@ import { z } from 'zod'; -import { auditSchema } from './audit'; -import { auditOutputSchema } from './audit-output'; -import { categoryConfigSchema } from './category-config'; -import { commitSchema } from './commit'; -import { type Group, groupSchema } from './group'; +import { auditOutputSchema } from './audit-output.js'; +import { auditSchema } from './audit.js'; +import { categoryConfigSchema } from './category-config.js'; +import { commitSchema } from './commit.js'; +import { type Group, groupSchema } from './group.js'; import { executionMetaSchema, packageVersionSchema, -} from './implementation/schemas'; +} from './implementation/schemas.js'; import { errorItems, getMissingRefsForCategories, hasMissingStrings, missingRefsForCategoriesErrorMsg, -} from './implementation/utils'; -import { pluginMetaSchema } from './plugin-config'; +} from './implementation/utils.js'; +import { pluginMetaSchema } from './plugin-config.js'; export const auditReportSchema = auditSchema.merge(auditOutputSchema); export type AuditReport = z.infer; diff --git a/packages/models/src/lib/report.unit.test.ts b/packages/models/src/lib/report.unit.test.ts index 63a5d18ba..900532aad 100644 --- a/packages/models/src/lib/report.unit.test.ts +++ b/packages/models/src/lib/report.unit.test.ts @@ -6,7 +6,7 @@ import { auditReportSchema, pluginReportSchema, reportSchema, -} from './report'; +} from './report.js'; describe('auditReportSchema', () => { it('should accept a valid audit report with all entities', () => { diff --git a/packages/models/src/lib/reports-diff.ts b/packages/models/src/lib/reports-diff.ts index 0f38a5b61..b02f61264 100644 --- a/packages/models/src/lib/reports-diff.ts +++ b/packages/models/src/lib/reports-diff.ts @@ -3,8 +3,8 @@ import { auditDisplayValueSchema, auditOutputSchema, auditValueSchema, -} from './audit-output'; -import { commitSchema } from './commit'; +} from './audit-output.js'; +import { commitSchema } from './commit.js'; import { docsUrlSchema, executionMetaSchema, @@ -13,8 +13,8 @@ import { slugSchema, titleSchema, urlSchema, -} from './implementation/schemas'; -import { pluginMetaSchema } from './plugin-config'; +} from './implementation/schemas.js'; +import { pluginMetaSchema } from './plugin-config.js'; function makeComparisonSchema(schema: T) { const sharedDescription = schema.description || 'Result'; diff --git a/packages/models/src/lib/reports-diff.unit.test.ts b/packages/models/src/lib/reports-diff.unit.test.ts index 0f8197d69..e65d4fb89 100644 --- a/packages/models/src/lib/reports-diff.unit.test.ts +++ b/packages/models/src/lib/reports-diff.unit.test.ts @@ -1,4 +1,4 @@ -import { type ReportsDiff, reportsDiffSchema } from './reports-diff'; +import { type ReportsDiff, reportsDiffSchema } from './reports-diff.js'; describe('reportsDiffSchema', () => { it('should parse valid reports diff', () => { diff --git a/packages/models/src/lib/runner-config.ts b/packages/models/src/lib/runner-config.ts index 302ffe56c..6c5239841 100644 --- a/packages/models/src/lib/runner-config.ts +++ b/packages/models/src/lib/runner-config.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { auditOutputsSchema } from './audit-output'; -import { filePathSchema } from './implementation/schemas'; +import { auditOutputsSchema } from './audit-output.js'; +import { filePathSchema } from './implementation/schemas.js'; export const outputTransformSchema = z .function() diff --git a/packages/models/src/lib/runner-config.unit.test.ts b/packages/models/src/lib/runner-config.unit.test.ts index 640f74a42..0be4b3406 100644 --- a/packages/models/src/lib/runner-config.unit.test.ts +++ b/packages/models/src/lib/runner-config.unit.test.ts @@ -6,7 +6,7 @@ import { outputTransformSchema, runnerConfigSchema, runnerFunctionSchema, -} from './runner-config'; +} from './runner-config.js'; describe('runnerConfigSchema', () => { it('should accept a valid runner configuration', () => { diff --git a/packages/models/src/lib/source.ts b/packages/models/src/lib/source.ts index 2319c29de..f1e55f2fb 100644 --- a/packages/models/src/lib/source.ts +++ b/packages/models/src/lib/source.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { filePathSchema, positiveIntSchema } from './implementation/schemas'; +import { filePathSchema, positiveIntSchema } from './implementation/schemas.js'; export const sourceFileLocationSchema = z.object( { diff --git a/packages/models/src/lib/table.ts b/packages/models/src/lib/table.ts index ff166e2c0..53d7cd1e4 100644 --- a/packages/models/src/lib/table.ts +++ b/packages/models/src/lib/table.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { tableCellValueSchema } from './implementation/schemas'; +import { tableCellValueSchema } from './implementation/schemas.js'; export const tableAlignmentSchema = z.enum(['left', 'center', 'right'], { description: 'Cell alignment', diff --git a/packages/models/src/lib/table.unit.test.ts b/packages/models/src/lib/table.unit.test.ts index 273ac59d2..1e49a40d6 100644 --- a/packages/models/src/lib/table.unit.test.ts +++ b/packages/models/src/lib/table.unit.test.ts @@ -12,7 +12,7 @@ import { tableRowObjectSchema, tableRowPrimitiveSchema, tableSchema, -} from './table'; +} from './table.js'; describe('tableAlignmentSchema', () => { it('should accept a valid enum', () => { diff --git a/packages/models/src/lib/upload-config.ts b/packages/models/src/lib/upload-config.ts index 3fee5517b..cc36ac0d6 100644 --- a/packages/models/src/lib/upload-config.ts +++ b/packages/models/src/lib/upload-config.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { slugSchema, urlSchema } from './implementation/schemas'; +import { slugSchema, urlSchema } from './implementation/schemas.js'; export const uploadConfigSchema = z.object({ server: urlSchema.describe('URL of deployed portal API'), diff --git a/packages/models/src/lib/upload-config.unit.test.ts b/packages/models/src/lib/upload-config.unit.test.ts index 664becfdd..422ea67ac 100644 --- a/packages/models/src/lib/upload-config.unit.test.ts +++ b/packages/models/src/lib/upload-config.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { type UploadConfig, uploadConfigSchema } from './upload-config'; +import { type UploadConfig, uploadConfigSchema } from './upload-config.js'; describe('uploadConfigSchema', () => { it('should accept a valid upload configuration', () => { diff --git a/packages/models/vite.config.integration.ts b/packages/models/vite.config.integration.ts index 4be0b9a21..3026d7fe7 100644 --- a/packages/models/vite.config.integration.ts +++ b/packages/models/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/models', diff --git a/packages/models/vite.config.unit.ts b/packages/models/vite.config.unit.ts index f32af1892..386a073db 100644 --- a/packages/models/vite.config.unit.ts +++ b/packages/models/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/models', diff --git a/packages/nx-plugin/.env.lint.local b/packages/nx-plugin/.env.lint.local new file mode 100644 index 000000000..ae6151bc4 --- /dev/null +++ b/packages/nx-plugin/.env.lint.local @@ -0,0 +1 @@ +NODE_OPTIONS=--experimental-require-module \ No newline at end of file diff --git a/packages/nx-plugin/.eslintrc.json b/packages/nx-plugin/.eslintrc.json deleted file mode 100644 index 62dd27af8..000000000 --- a/packages/nx-plugin/.eslintrc.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["packages/nx-plugin/tsconfig.*?.json"] - }, - "rules": { - // Nx plugins don't yet support ESM: https://github.com/nrwl/nx/issues/15682 - "unicorn/prefer-module": "off", - // used instead of verbatimModuleSyntax tsconfig flag (requires ESM) - "@typescript-eslint/consistent-type-imports": [ - "warn", - { - "fixStyle": "inline-type-imports", - "disallowTypeAnnotations": false - } - ], - "@typescript-eslint/consistent-type-exports": [ - "warn", - { "fixMixedExportsWithInlineTypeSpecifier": true } - ] - } - }, - { - "files": ["*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": "error" - } - }, - { - "files": ["./package.json", "./generators.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/nx-plugin-checks": "error" - } - } - ] -} diff --git a/packages/nx-plugin/eslint.config.cjs b/packages/nx-plugin/eslint.config.cjs new file mode 100644 index 000000000..e732748e6 --- /dev/null +++ b/packages/nx-plugin/eslint.config.cjs @@ -0,0 +1,51 @@ +const tseslint = require('typescript-eslint'); +const baseConfig = require('../../eslint.config.js').default; + +module.exports = tseslint.config( + ...baseConfig, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: __dirname, + }, + }, + }, + { + files: ['**/*.ts'], + rules: { + // Nx plugins don't yet support ESM: https://github.com/nrwl/nx/issues/15682 + 'unicorn/prefer-module': 'off', + // used instead of verbatimModuleSyntax tsconfig flag (requires ESM) + '@typescript-eslint/consistent-type-imports': [ + 'warn', + { + fixStyle: 'inline-type-imports', + disallowTypeAnnotations: false, + }, + ], + '@typescript-eslint/consistent-type-exports': [ + 'warn', + { fixMixedExportsWithInlineTypeSpecifier: true }, + ], + // `import path from 'node:path'` incompatible with CJS runtime, prefer `import * as path from 'node:path'` + 'unicorn/import-style': [ + 'warn', + { styles: { 'node:path': { namespace: true } } }, + ], + }, + }, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': 'error', + }, + }, + { + files: ['**/package.json', '**/generators.json'], + rules: { + '@nx/nx-plugin-checks': 'error', + }, + }, +); diff --git a/packages/nx-plugin/mock/utils/executor.ts b/packages/nx-plugin/mock/utils/executor.ts index cdc7b9cec..8ca06fd8c 100644 --- a/packages/nx-plugin/mock/utils/executor.ts +++ b/packages/nx-plugin/mock/utils/executor.ts @@ -1,4 +1,4 @@ -import type { NormalizedExecutorContext } from '../../src/executors/internal/context'; +import type { NormalizedExecutorContext } from '../../src/executors/internal/context.js'; export function normalizedExecutorContext( nameOrOpt: string | { projectName: string }, diff --git a/packages/nx-plugin/package.json b/packages/nx-plugin/package.json index 822b4fa42..0271f9baa 100644 --- a/packages/nx-plugin/package.json +++ b/packages/nx-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@code-pushup/nx-plugin", - "version": "0.55.0", + "version": "0.57.0", "license": "MIT", "description": "Nx plugin to integrate the Code PushUp CLI into your workspace 🛠️", "publishConfig": { @@ -32,11 +32,10 @@ "generators": "./generators.json", "executors": "./executors.json", "dependencies": { - "@nx/devkit": "^17.1.3", - "tslib": "^2.6.2", - "nx": "^17.1.3", - "@code-pushup/models": "0.55.0", - "zod": "^3.22.4", - "@code-pushup/utils": "0.55.0" + "@code-pushup/models": "0.57.0", + "@code-pushup/utils": "0.57.0", + "@nx/devkit": "^17.0.0 || ^18.0.0 || ^19.0.0", + "nx": "^17.0.0 || ^18.0.0 || ^19.0.0", + "zod": "^3.22.4" } } diff --git a/packages/nx-plugin/src/executors/cli/executor.integration.test.ts b/packages/nx-plugin/src/executors/cli/executor.integration.test.ts index 51dcd037a..a68c9d78f 100644 --- a/packages/nx-plugin/src/executors/cli/executor.integration.test.ts +++ b/packages/nx-plugin/src/executors/cli/executor.integration.test.ts @@ -1,15 +1,13 @@ -// eslint-disable-next-line n/no-sync import { execSync } from 'node:child_process'; import { afterEach, expect, vi } from 'vitest'; import { executorContext } from '@code-pushup/test-nx-utils'; -import runAutorunExecutor from './executor'; -import * as utils from './utils'; +import runAutorunExecutor from './executor.js'; +import * as utils from './utils.js'; vi.mock('node:child_process', async () => { const actual = await vi.importActual('node:child_process'); return { ...actual, - // eslint-disable-next-line n/no-sync execSync: vi.fn(), }; }); @@ -19,9 +17,11 @@ describe('runAutorunExecutor', () => { utils, 'parseAutorunExecutorOptions', ); + afterEach(() => { parseAutorunExecutorOptionsSpy.mockReset(); }); + it('should normalize context, parse CLI options and execute command', async () => { const output = await runAutorunExecutor( { verbose: true }, diff --git a/packages/nx-plugin/src/executors/cli/executor.ts b/packages/nx-plugin/src/executors/cli/executor.ts index 223d6baa4..76d88e21b 100644 --- a/packages/nx-plugin/src/executors/cli/executor.ts +++ b/packages/nx-plugin/src/executors/cli/executor.ts @@ -1,10 +1,9 @@ import { type ExecutorContext, logger } from '@nx/devkit'; -// eslint-disable-next-line n/no-sync import { execSync } from 'node:child_process'; -import { createCliCommand } from '../internal/cli'; -import { normalizeContext } from '../internal/context'; -import type { AutorunCommandExecutorOptions } from './schema'; -import { parseAutorunExecutorOptions } from './utils'; +import { createCliCommand } from '../internal/cli.js'; +import { normalizeContext } from '../internal/context.js'; +import type { AutorunCommandExecutorOptions } from './schema.js'; +import { parseAutorunExecutorOptions } from './utils.js'; export type ExecutorOutput = { success: boolean; diff --git a/packages/nx-plugin/src/executors/cli/executor.unit.test.ts b/packages/nx-plugin/src/executors/cli/executor.unit.test.ts index f19386933..e538a470c 100644 --- a/packages/nx-plugin/src/executors/cli/executor.unit.test.ts +++ b/packages/nx-plugin/src/executors/cli/executor.unit.test.ts @@ -1,16 +1,14 @@ import { logger } from '@nx/devkit'; -// eslint-disable-next-line n/no-sync import { execSync } from 'node:child_process'; import { afterEach, beforeEach, expect, vi } from 'vitest'; import { executorContext } from '@code-pushup/test-nx-utils'; -import runAutorunExecutor from './executor'; +import runAutorunExecutor from './executor.js'; vi.mock('node:child_process', async () => { const actual = await vi.importActual('node:child_process'); return { ...actual, - // eslint-disable-next-line n/no-sync execSync: vi.fn((command: string) => { if (command.includes('THROW_ERROR')) { throw new Error(command); @@ -27,6 +25,7 @@ describe('runAutorunExecutor', () => { beforeEach(() => { envSpy.mockReturnValue({}); }); + afterEach(() => { loggerWarnSpy.mockReset(); loggerInfoSpy.mockReset(); diff --git a/packages/nx-plugin/src/executors/cli/schema.ts b/packages/nx-plugin/src/executors/cli/schema.ts index d610483cb..d73a394b6 100644 --- a/packages/nx-plugin/src/executors/cli/schema.ts +++ b/packages/nx-plugin/src/executors/cli/schema.ts @@ -4,7 +4,7 @@ import type { GeneralExecutorOnlyOptions, GlobalExecutorOptions, ProjectExecutorOnlyOptions, -} from '../internal/types'; +} from '../internal/types.js'; export type AutorunCommandExecutorOnlyOptions = ProjectExecutorOnlyOptions & CollectExecutorOnlyOptions & diff --git a/packages/nx-plugin/src/executors/cli/utils.integration.test.ts b/packages/nx-plugin/src/executors/cli/utils.integration.test.ts index d15f9961d..180f22af1 100644 --- a/packages/nx-plugin/src/executors/cli/utils.integration.test.ts +++ b/packages/nx-plugin/src/executors/cli/utils.integration.test.ts @@ -1,8 +1,8 @@ import { expect, vi } from 'vitest'; import type { UploadConfig } from '@code-pushup/models'; -import { normalizedExecutorContext } from '../../../mock/utils/executor'; -import * as config from '../internal/config'; -import { parseAutorunExecutorOptions } from './utils'; +import { normalizedExecutorContext } from '../../../mock/utils/executor.js'; +import * as config from '../internal/config.js'; +import { parseAutorunExecutorOptions } from './utils.js'; describe('parseAutorunExecutorOptions', () => { const persistConfigSpy = vi.spyOn(config, 'persistConfig'); diff --git a/packages/nx-plugin/src/executors/cli/utils.ts b/packages/nx-plugin/src/executors/cli/utils.ts index 15a0266b7..d4f01b2d4 100644 --- a/packages/nx-plugin/src/executors/cli/utils.ts +++ b/packages/nx-plugin/src/executors/cli/utils.ts @@ -1,9 +1,13 @@ -import { globalConfig, persistConfig, uploadConfig } from '../internal/config'; -import type { NormalizedExecutorContext } from '../internal/context'; +import { + globalConfig, + persistConfig, + uploadConfig, +} from '../internal/config.js'; +import type { NormalizedExecutorContext } from '../internal/context.js'; import type { AutorunCommandExecutorOnlyOptions, AutorunCommandExecutorOptions, -} from './schema'; +} from './schema.js'; export function parseAutorunExecutorOnlyOptions( options: Partial, diff --git a/packages/nx-plugin/src/executors/cli/utils.unit.test.ts b/packages/nx-plugin/src/executors/cli/utils.unit.test.ts index 00dfab75c..a3ccf7628 100644 --- a/packages/nx-plugin/src/executors/cli/utils.unit.test.ts +++ b/packages/nx-plugin/src/executors/cli/utils.unit.test.ts @@ -1,10 +1,10 @@ import { type MockInstance, expect, vi } from 'vitest'; import { osAgnosticPath } from '@code-pushup/test-utils'; -import type { Command } from '../internal/types'; +import type { Command } from '../internal/types.js'; import { parseAutorunExecutorOnlyOptions, parseAutorunExecutorOptions, -} from './utils'; +} from './utils.js'; describe('parseAutorunExecutorOnlyOptions', () => { it('should provide NO default projectPrefix', () => { @@ -46,6 +46,7 @@ describe('parseAutorunExecutorOnlyOptions', () => { describe('parseAutorunExecutorOptions', () => { let processEnvSpy: MockInstance<[], NodeJS.ProcessEnv>; + beforeAll(() => { processEnvSpy = vi.spyOn(process, 'env', 'get').mockReturnValue({}); }); diff --git a/packages/nx-plugin/src/executors/internal/cli.ts b/packages/nx-plugin/src/executors/internal/cli.ts index 82e3153d5..b733eec84 100644 --- a/packages/nx-plugin/src/executors/internal/cli.ts +++ b/packages/nx-plugin/src/executors/internal/cli.ts @@ -12,11 +12,10 @@ export function createCliCommand(options?: { type ArgumentValue = number | string | boolean | string[]; export type CliArgsObject> = T extends never - ? // eslint-disable-next-line @typescript-eslint/naming-convention - Record | { _: string } + ? Record | { _: string } : T; + // @TODO import from @code-pushup/utils => get rid of poppins for cjs support -// eslint-disable-next-line sonarjs/cognitive-complexity export function objectToCliArgs< T extends object = Record, >(params?: CliArgsObject): string[] { @@ -24,11 +23,9 @@ export function objectToCliArgs< return []; } - // eslint-disable-next-line @typescript-eslint/no-unsafe-return return Object.entries(params).flatMap(([key, value]) => { // process/file/script if (key === '_') { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return return (Array.isArray(value) ? value : [`${value}`]).filter( v => v != null, ); diff --git a/packages/nx-plugin/src/executors/internal/cli.unit.test.ts b/packages/nx-plugin/src/executors/internal/cli.unit.test.ts index ab39b876b..e65cb0ec0 100644 --- a/packages/nx-plugin/src/executors/internal/cli.unit.test.ts +++ b/packages/nx-plugin/src/executors/internal/cli.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { createCliCommand, objectToCliArgs } from './cli'; +import { createCliCommand, objectToCliArgs } from './cli.js'; describe('objectToCliArgs', () => { it('should empty params', () => { diff --git a/packages/nx-plugin/src/executors/internal/config.integration.test.ts b/packages/nx-plugin/src/executors/internal/config.integration.test.ts index e8e128e3c..54b2e32dc 100644 --- a/packages/nx-plugin/src/executors/internal/config.integration.test.ts +++ b/packages/nx-plugin/src/executors/internal/config.integration.test.ts @@ -1,7 +1,7 @@ import { describe, expect } from 'vitest'; -import { ENV } from '../../../mock/fixtures/env'; -import { uploadConfig } from './config'; -import * as env from './env'; +import { ENV } from '../../../mock/fixtures/env.js'; +import { uploadConfig } from './config.js'; +import * as env from './env.js'; describe('uploadConfig', () => { const processEnvSpy = vi.spyOn(process, 'env', 'get').mockReturnValue({}); diff --git a/packages/nx-plugin/src/executors/internal/config.ts b/packages/nx-plugin/src/executors/internal/config.ts index f8437f613..0eb13f8a8 100644 --- a/packages/nx-plugin/src/executors/internal/config.ts +++ b/packages/nx-plugin/src/executors/internal/config.ts @@ -1,11 +1,11 @@ -import { join } from 'node:path'; +import * as path from 'node:path'; import type { PersistConfig, UploadConfig } from '@code-pushup/models'; -import { parseEnv } from './env'; +import { parseEnv } from './env.js'; import type { BaseNormalizedExecutorContext, GlobalExecutorOptions, ProjectExecutorOnlyOptions, -} from './types'; +} from './types.js'; export function globalConfig( options: Partial>, @@ -18,7 +18,7 @@ export function globalConfig( return { verbose: !!verbose, progress: !!progress, - config: config ?? join(projectRoot, 'code-pushup.config.ts'), + config: config ?? path.join(projectRoot, 'code-pushup.config.ts'), }; } @@ -31,7 +31,7 @@ export function persistConfig( const { name: projectName = '' } = projectConfig ?? {}; const { format, - outputDir = join(workspaceRoot, '.code-pushup', projectName), // always in /.code-pushup/, + outputDir = path.join(workspaceRoot, '.code-pushup', projectName), // always in /.code-pushup/, filename, } = options; diff --git a/packages/nx-plugin/src/executors/internal/config.unit.test.ts b/packages/nx-plugin/src/executors/internal/config.unit.test.ts index f446212fc..c38554459 100644 --- a/packages/nx-plugin/src/executors/internal/config.unit.test.ts +++ b/packages/nx-plugin/src/executors/internal/config.unit.test.ts @@ -1,7 +1,7 @@ import { type MockInstance, describe, expect } from 'vitest'; import { osAgnosticPath } from '@code-pushup/test-utils'; -import { ENV } from '../../../mock/fixtures/env'; -import { globalConfig, persistConfig, uploadConfig } from './config'; +import { ENV } from '../../../mock/fixtures/env.js'; +import { globalConfig, persistConfig, uploadConfig } from './config.js'; describe('globalConfig', () => { it('should provide default global verbose options', () => { @@ -253,9 +253,11 @@ describe('uploadConfig', () => { }; let processEnvSpy: MockInstance<[], NodeJS.ProcessEnv>; + beforeAll(() => { processEnvSpy = vi.spyOn(process, 'env', 'get').mockReturnValue({}); }); + afterAll(() => { processEnvSpy.mockRestore(); }); diff --git a/packages/nx-plugin/src/executors/internal/context.ts b/packages/nx-plugin/src/executors/internal/context.ts index 33fd4ca14..38ca33416 100644 --- a/packages/nx-plugin/src/executors/internal/context.ts +++ b/packages/nx-plugin/src/executors/internal/context.ts @@ -1,5 +1,5 @@ import type { ExecutorContext } from 'nx/src/config/misc-interfaces'; -import type { BaseNormalizedExecutorContext } from './types'; +import type { BaseNormalizedExecutorContext } from './types.js'; export type NormalizedExecutorContext = BaseNormalizedExecutorContext & { projectName: string; diff --git a/packages/nx-plugin/src/executors/internal/context.unit.test.ts b/packages/nx-plugin/src/executors/internal/context.unit.test.ts index 04acb3db7..9be17d2a9 100644 --- a/packages/nx-plugin/src/executors/internal/context.unit.test.ts +++ b/packages/nx-plugin/src/executors/internal/context.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { normalizeContext } from './context'; +import { normalizeContext } from './context.js'; describe('normalizeContext', () => { it('should normalizeContext', () => { @@ -9,7 +9,7 @@ describe('normalizeContext', () => { cwd: 'string', projectsConfigurations: { projects: { - ['my-app']: { + 'my-app': { root: './my-app', }, }, diff --git a/packages/nx-plugin/src/executors/internal/env.ts b/packages/nx-plugin/src/executors/internal/env.ts index bdc2c3e0f..16806a09e 100644 --- a/packages/nx-plugin/src/executors/internal/env.ts +++ b/packages/nx-plugin/src/executors/internal/env.ts @@ -16,7 +16,6 @@ type UploadEnvVars = z.infer; export function parseEnv(env: unknown = {}): Partial { const upload: UploadEnvVars = envSchema.parse(env); - // eslint-disable-next-line @typescript-eslint/no-unsafe-return return Object.fromEntries( Object.entries(upload).map(([envKey, value]) => { switch (envKey) { diff --git a/packages/nx-plugin/src/executors/internal/env.unit.test.ts b/packages/nx-plugin/src/executors/internal/env.unit.test.ts index eca10b8c5..548ef1e3b 100644 --- a/packages/nx-plugin/src/executors/internal/env.unit.test.ts +++ b/packages/nx-plugin/src/executors/internal/env.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect } from 'vitest'; -import { parseEnv } from './env'; +import { parseEnv } from './env.js'; describe('parseEnv', () => { it('should parse empty env vars', () => { diff --git a/packages/nx-plugin/src/generators/configuration/code-pushup-config.integration.test.ts b/packages/nx-plugin/src/generators/configuration/code-pushup-config.integration.test.ts index e41cb45c8..38238ff50 100644 --- a/packages/nx-plugin/src/generators/configuration/code-pushup-config.integration.test.ts +++ b/packages/nx-plugin/src/generators/configuration/code-pushup-config.integration.test.ts @@ -1,14 +1,14 @@ import * as devKit from '@nx/devkit'; import { formatFiles } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import { join } from 'node:path'; +import * as path from 'node:path'; import { describe, expect, it } from 'vitest'; -import { generateCodePushupConfig } from './code-pushup-config'; +import { generateCodePushupConfig } from './code-pushup-config.js'; describe('generateCodePushupConfig options', () => { let tree: devKit.Tree; const project = 'test-app'; - const projectRoot = join('libs', project); + const projectRoot = path.join('libs', project); beforeEach(() => { tree = createTreeWithEmptyWorkspace(); @@ -37,9 +37,9 @@ describe('generateCodePushupConfig options', () => { }); await formatFiles(tree); - // eslint-disable-next-line @typescript-eslint/no-floating-promises + expect( - tree.read(join(projectRoot, 'code-pushup.config.ts'))?.toString(), + tree.read(path.join(projectRoot, 'code-pushup.config.ts'))?.toString(), ).toMatchFileSnapshot('__snapshots__/root-code-pushup.config.ts'); }); }); diff --git a/packages/nx-plugin/src/generators/configuration/code-pushup-config.ts b/packages/nx-plugin/src/generators/configuration/code-pushup-config.ts index b11aac7c9..6854797fb 100644 --- a/packages/nx-plugin/src/generators/configuration/code-pushup-config.ts +++ b/packages/nx-plugin/src/generators/configuration/code-pushup-config.ts @@ -1,15 +1,14 @@ import { type Tree, generateFiles, logger } from '@nx/devkit'; -import { join } from 'node:path'; +import * as path from 'node:path'; import type { PersistConfig, UploadConfig } from '@code-pushup/models'; import type { ItemOrArray } from '@code-pushup/utils'; -import type { ExecutableCode } from './types'; +import type { ExecutableCode } from './types.js'; import { - formatArrayToJSArray, formatArrayToLinesOfJsString, formatObjectToFormattedJsString, normalizeExecutableCode, normalizeItemOrArray, -} from './utils'; +} from './utils.js'; export const DEFAULT_IMPORTS = [ "import type { CoreConfig } from '@code-pushup/models';", @@ -30,7 +29,7 @@ export function generateCodePushupConfig( ) { const supportedFormats = ['ts', 'mjs', 'js']; const firstExistingFormat = supportedFormats.find(ext => - tree.exists(join(root, `code-pushup.config.${ext}`)), + tree.exists(path.join(root, `code-pushup.config.${ext}`)), ); if (firstExistingFormat) { logger.warn( @@ -53,19 +52,15 @@ export function generateCodePushupConfig( ...(categories ?? []).flatMap(({ fileImports }) => fileImports), ]; - generateFiles(tree, join(__dirname, 'files'), root, { + generateFiles(tree, path.join(__dirname, 'files'), root, { ...options, fileImports: formatArrayToLinesOfJsString(configFileImports), persist: formatObjectToFormattedJsString(persist), upload: formatObjectToFormattedJsString(upload), - plugins: formatArrayToJSArray( - plugins.flatMap(({ codeStrings }) => codeStrings), - ), + plugins: `[${plugins.map(({ codeStrings }) => codeStrings).join(',')}]`, categories: categories && - formatArrayToJSArray( - categories.flatMap(({ codeStrings }) => codeStrings), - ), + `[${categories.map(({ codeStrings }) => codeStrings).join(',')}]`, }); } } diff --git a/packages/nx-plugin/src/generators/configuration/code-pushup-config.unit.test.ts b/packages/nx-plugin/src/generators/configuration/code-pushup-config.unit.test.ts index 787a3acdf..4cd74d681 100644 --- a/packages/nx-plugin/src/generators/configuration/code-pushup-config.unit.test.ts +++ b/packages/nx-plugin/src/generators/configuration/code-pushup-config.unit.test.ts @@ -1,18 +1,18 @@ import * as devKit from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import { join } from 'node:path'; +import * as path from 'node:path'; import { afterEach, describe, expect, it } from 'vitest'; import { removeColorCodes } from '@code-pushup/test-utils'; import { DEFAULT_IMPORTS, generateCodePushupConfig, -} from './code-pushup-config'; +} from './code-pushup-config.js'; import { formatArrayToJSArray, formatArrayToLinesOfJsString, formatObjectToFormattedJsString, normalizeExecutableCode, -} from './utils'; +} from './utils.js'; describe('generateCodePushupConfig options', () => { let tree: devKit.Tree; @@ -74,7 +74,7 @@ describe('generateCodePushupConfig options', () => { }); it('should skip creation if config already exists', () => { - tree.write(join(testProjectName, 'code-pushup.config.js'), ''); + tree.write(path.join(testProjectName, 'code-pushup.config.js'), ''); generateCodePushupConfig(tree, testProjectName); expect(generateFilesSpy).toHaveBeenCalledTimes(0); expect(loggerWarnSpy).toHaveBeenCalledTimes(1); @@ -90,7 +90,7 @@ describe('generateCodePushupConfig options', () => { expect(generateFilesSpy).toHaveBeenCalledWith( expect.anything(), expect.stringContaining( - join('nx-plugin', 'src', 'generators', 'configuration', 'files'), + path.join('nx-plugin', 'src', 'generators', 'configuration', 'files'), ), expect.any(String), expect.any(Object), @@ -126,7 +126,7 @@ describe('generateCodePushupConfig options', () => { it('should use fileImports options', () => { generateCodePushupConfig(tree, testProjectName, { fileImports: [ - "import type { CoreConfig } from '../../dist/packages/models';", + "import type { CoreConfig } from '../../dist/packages/models.js';", ], }); expect(generateFilesSpy).toHaveBeenCalledWith( @@ -135,7 +135,7 @@ describe('generateCodePushupConfig options', () => { expect.any(String), expect.objectContaining({ fileImports: formatArrayToLinesOfJsString([ - 'import type { CoreConfig } from "../../dist/packages/models";', + 'import type { CoreConfig } from "../../dist/packages/models.js";', ]), }), ); @@ -168,8 +168,8 @@ describe('generateCodePushupConfig options', () => { upload: { organization: 'code-pushup', project: 'cli', - server: 'https://code-pushup.dev/portal', - apiKey: '12345678', + server: 'https://api.staging.code-pushup.dev/graphql', + apiKey: 'cp_12345678', }, }); expect(generateFilesSpy).toHaveBeenCalledWith( @@ -180,8 +180,8 @@ describe('generateCodePushupConfig options', () => { upload: formatObjectToFormattedJsString({ organization: 'code-pushup', project: 'cli', - server: 'https://code-pushup.dev/portal', - apiKey: '12345678', + server: 'https://api.staging.code-pushup.dev/graphql', + apiKey: 'cp_12345678', }), }), ); diff --git a/packages/nx-plugin/src/generators/configuration/generator.integration.test.ts b/packages/nx-plugin/src/generators/configuration/generator.integration.test.ts index 1191c8993..c98d60064 100644 --- a/packages/nx-plugin/src/generators/configuration/generator.integration.test.ts +++ b/packages/nx-plugin/src/generators/configuration/generator.integration.test.ts @@ -5,10 +5,10 @@ import { readProjectConfiguration, } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import { join } from 'node:path'; +import * as path from 'node:path'; import { afterEach, describe, expect, it, vi } from 'vitest'; -import { DEFAULT_TARGET_NAME, PACKAGE_NAME } from '../../internal/constants'; -import { addTargetToProject, configurationGenerator } from './generator'; +import { DEFAULT_TARGET_NAME, PACKAGE_NAME } from '../../internal/constants.js'; +import { addTargetToProject, configurationGenerator } from './generator.js'; describe('addTargetToProject', () => { let tree: Tree; @@ -20,6 +20,7 @@ describe('addTargetToProject', () => { root: 'test-app', }); }); + afterEach(() => { //reset tree tree.delete(testProjectName); @@ -115,7 +116,7 @@ describe('configurationGenerator', () => { readProjectConfiguration(tree, testProjectName); expect( - tree.read(join('libs', testProjectName, 'code-pushup.config.ts')), + tree.read(path.join('libs', testProjectName, 'code-pushup.config.ts')), ).toBeNull(); expect(loggerInfoSpy).toHaveBeenCalledWith('Skip config file creation'); }); diff --git a/packages/nx-plugin/src/generators/configuration/generator.ts b/packages/nx-plugin/src/generators/configuration/generator.ts index dc0d49913..4b71b60a2 100644 --- a/packages/nx-plugin/src/generators/configuration/generator.ts +++ b/packages/nx-plugin/src/generators/configuration/generator.ts @@ -6,9 +6,9 @@ import { updateProjectConfiguration, } from '@nx/devkit'; import type { ProjectConfiguration } from 'nx/src/config/workspace-json-project-json'; -import { DEFAULT_TARGET_NAME, PACKAGE_NAME } from '../../internal/constants'; -import { generateCodePushupConfig } from './code-pushup-config'; -import type { ConfigurationGeneratorOptions } from './schema'; +import { DEFAULT_TARGET_NAME, PACKAGE_NAME } from '../../internal/constants.js'; +import { generateCodePushupConfig } from './code-pushup-config.js'; +import type { ConfigurationGeneratorOptions } from './schema.js'; export async function configurationGenerator( tree: Tree, diff --git a/packages/nx-plugin/src/generators/configuration/schema.d.ts b/packages/nx-plugin/src/generators/configuration/schema.d.ts index d7b700308..b105270c6 100644 --- a/packages/nx-plugin/src/generators/configuration/schema.d.ts +++ b/packages/nx-plugin/src/generators/configuration/schema.d.ts @@ -1,4 +1,4 @@ -import type { DynamicTargetOptions } from '../../internal/types'; +import type { DynamicTargetOptions } from '../../internal/types.js'; export type ConfigurationGeneratorOptions = { project: string; diff --git a/packages/nx-plugin/src/generators/configuration/utils.ts b/packages/nx-plugin/src/generators/configuration/utils.ts index 4dc8d5200..36464358a 100644 --- a/packages/nx-plugin/src/generators/configuration/utils.ts +++ b/packages/nx-plugin/src/generators/configuration/utils.ts @@ -1,5 +1,5 @@ import type { ExtractArrays } from '@code-pushup/utils'; -import type { ExecutableCode } from './types'; +import type { ExecutableCode } from './types.js'; export function normalizeExecutableCode( executableCode: ExecutableCode, @@ -32,7 +32,7 @@ export function formatObjectToFormattedJsString( | { [key: string]: unknown; } - | Array, + | unknown[], ): string | undefined { if (!jsonObj) { return; diff --git a/packages/nx-plugin/src/generators/configuration/utils.unit.test.ts b/packages/nx-plugin/src/generators/configuration/utils.unit.test.ts index eada369b6..3a140c8ff 100644 --- a/packages/nx-plugin/src/generators/configuration/utils.unit.test.ts +++ b/packages/nx-plugin/src/generators/configuration/utils.unit.test.ts @@ -4,7 +4,7 @@ import { formatArrayToLinesOfJsString, normalizeExecutableCode, normalizeItemOrArray, -} from './utils'; +} from './utils.js'; describe('formatArrayToJSArray', () => { it('should return array as JS', () => { diff --git a/packages/nx-plugin/src/generators/init/generator.integration.test.ts b/packages/nx-plugin/src/generators/init/generator.integration.test.ts index 05fe14511..5ab890bd1 100644 --- a/packages/nx-plugin/src/generators/init/generator.integration.test.ts +++ b/packages/nx-plugin/src/generators/init/generator.integration.test.ts @@ -1,7 +1,7 @@ import { type Tree, logger, readJson, readNxJson } from '@nx/devkit'; import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; import { describe, expect, it, vi } from 'vitest'; -import { initGenerator } from './generator'; +import { initGenerator } from './generator.js'; type PackageJson = { devDependencies: Record; diff --git a/packages/nx-plugin/src/generators/init/generator.ts b/packages/nx-plugin/src/generators/init/generator.ts index 12f058751..265298fb0 100644 --- a/packages/nx-plugin/src/generators/init/generator.ts +++ b/packages/nx-plugin/src/generators/init/generator.ts @@ -12,14 +12,14 @@ import { updateNxJson, } from '@nx/devkit'; import type { PackageJson } from 'nx/src/utils/package-json'; -import { PACKAGE_NAME } from '../../internal/constants'; +import { PACKAGE_NAME } from '../../internal/constants.js'; import { cpCliVersion, cpModelVersion, cpNxPluginVersion, cpUtilsVersion, -} from '../../internal/versions'; -import type { InitGeneratorSchema } from './schema'; +} from '../../internal/versions.js'; +import type { InitGeneratorSchema } from './schema.js'; function checkDependenciesInstalled(host: Tree) { const packageJson = readJson(host, 'package.json'); diff --git a/packages/nx-plugin/src/index.ts b/packages/nx-plugin/src/index.ts index 6e50b1f9c..b2e406cb7 100644 --- a/packages/nx-plugin/src/index.ts +++ b/packages/nx-plugin/src/index.ts @@ -1,14 +1,17 @@ -import { createNodes } from './plugin'; +import { createNodes } from './plugin/index.js'; // default export for nx.json#plugins export default createNodes; -export * from './internal/versions'; -export { type InitGeneratorSchema } from './generators/init/schema'; -export { initGenerator, initSchematic } from './generators/init/generator'; -export type { ConfigurationGeneratorOptions } from './generators/configuration/schema'; -export { configurationGenerator } from './generators/configuration/generator'; -export { generateCodePushupConfig } from './generators/configuration/code-pushup-config'; -export { createNodes } from './plugin'; -export { executeProcess, type ProcessConfig } from './internal/execute-process'; -export { objectToCliArgs } from './executors/internal/cli'; +export * from './internal/versions.js'; +export { type InitGeneratorSchema } from './generators/init/schema.js'; +export { initGenerator, initSchematic } from './generators/init/generator.js'; +export type { ConfigurationGeneratorOptions } from './generators/configuration/schema.js'; +export { configurationGenerator } from './generators/configuration/generator.js'; +export { generateCodePushupConfig } from './generators/configuration/code-pushup-config.js'; +export { createNodes } from './plugin/index.js'; +export { + executeProcess, + type ProcessConfig, +} from './internal/execute-process.js'; +export { objectToCliArgs } from './executors/internal/cli.js'; diff --git a/packages/nx-plugin/src/internal/execute-process.unit.test.ts b/packages/nx-plugin/src/internal/execute-process.unit.test.ts index 58555a7ee..5893b867f 100644 --- a/packages/nx-plugin/src/internal/execute-process.unit.test.ts +++ b/packages/nx-plugin/src/internal/execute-process.unit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from 'vitest'; import { getAsyncProcessRunnerConfig } from '@code-pushup/test-utils'; -import { type ProcessObserver, executeProcess } from './execute-process'; +import { type ProcessObserver, executeProcess } from './execute-process.js'; describe('executeProcess', () => { const spyObserver: ProcessObserver = { diff --git a/packages/nx-plugin/src/internal/versions.ts b/packages/nx-plugin/src/internal/versions.ts index fa4003b33..884dad9a7 100644 --- a/packages/nx-plugin/src/internal/versions.ts +++ b/packages/nx-plugin/src/internal/versions.ts @@ -1,21 +1,21 @@ import { readJsonFile } from '@nx/devkit'; -import { join } from 'node:path'; +import * as path from 'node:path'; import type { PackageJson } from 'nx/src/utils/package-json'; -const workspaceRoot = join(__dirname, '../../'); -const projectsFolder = join(__dirname, '../../../'); +const workspaceRoot = path.join(__dirname, '../../'); +const projectsFolder = path.join(__dirname, '../../../'); export const cpNxPluginVersion = loadPackageJson(workspaceRoot).version; export const cpModelVersion = loadPackageJson( - join(projectsFolder, 'cli'), + path.join(projectsFolder, 'cli'), ).version; export const cpUtilsVersion = loadPackageJson( - join(projectsFolder, 'utils'), + path.join(projectsFolder, 'utils'), ).version; export const cpCliVersion = loadPackageJson( - join(projectsFolder, 'models'), + path.join(projectsFolder, 'models'), ).version; function loadPackageJson(folderPath: string): PackageJson { - return readJsonFile(join(folderPath, 'package.json')); + return readJsonFile(path.join(folderPath, 'package.json')); } diff --git a/packages/nx-plugin/src/plugin/caching.ts b/packages/nx-plugin/src/plugin/caching.ts index bef0bb182..a1b33fbfc 100644 --- a/packages/nx-plugin/src/plugin/caching.ts +++ b/packages/nx-plugin/src/plugin/caching.ts @@ -1,10 +1,10 @@ -import { hashObject } from 'nx/src/hasher/file-hasher'; import { type ProjectConfiguration, readJsonFile, writeJsonFile, } from '@nx/devkit'; import { existsSync } from 'node:fs'; +import { hashObject } from 'nx/src/hasher/file-hasher'; export function cacheKey(prefix: string, hashData: Record) { return `${prefix}-${hashObject(hashData)}`; @@ -13,7 +13,7 @@ export function cacheKey(prefix: string, hashData: Record) { export function getCacheRecord( targetsCache: Record, prefix: string, - hashData: Record + hashData: Record, ) { const targetCacheKey = cacheKey(prefix, hashData); @@ -27,7 +27,7 @@ export function setCacheRecord( targetsCache: Record, prefix: string, hashData: Record, - cacheData: T + cacheData: T, ) { const targetCacheKey = cacheKey(prefix, hashData); @@ -35,7 +35,7 @@ export function setCacheRecord( } export function readTargetsCache( - cachePath: string + cachePath: string, ): Record> { return process.env.NX_CACHE_PROJECT_GRAPH !== 'false' && existsSync(cachePath) ? readJsonFile(cachePath) @@ -44,7 +44,7 @@ export function readTargetsCache( export function writeTargetsToCache( cachePath: string, - results: Record> + results: Record>, ) { writeJsonFile(cachePath, results); } diff --git a/packages/nx-plugin/src/plugin/caching.unit.test.ts b/packages/nx-plugin/src/plugin/caching.unit.test.ts index b2ceaa239..4ef120a02 100644 --- a/packages/nx-plugin/src/plugin/caching.unit.test.ts +++ b/packages/nx-plugin/src/plugin/caching.unit.test.ts @@ -1,14 +1,14 @@ -import {describe, expect, vi, it, beforeEach} from 'vitest'; import * as hasher from 'nx/src/hasher/file-hasher'; -import {cacheKey, getCacheRecord, setCacheRecord} from "./caching"; -import * as nxDevKit from "@nx/devkit"; -import {vol} from "memfs"; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { cacheKey, getCacheRecord, setCacheRecord } from './caching'; describe('cacheKey', () => { let hashObjectSpy; beforeEach(() => { - hashObjectSpy = vi.spyOn(hasher, 'hashObject').mockImplementation(() => '42'); + hashObjectSpy = vi + .spyOn(hasher, 'hashObject') + .mockImplementation(() => '42'); }); afterEach(() => { @@ -17,22 +17,22 @@ describe('cacheKey', () => { it('should start with provided prefix', () => { expect(cacheKey('verdaccio', {} as Record)).toMatch( - /^verdaccio-/ + /^verdaccio-/, ); }); it('should use hashObject to generate hash', () => { - expect(cacheKey('x', {prop: 42} as Record)).toMatch( - /[0-9]*$/ + expect(cacheKey('x', { prop: 42 } as Record)).toMatch( + /[0-9]*$/, ); expect(hashObjectSpy).toHaveBeenCalledTimes(1); - expect(hashObjectSpy).toHaveBeenCalledWith({prop: 42}); + expect(hashObjectSpy).toHaveBeenCalledWith({ prop: 42 }); }); it('should generate correct hash for empty object', () => { - expect(cacheKey('x', {prop: 42} as Record)).toBe('x-42'); + expect(cacheKey('x', { prop: 42 } as Record)).toBe('x-42'); expect(hashObjectSpy).toHaveBeenCalledTimes(1); - expect(hashObjectSpy).toHaveBeenCalledWith({prop: 42}); + expect(hashObjectSpy).toHaveBeenCalledWith({ prop: 42 }); }); }); @@ -40,20 +40,21 @@ describe('getCacheRecord', () => { let hashObjectSpy; beforeEach(() => { - hashObjectSpy = vi.spyOn(hasher, 'hashObject').mockImplementation(() => '42'); + hashObjectSpy = vi + .spyOn(hasher, 'hashObject') + .mockImplementation(() => '42'); }); afterEach(() => { hashObjectSpy.mockClear(); }); - it('should get cached data if given', () => { const prefix = 'verdaccio'; const targetsCache = { 'verdaccio-42': 'cacheData', }; - const hashData = {prop: 42}; + const hashData = { prop: 42 }; expect(getCacheRecord(targetsCache, prefix, hashData)).toBe('cacheData'); }); @@ -61,7 +62,7 @@ describe('getCacheRecord', () => { it('should return undefined if no cache hit', () => { const targetsCache = {}; const prefix = 'verdaccio'; - const hashData = {prop: 43}; + const hashData = { prop: 43 }; expect(getCacheRecord(targetsCache, prefix, hashData)).toBe(undefined); }); @@ -70,72 +71,49 @@ describe('getCacheRecord', () => { 'verdaccio-42': 'cacheData', }; const prefix = 'verdaccio'; - const hashData = {prop: 42}; + const hashData = { prop: 42 }; const hashObjectSpy = vi.spyOn(hasher, 'hashObject'); getCacheRecord(targetsCache, prefix, hashData); expect(hashObjectSpy).toHaveBeenCalledTimes(1); - expect(hashObjectSpy).toHaveBeenCalledWith({prop: 42}); + expect(hashObjectSpy).toHaveBeenCalledWith({ prop: 42 }); }); - -}) +}); describe('setCacheRecord', () => { let hashObjectSpy; beforeEach(() => { - hashObjectSpy = vi.spyOn(hasher, 'hashObject').mockImplementation(() => '42'); + hashObjectSpy = vi + .spyOn(hasher, 'hashObject') + .mockImplementation(() => '42'); }); afterEach(() => { hashObjectSpy.mockClear(); }); - it('should set cached data if given', () => { const prefix = 'verdaccio'; const targetsCache = {}; - const hashData = {prop: 42}; - expect(getCacheRecord(targetsCache,prefix, hashData)).toStrictEqual(undefined); - expect(setCacheRecord(targetsCache, prefix, hashData, {test: 41})).not.toThrowError(); - expect(getCacheRecord(targetsCache,prefix, hashData)).toStrictEqual({test: 41}); + const hashData = { prop: 42 }; + expect(getCacheRecord(targetsCache, prefix, hashData)).toStrictEqual( + undefined, + ); + expect( + setCacheRecord(targetsCache, prefix, hashData, { test: 41 }), + ).not.toThrowError(); + expect(getCacheRecord(targetsCache, prefix, hashData)).toStrictEqual({ + test: 41, + }); }); it('should return cached data after setting', () => { const prefix = 'verdaccio'; const targetsCache = {}; - const hashData = {prop: 42}; - - expect(setCacheRecord(targetsCache, prefix, hashData, {test: 41})).toStrictEqual({test: 41}); - }); - -}) - -/** - * - * export function readTargetsCache( - * cachePath: string - * ): Record> { - * return process.env.NX_CACHE_PROJECT_GRAPH !== 'false' && existsSync(cachePath) - * ? readJsonFile(cachePath) - * : {}; - * } - */ -describe('readTargetsCache', () => { - let readJsonFileSpy = vi.spyOn(nxDevKit, 'readJsonFile'); - - beforeEach(() => { - readJsonFileSpy = readJsonFileSpy.mockImplementation(() => ({ - vol. - })); - }); + const hashData = { prop: 42 }; - afterEach(() => { - readJsonFileSpy.mockRestore(); + expect( + setCacheRecord(targetsCache, prefix, hashData, { test: 41 }), + ).toStrictEqual({ test: 41 }); }); - - - it('should read Targetfile', () => { - - }); - -}) +}); diff --git a/packages/nx-plugin/src/plugin/index.ts b/packages/nx-plugin/src/plugin/index.ts index 186bb0d5c..648d0b4aa 100644 --- a/packages/nx-plugin/src/plugin/index.ts +++ b/packages/nx-plugin/src/plugin/index.ts @@ -1,2 +1,2 @@ -export { createNodes } from './plugin'; -export type { CreateNodesOptions } from './types'; +export { createNodes } from './plugin.js'; +export type { CreateNodesOptions } from './types.js'; diff --git a/packages/nx-plugin/src/plugin/plugin.ts b/packages/nx-plugin/src/plugin/plugin.ts index 0da0c4f6e..bb0f09846 100644 --- a/packages/nx-plugin/src/plugin/plugin.ts +++ b/packages/nx-plugin/src/plugin/plugin.ts @@ -1,7 +1,11 @@ -import {type CreateNodes, type CreateNodesContext, CreateNodesResult} from '@nx/devkit'; - -import {PROJECT_JSON_FILE_NAME} from '../internal/constants'; -import {createProjectConfiguration, loadProjectConfiguration, normalizeCreateNodesOptions,} from './utils'; +import type { + CreateNodes, + CreateNodesContext, + CreateNodesResult, +} from '@nx/devkit'; +import { normalizeCreateNodesOptions } from '@push-based/nx-verdaccio/src/plugin/normalize-create-nodes-options'; +import { createProjectConfiguration } from '@push-based/nx-verdaccio/src/plugin/targets/create-targets'; +import { PROJECT_JSON_FILE_NAME } from '../internal/constants'; type FileMatcher = `${string}${typeof PROJECT_JSON_FILE_NAME}`; const PROJECT_JSON_FILE_GLOB = `**/${PROJECT_JSON_FILE_NAME}` as FileMatcher; @@ -20,7 +24,7 @@ export async function createNodesV1Fn( const projectJson = await loadProjectConfiguration(projectConfigurationFile); const createOptions = normalizeCreateNodesOptions(createNodesOptions); - const {targets} = await createProjectConfiguration( + const { targets } = await createProjectConfiguration( projectJson, createOptions, ); diff --git a/packages/nx-plugin/src/plugin/plugin.unit.test.ts b/packages/nx-plugin/src/plugin/plugin.unit.test.ts index bd3f68cb5..db5f14a3c 100644 --- a/packages/nx-plugin/src/plugin/plugin.unit.test.ts +++ b/packages/nx-plugin/src/plugin/plugin.unit.test.ts @@ -3,8 +3,8 @@ import { vol } from 'memfs'; import { join } from 'node:path'; import { describe, expect } from 'vitest'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; -import { PACKAGE_NAME, PROJECT_JSON_FILE_NAME } from '../internal/constants'; -import { CP_TARGET_NAME } from './constants'; +import { PACKAGE_NAME, PROJECT_JSON_FILE_NAME } from '../internal/constants.js'; +import { CP_TARGET_NAME } from './constants.js'; import { createNodesV1Fn } from './plugin'; describe('createNodesV1Fn', () => { diff --git a/packages/nx-plugin/src/plugin/target/configuration-target.ts b/packages/nx-plugin/src/plugin/target/configuration-target.ts index f9b16c985..d19b9325b 100644 --- a/packages/nx-plugin/src/plugin/target/configuration-target.ts +++ b/packages/nx-plugin/src/plugin/target/configuration-target.ts @@ -1,8 +1,8 @@ import type { TargetConfiguration } from '@nx/devkit'; import type { RunCommandsOptions } from 'nx/src/executors/run-commands/run-commands.impl'; -import { objectToCliArgs } from '../../executors/internal/cli'; -import { PACKAGE_NAME } from '../../internal/constants'; -import { CP_TARGET_NAME } from '../constants'; +import { objectToCliArgs } from '../../executors/internal/cli.js'; +import { PACKAGE_NAME } from '../../internal/constants.js'; +import { CP_TARGET_NAME } from '../constants.js'; export function createConfigurationTarget(options?: { targetName?: string; diff --git a/packages/nx-plugin/src/plugin/target/configuration.target.unit.test.ts b/packages/nx-plugin/src/plugin/target/configuration.target.unit.test.ts index 95bf05a6d..87f4418c9 100644 --- a/packages/nx-plugin/src/plugin/target/configuration.target.unit.test.ts +++ b/packages/nx-plugin/src/plugin/target/configuration.target.unit.test.ts @@ -1,6 +1,6 @@ import { expect } from 'vitest'; -import { PACKAGE_NAME } from '../../internal/constants'; -import { createConfigurationTarget } from './configuration-target'; +import { PACKAGE_NAME } from '../../internal/constants.js'; +import { createConfigurationTarget } from './configuration-target.js'; describe('createConfigurationTarget', () => { it('should return code-pushup--configuration target for given project', () => { diff --git a/packages/nx-plugin/src/plugin/target/executor-target.ts b/packages/nx-plugin/src/plugin/target/executor-target.ts index aeba82ad8..e8b52eb8f 100644 --- a/packages/nx-plugin/src/plugin/target/executor-target.ts +++ b/packages/nx-plugin/src/plugin/target/executor-target.ts @@ -1,6 +1,6 @@ import type { TargetConfiguration } from '@nx/devkit'; -import { PACKAGE_NAME } from '../../internal/constants'; -import type { ProjectPrefixOptions } from '../types'; +import { PACKAGE_NAME } from '../../internal/constants.js'; +import type { ProjectPrefixOptions } from '../types.js'; export function createExecutorTarget(options?: { bin?: string; diff --git a/packages/nx-plugin/src/plugin/target/executor.target.unit.test.ts b/packages/nx-plugin/src/plugin/target/executor.target.unit.test.ts index 8ea0799a7..610b44bd7 100644 --- a/packages/nx-plugin/src/plugin/target/executor.target.unit.test.ts +++ b/packages/nx-plugin/src/plugin/target/executor.target.unit.test.ts @@ -1,5 +1,5 @@ import { expect } from 'vitest'; -import { createExecutorTarget } from './executor-target'; +import { createExecutorTarget } from './executor-target.js'; describe('createExecutorTarget', () => { it('should return executor target without project name', () => { diff --git a/packages/nx-plugin/src/plugin/target/targets.unit.test.ts b/packages/nx-plugin/src/plugin/target/targets.unit.test.ts index d500bfc26..781d90b0c 100644 --- a/packages/nx-plugin/src/plugin/target/targets.unit.test.ts +++ b/packages/nx-plugin/src/plugin/target/targets.unit.test.ts @@ -3,10 +3,10 @@ import { vol } from 'memfs'; import { rm } from 'node:fs/promises'; import { afterEach, beforeEach, expect } from 'vitest'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; -import { DEFAULT_TARGET_NAME, PACKAGE_NAME } from '../../internal/constants'; -import { CP_TARGET_NAME } from '../constants'; -import type { NormalizedCreateNodesOptions } from '../types'; -import { createTargets } from './targets'; +import { DEFAULT_TARGET_NAME, PACKAGE_NAME } from '../../internal/constants.js'; +import { CP_TARGET_NAME } from '../constants.js'; +import type { NormalizedCreateNodesOptions } from '../types.js'; +import { createTargets } from './targets.js'; describe('createTargets', () => { const projectName = 'plugin-my-plugin'; diff --git a/packages/nx-plugin/src/plugin/types.ts b/packages/nx-plugin/src/plugin/types.ts index 9174a48b2..9d75dea8c 100644 --- a/packages/nx-plugin/src/plugin/types.ts +++ b/packages/nx-plugin/src/plugin/types.ts @@ -1,6 +1,6 @@ import type { CreateNodesContext, ProjectConfiguration } from '@nx/devkit'; import type { WithRequired } from '@code-pushup/utils'; -import type { DynamicTargetOptions } from '../internal/types'; +import type { DynamicTargetOptions } from '../internal/types.js'; export type ProjectPrefixOptions = { projectPrefix?: string; diff --git a/packages/nx-plugin/src/plugin/utils.ts b/packages/nx-plugin/src/plugin/utils.ts index 785cac224..845ed3ad4 100644 --- a/packages/nx-plugin/src/plugin/utils.ts +++ b/packages/nx-plugin/src/plugin/utils.ts @@ -1,9 +1,18 @@ -import type { ProjectConfiguration } from '@nx/devkit'; -import { readFile } from 'node:fs/promises'; -import { dirname, join } from 'node:path'; -import { CP_TARGET_NAME } from './constants'; -import { createTargets } from './target/targets'; -import type { CreateNodesOptions, NormalizedCreateNodesOptions } from './types'; +import type {ProjectConfiguration} from '@nx/devkit'; +import {readFile} from 'node:fs/promises'; +import * as path from 'node:path'; +import {dirname, join} from 'node:path'; +import {createTargets} from './target/targets'; +import type {CreateNodesOptions, NormalizedCreateNodesOptions} from './types'; +import {CP_TARGET_NAME} from './constants.js'; +import type {CreateNodesOptions, NormalizedCreateNodesContext,} from './types.js'; + +export async function normalizedCreateNodesContext( + context: CreateNodesContext, + projectConfigurationFile: string, + createOptions: CreateNodesOptions = {}, +): Promise { + const projectRoot = path.dirname(projectConfigurationFile); export function normalizeCreateNodesOptions( options: unknown = {}, diff --git a/packages/nx-plugin/vite.config.integration.ts b/packages/nx-plugin/vite.config.integration.ts index 1ccc8b2d3..9e09bb418 100644 --- a/packages/nx-plugin/vite.config.integration.ts +++ b/packages/nx-plugin/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/nx-plugin', diff --git a/packages/nx-plugin/vite.config.unit.ts b/packages/nx-plugin/vite.config.unit.ts index 835b6b7a3..db557f696 100644 --- a/packages/nx-plugin/vite.config.unit.ts +++ b/packages/nx-plugin/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/nx-plugin', diff --git a/packages/plugin-coverage/.eslintrc.json b/packages/plugin-coverage/.eslintrc.json deleted file mode 100644 index a8f1c89f5..000000000 --- a/packages/plugin-coverage/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["packages/plugin-coverage/tsconfig.*?.json"] - } - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": ["error"] - } - } - ] -} diff --git a/packages/plugin-coverage/eslint.config.js b/packages/plugin-coverage/eslint.config.js new file mode 100644 index 000000000..40165321a --- /dev/null +++ b/packages/plugin-coverage/eslint.config.js @@ -0,0 +1,21 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config( + ...baseConfig, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': 'error', + }, + }, +); diff --git a/packages/plugin-coverage/package.json b/packages/plugin-coverage/package.json index 17d33337d..2bb49ff18 100644 --- a/packages/plugin-coverage/package.json +++ b/packages/plugin-coverage/package.json @@ -1,6 +1,6 @@ { "name": "@code-pushup/coverage-plugin", - "version": "0.55.0", + "version": "0.57.0", "description": "Code PushUp plugin for tracking code coverage ☂", "license": "MIT", "homepage": "https://github.com/code-pushup/cli/tree/main/packages/plugin-coverage#readme", @@ -33,11 +33,9 @@ "access": "public" }, "type": "module", - "main": "./index.js", - "types": "./src/index.d.ts", "dependencies": { - "@code-pushup/models": "0.55.0", - "@code-pushup/utils": "0.55.0", + "@code-pushup/models": "0.57.0", + "@code-pushup/utils": "0.57.0", "ansis": "^3.3.0", "parse-lcov": "^1.0.4", "zod": "^3.22.4" diff --git a/packages/plugin-coverage/project.json b/packages/plugin-coverage/project.json index 384776571..5c33144ff 100644 --- a/packages/plugin-coverage/project.json +++ b/packages/plugin-coverage/project.json @@ -5,15 +5,14 @@ "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/packages/plugin-coverage", "main": "packages/plugin-coverage/src/index.ts", "tsConfig": "packages/plugin-coverage/tsconfig.lib.json", "additionalEntryPoints": ["packages/plugin-coverage/src/bin.ts"], - "assets": ["packages/plugin-coverage/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["packages/plugin-coverage/*.md"] } }, "lint": { diff --git a/packages/plugin-coverage/src/bin.ts b/packages/plugin-coverage/src/bin.ts index c2ae92523..bf6572a76 100644 --- a/packages/plugin-coverage/src/bin.ts +++ b/packages/plugin-coverage/src/bin.ts @@ -1,3 +1,3 @@ -import { executeRunner } from './lib/runner'; +import { executeRunner } from './lib/runner/index.js'; await executeRunner(); diff --git a/packages/plugin-coverage/src/index.ts b/packages/plugin-coverage/src/index.ts index fadde8e0d..50a0bb48b 100644 --- a/packages/plugin-coverage/src/index.ts +++ b/packages/plugin-coverage/src/index.ts @@ -1,5 +1,5 @@ -import { coveragePlugin } from './lib/coverage-plugin'; +import { coveragePlugin } from './lib/coverage-plugin.js'; export default coveragePlugin; -export type { CoveragePluginConfig } from './lib/config'; -export { getNxCoveragePaths } from './lib/nx/coverage-paths'; +export type { CoveragePluginConfig } from './lib/config.js'; +export { getNxCoveragePaths } from './lib/nx/coverage-paths.js'; diff --git a/packages/plugin-coverage/src/lib/config.unit.test.ts b/packages/plugin-coverage/src/lib/config.unit.test.ts index 444623f7b..a5938fa19 100644 --- a/packages/plugin-coverage/src/lib/config.unit.test.ts +++ b/packages/plugin-coverage/src/lib/config.unit.test.ts @@ -3,7 +3,7 @@ import { type CoveragePluginConfig, type CoverageType, coveragePluginConfigSchema, -} from './config'; +} from './config.js'; describe('coveragePluginConfigSchema', () => { it('accepts a code coverage configuration with all entities', () => { diff --git a/packages/plugin-coverage/src/lib/coverage-plugin.ts b/packages/plugin-coverage/src/lib/coverage-plugin.ts index e9f1c4dd8..72e037d0b 100644 --- a/packages/plugin-coverage/src/lib/coverage-plugin.ts +++ b/packages/plugin-coverage/src/lib/coverage-plugin.ts @@ -1,15 +1,15 @@ -import { dirname, join } from 'node:path'; +import { createRequire } from 'node:module'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { Audit, Group, PluginConfig } from '@code-pushup/models'; import { capitalize } from '@code-pushup/utils'; -import { name, version } from '../../package.json'; import { type CoveragePluginConfig, type CoverageType, coveragePluginConfigSchema, -} from './config'; -import { createRunnerConfig } from './runner'; -import { coverageDescription, coverageTypeWeightMapper } from './utils'; +} from './config.js'; +import { createRunnerConfig } from './runner/index.js'; +import { coverageDescription, coverageTypeWeightMapper } from './utils.js'; /** * Instantiates Code PushUp code coverage plugin for core config. @@ -55,19 +55,24 @@ export async function coveragePlugin( })), }; - const runnerScriptPath = join( - fileURLToPath(dirname(import.meta.url)), + const runnerScriptPath = path.join( + fileURLToPath(path.dirname(import.meta.url)), + '..', 'bin.js', ); + const packageJson = createRequire(import.meta.url)( + '../../package.json', + ) as typeof import('../../package.json'); + return { slug: 'coverage', title: 'Code coverage', icon: 'folder-coverage-open', description: 'Official Code PushUp code coverage plugin.', docsUrl: 'https://www.npmjs.com/package/@code-pushup/coverage-plugin/', - packageName: name, - version, + packageName: packageJson.name, + version: packageJson.version, audits, groups: [group], runner: await createRunnerConfig(runnerScriptPath, coverageConfig), diff --git a/packages/plugin-coverage/src/lib/coverage-plugin.unit.test.ts b/packages/plugin-coverage/src/lib/coverage-plugin.unit.test.ts index 6d487af06..cfa60083d 100644 --- a/packages/plugin-coverage/src/lib/coverage-plugin.unit.test.ts +++ b/packages/plugin-coverage/src/lib/coverage-plugin.unit.test.ts @@ -1,7 +1,7 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { describe, expect, it } from 'vitest'; import type { RunnerConfig } from '@code-pushup/models'; -import { coveragePlugin } from './coverage-plugin'; +import { coveragePlugin } from './coverage-plugin.js'; vi.mock('./runner/index.ts', () => ({ createRunnerConfig: vi.fn().mockReturnValue({ @@ -11,7 +11,7 @@ vi.mock('./runner/index.ts', () => ({ })); describe('coveragePlugin', () => { - const LCOV_PATH = join( + const LCOV_PATH = path.join( 'packages', 'plugin-coverage', 'mocks', diff --git a/packages/plugin-coverage/src/lib/nx/coverage-paths.ts b/packages/plugin-coverage/src/lib/nx/coverage-paths.ts index 83ffd5f4b..977b10ea5 100644 --- a/packages/plugin-coverage/src/lib/nx/coverage-paths.ts +++ b/packages/plugin-coverage/src/lib/nx/coverage-paths.ts @@ -7,9 +7,9 @@ import type { import type { JestExecutorOptions } from '@nx/jest/src/executors/jest/schema'; import type { VitestExecutorOptions } from '@nx/vite/executors'; import { bold } from 'ansis'; -import { isAbsolute, join } from 'node:path'; +import path from 'node:path'; import { importModule, ui } from '@code-pushup/utils'; -import type { CoverageResult } from '../config'; +import type { CoverageResult } from '../config.js'; /** * @param targets nx targets to be used for measuring coverage, test by default @@ -117,7 +117,7 @@ export async function getCoveragePathForVitest( } = await import('@nx/vite'); const config = normalizeViteConfigFilePathWithTree( // HACK: only tree.exists is called, so injecting existSync from node:fs instead - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions, n/no-sync + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions { exists: (await import('node:fs')).existsSync } as Tree, project.root, options.configFile, @@ -149,12 +149,12 @@ export async function getCoveragePathForVitest( ); } - if (isAbsolute(reportsDirectory)) { - return join(reportsDirectory, 'lcov.info'); + if (path.isAbsolute(reportsDirectory)) { + return path.join(reportsDirectory, 'lcov.info'); } return { pathToProject: project.root, - resultsPath: join(project.root, reportsDirectory, 'lcov.info'), + resultsPath: path.join(project.root, reportsDirectory, 'lcov.info'), }; } @@ -185,8 +185,8 @@ export async function getCoveragePathForJest( ); } - if (isAbsolute(coverageDirectory)) { - return join(coverageDirectory, 'lcov.info'); + if (path.isAbsolute(coverageDirectory)) { + return path.join(coverageDirectory, 'lcov.info'); } - return join(project.root, coverageDirectory, 'lcov.info'); + return path.join(project.root, coverageDirectory, 'lcov.info'); } diff --git a/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts b/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts index 7b70f8348..8d57dba34 100644 --- a/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts +++ b/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts @@ -1,17 +1,17 @@ import type { JestExecutorOptions } from '@nx/jest/src/executors/jest/schema'; import type { VitestExecutorOptions } from '@nx/vite/executors'; import { vol } from 'memfs'; -import { join } from 'node:path'; +import path from 'node:path'; import { describe, expect, it } from 'vitest'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; -import type { CoverageResult } from '../config'; +import type { CoverageResult } from '../config.js'; import { type JestCoverageConfig, type VitestCoverageConfig, getCoveragePathForJest, getCoveragePathForVitest, getCoveragePathsForTarget, -} from './coverage-paths'; +} from './coverage-paths.js'; vi.mock('bundle-require', () => ({ bundleRequire: vi.fn().mockImplementation((options: { filepath: string }) => { @@ -19,7 +19,7 @@ vi.mock('bundle-require', () => ({ test: { coverage: { reporter: ['lcov'], - reportsDirectory: join('coverage', 'cli'), + reportsDirectory: path.join('coverage', 'cli'), }, }, }; @@ -39,7 +39,7 @@ vi.mock('bundle-require', () => ({ const JEST_VALID: JestCoverageConfig = { coverageReporters: ['lcov'], - coverageDirectory: join('coverage', 'core'), + coverageDirectory: path.join('coverage', 'core'), }; const JEST_NO_DIR: JestCoverageConfig = { @@ -99,7 +99,7 @@ describe('getCoveragePathForTarget', () => { getCoveragePathsForTarget( { name: 'cli', - root: join('packages', 'cli'), + root: path.join('packages', 'cli'), targets: { test: { executor: '@nx/vite:test', @@ -112,8 +112,8 @@ describe('getCoveragePathForTarget', () => { 'test', ), ).resolves.toEqual({ - pathToProject: join('packages', 'cli'), - resultsPath: join('packages', 'cli', 'coverage', 'cli', 'lcov.info'), + pathToProject: path.join('packages', 'cli'), + resultsPath: path.join('packages', 'cli', 'coverage', 'cli', 'lcov.info'), }); }); @@ -122,7 +122,7 @@ describe('getCoveragePathForTarget', () => { getCoveragePathsForTarget( { name: 'core', - root: join('packages', 'core'), + root: path.join('packages', 'core'), targets: { test: { executor: '@nx/jest:jest', @@ -134,7 +134,9 @@ describe('getCoveragePathForTarget', () => { }, 'test', ), - ).resolves.toBe(join('packages', 'core', 'coverage', 'core', 'lcov.info')); + ).resolves.toBe( + path.join('packages', 'core', 'coverage', 'core', 'lcov.info'), + ); }); it('should throw for unsupported executor (only vitest and jest are supported)', async () => { @@ -142,7 +144,7 @@ describe('getCoveragePathForTarget', () => { getCoveragePathsForTarget( { name: 'ui', - root: join('apps', 'ui'), + root: path.join('apps', 'ui'), targets: { 'component-test': { executor: '@nx/cypress', @@ -173,12 +175,12 @@ describe('getCoveragePathForVitest', () => { await expect( getCoveragePathForVitest( { configFile: 'vitest-valid.config.unit.ts' }, - { name: 'cli', root: join('packages', 'cli') }, + { name: 'cli', root: path.join('packages', 'cli') }, 'unit-test', ), ).resolves.toEqual({ - pathToProject: join('packages', 'cli'), - resultsPath: join('packages', 'cli', 'coverage', 'cli', 'lcov.info'), + pathToProject: path.join('packages', 'cli'), + resultsPath: path.join('packages', 'cli', 'coverage', 'cli', 'lcov.info'), } satisfies CoverageResult); }); @@ -186,7 +188,7 @@ describe('getCoveragePathForVitest', () => { await expect(() => getCoveragePathForVitest( { configFile: 'vitest-no-dir.config.integration.ts' }, - { name: 'cli', root: join('packages', 'cli') }, + { name: 'cli', root: path.join('packages', 'cli') }, 'integration-test', ), ).rejects.toThrow( @@ -199,7 +201,7 @@ describe('getCoveragePathForVitest', () => { getCoveragePathForVitest( { configFile: 'vitest-valid.config.unit.ts', - reportsDirectory: join( + reportsDirectory: path.join( '..', '..', 'dist', @@ -208,12 +210,18 @@ describe('getCoveragePathForVitest', () => { 'coverage', ), }, - { name: 'cli', root: join('packages', 'cli') }, + { name: 'cli', root: path.join('packages', 'cli') }, 'unit-test', ), ).resolves.toEqual({ - pathToProject: join('packages', 'cli'), - resultsPath: join('dist', 'packages', 'cli', 'coverage', 'lcov.info'), + pathToProject: path.join('packages', 'cli'), + resultsPath: path.join( + 'dist', + 'packages', + 'cli', + 'coverage', + 'lcov.info', + ), } satisfies CoverageResult); }); @@ -221,7 +229,7 @@ describe('getCoveragePathForVitest', () => { await expect(() => getCoveragePathForVitest( { configFile: 'vitest-no-lcov.config.integration.ts' }, - { name: 'core', root: join('packages', 'core') }, + { name: 'core', root: path.join('packages', 'core') }, 'integration-test', ), ).rejects.toThrow(/configuration .* does not include LCOV report format/); @@ -232,13 +240,18 @@ describe('getCoveragePathForVitest', () => { getCoveragePathForVitest( { configFile: 'vitest-valid.config.unit.ts', - reportsDirectory: join(process.cwd(), 'coverage', 'packages', 'cli'), + reportsDirectory: path.join( + process.cwd(), + 'coverage', + 'packages', + 'cli', + ), }, - { name: 'cli', root: join('packages', 'cli') }, + { name: 'cli', root: path.join('packages', 'cli') }, 'unit-test', ), ).resolves.toBe( - join(process.cwd(), 'coverage', 'packages', 'cli', 'lcov.info'), + path.join(process.cwd(), 'coverage', 'packages', 'cli', 'lcov.info'), ); }); }); @@ -260,17 +273,19 @@ describe('getCoveragePathForJest', () => { await expect( getCoveragePathForJest( { jestConfig: 'jest-valid.config.unit.ts' }, - { name: 'cli', root: join('packages', 'cli') }, + { name: 'cli', root: path.join('packages', 'cli') }, 'unit-test', ), - ).resolves.toBe(join('packages', 'cli', 'coverage', 'core', 'lcov.info')); + ).resolves.toBe( + path.join('packages', 'cli', 'coverage', 'core', 'lcov.info'), + ); }); it('should throw when coverageDirectory is not set in Jest config', async () => { await expect(() => getCoveragePathForJest( { jestConfig: 'jest-no-dir.config.integration.ts' }, - { name: 'core', root: join('packages', 'core') }, + { name: 'core', root: path.join('packages', 'core') }, 'integration-test', ), ).rejects.toThrow( @@ -283,7 +298,7 @@ describe('getCoveragePathForJest', () => { getCoveragePathForJest( { jestConfig: 'jest-valid.config.unit.ts', - coverageDirectory: join( + coverageDirectory: path.join( '..', '..', 'dist', @@ -292,17 +307,19 @@ describe('getCoveragePathForJest', () => { 'coverage', ), }, - { name: 'cli', root: join('packages', 'cli') }, + { name: 'cli', root: path.join('packages', 'cli') }, 'unit-test', ), - ).resolves.toBe(join('dist', 'packages', 'cli', 'coverage', 'lcov.info')); + ).resolves.toBe( + path.join('dist', 'packages', 'cli', 'coverage', 'lcov.info'), + ); }); it('should throw when Jest config does not include lcov reporter', async () => { await expect(() => getCoveragePathForJest( { jestConfig: 'jest-no-lcov.config.integration.ts' }, - { name: 'core', root: join('packages', 'core') }, + { name: 'core', root: path.join('packages', 'core') }, 'integration-test', ), ).rejects.toThrow(/configuration .* does not include LCOV report format/); @@ -315,7 +332,7 @@ describe('getCoveragePathForJest', () => { jestConfig: 'jest-no-lcov.config.integration.ts', coverageReporters: ['lcov'], }, - { name: 'core', root: join('packages', 'core') }, + { name: 'core', root: path.join('packages', 'core') }, 'integration-test', ), ).resolves.toBeTypeOf('string'); @@ -328,7 +345,7 @@ describe('getCoveragePathForJest', () => { jestConfig: 'jest-valid.config.integration.ts', coverageReporters: ['text', 'html'], }, - { name: 'core', root: join('packages', 'core') }, + { name: 'core', root: path.join('packages', 'core') }, 'integration-test', ), ).rejects.toThrow(/configuration .* does not include LCOV report format/); @@ -341,7 +358,7 @@ describe('getCoveragePathForJest', () => { jestConfig: 'jest-valid.config.integration.ts', coverageReporters: ['lcov'], }, - { name: 'core', root: join('packages', 'core') }, + { name: 'core', root: path.join('packages', 'core') }, 'integration-test', ), ).resolves.toBeTypeOf('string'); @@ -351,7 +368,7 @@ describe('getCoveragePathForJest', () => { await expect( getCoveragePathForJest( { jestConfig: 'jest-preset.config.ts' }, - { name: 'core', root: join('packages', 'core') }, + { name: 'core', root: path.join('packages', 'core') }, 'test', ), ).resolves.toBeTypeOf('string'); @@ -362,13 +379,18 @@ describe('getCoveragePathForJest', () => { getCoveragePathForJest( { jestConfig: 'jest-valid.config.unit.ts', - coverageDirectory: join(process.cwd(), 'coverage', 'packages', 'cli'), + coverageDirectory: path.join( + process.cwd(), + 'coverage', + 'packages', + 'cli', + ), }, - { name: 'cli', root: join('packages', 'cli') }, + { name: 'cli', root: path.join('packages', 'cli') }, 'unit-test', ), ).resolves.toBe( - join(process.cwd(), 'coverage', 'packages', 'cli', 'lcov.info'), + path.join(process.cwd(), 'coverage', 'packages', 'cli', 'lcov.info'), ); }); }); diff --git a/packages/plugin-coverage/src/lib/runner/constants.ts b/packages/plugin-coverage/src/lib/runner/constants.ts index 3b6a925e0..ea888685e 100644 --- a/packages/plugin-coverage/src/lib/runner/constants.ts +++ b/packages/plugin-coverage/src/lib/runner/constants.ts @@ -1,9 +1,9 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { pluginWorkDir } from '@code-pushup/utils'; export const WORKDIR = pluginWorkDir('coverage'); -export const RUNNER_OUTPUT_PATH = join(WORKDIR, 'runner-output.json'); -export const PLUGIN_CONFIG_PATH = join( +export const RUNNER_OUTPUT_PATH = path.join(WORKDIR, 'runner-output.json'); +export const PLUGIN_CONFIG_PATH = path.join( process.cwd(), WORKDIR, 'plugin-config.json', diff --git a/packages/plugin-coverage/src/lib/runner/index.ts b/packages/plugin-coverage/src/lib/runner/index.ts index b89d7f38d..89710e224 100644 --- a/packages/plugin-coverage/src/lib/runner/index.ts +++ b/packages/plugin-coverage/src/lib/runner/index.ts @@ -1,6 +1,6 @@ import { bold } from 'ansis'; import { writeFile } from 'node:fs/promises'; -import { dirname } from 'node:path'; +import path from 'node:path'; import type { AuditOutputs, RunnerConfig } from '@code-pushup/models'; import { ProcessError, @@ -10,10 +10,10 @@ import { readJsonFile, ui, } from '@code-pushup/utils'; -import type { FinalCoveragePluginConfig } from '../config'; -import { applyMaxScoreAboveThreshold } from '../utils'; -import { PLUGIN_CONFIG_PATH, RUNNER_OUTPUT_PATH } from './constants'; -import { lcovResultsToAuditOutputs } from './lcov/lcov-runner'; +import type { FinalCoveragePluginConfig } from '../config.js'; +import { applyMaxScoreAboveThreshold } from '../utils.js'; +import { PLUGIN_CONFIG_PATH, RUNNER_OUTPUT_PATH } from './constants.js'; +import { lcovResultsToAuditOutputs } from './lcov/lcov-runner.js'; export async function executeRunner(): Promise { const { reports, coverageToolCommand, coverageTypes } = @@ -41,7 +41,7 @@ export async function executeRunner(): Promise { // Calculate coverage from LCOV results const auditOutputs = await lcovResultsToAuditOutputs(reports, coverageTypes); - await ensureDirectoryExists(dirname(RUNNER_OUTPUT_PATH)); + await ensureDirectoryExists(path.dirname(RUNNER_OUTPUT_PATH)); await writeFile(RUNNER_OUTPUT_PATH, JSON.stringify(auditOutputs)); } @@ -50,7 +50,7 @@ export async function createRunnerConfig( config: FinalCoveragePluginConfig, ): Promise { // Create JSON config for executeRunner - await ensureDirectoryExists(dirname(PLUGIN_CONFIG_PATH)); + await ensureDirectoryExists(path.dirname(PLUGIN_CONFIG_PATH)); await writeFile(PLUGIN_CONFIG_PATH, JSON.stringify(config)); const threshold = config.perfectScoreThreshold; diff --git a/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.integration.test.ts b/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.integration.test.ts index 8cbe14688..a151c3534 100644 --- a/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.integration.test.ts +++ b/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.integration.test.ts @@ -1,8 +1,8 @@ -import { dirname, join } from 'node:path'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { describe, expect, it } from 'vitest'; import { osAgnosticAuditOutputs } from '@code-pushup/test-utils'; -import { lcovResultsToAuditOutputs } from './lcov-runner'; +import { lcovResultsToAuditOutputs } from './lcov-runner.js'; describe('lcovResultsToAuditOutputs', () => { it('should correctly convert lcov results to AuditOutputs and prepend project paths', async () => { @@ -15,8 +15,8 @@ describe('lcovResultsToAuditOutputs', () => { const results = await lcovResultsToAuditOutputs( [ { - resultsPath: join( - fileURLToPath(dirname(import.meta.url)), + resultsPath: path.join( + fileURLToPath(path.dirname(import.meta.url)), '..', '..', '..', @@ -36,8 +36,8 @@ describe('lcovResultsToAuditOutputs', () => { const results = await lcovResultsToAuditOutputs( [ { - resultsPath: join( - fileURLToPath(dirname(import.meta.url)), + resultsPath: path.join( + fileURLToPath(path.dirname(import.meta.url)), '..', '..', '..', diff --git a/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.ts b/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.ts index 69ef3c3a0..3a5a2c447 100644 --- a/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.ts +++ b/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.ts @@ -1,15 +1,15 @@ -import { join } from 'node:path'; +import path from 'node:path'; import type { LCOVRecord } from 'parse-lcov'; import type { AuditOutputs } from '@code-pushup/models'; import { exists, readTextFile, toUnixNewlines, ui } from '@code-pushup/utils'; -import type { CoverageResult, CoverageType } from '../../config'; -import { mergeLcovResults } from './merge-lcov'; -import { parseLcov } from './parse-lcov'; +import type { CoverageResult, CoverageType } from '../../config.js'; +import { mergeLcovResults } from './merge-lcov.js'; +import { parseLcov } from './parse-lcov.js'; import { lcovCoverageToAuditOutput, recordToStatFunctionMapper, -} from './transform'; -import type { LCOVStat, LCOVStats } from './types'; +} from './transform.js'; +import type { LCOVStat, LCOVStats } from './types.js'; // Note: condition or statement coverage is not supported in LCOV // https://stackoverflow.com/questions/48260434/is-it-possible-to-check-condition-coverage-with-gcov @@ -71,7 +71,7 @@ export async function parseLcovFiles( file: typeof result === 'string' || result.pathToProject == null ? record.file - : join(result.pathToProject, record.file), + : path.join(result.pathToProject, record.file), })); }), ); diff --git a/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts b/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts index cbbe8b0e4..2ab6bcd2f 100644 --- a/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts +++ b/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts @@ -1,14 +1,14 @@ import { vol } from 'memfs'; -import { join } from 'node:path'; +import path from 'node:path'; import { describe, expect, it } from 'vitest'; import { getLogMessages } from '@code-pushup/test-utils'; import { ui } from '@code-pushup/utils'; -import { parseLcovFiles } from './lcov-runner'; +import { parseLcovFiles } from './lcov-runner.js'; describe('parseLcovFiles', () => { const UTILS_REPORT = ` TN: -SF:${join('common', 'utils.ts')} +SF:${path.join('common', 'utils.ts')} FNF:0 FNH:0 DA:1,1 @@ -23,7 +23,7 @@ end_of_record const CONSTANTS_REPORT = ` TN: -SF:${join('src', 'lib', 'constants.ts')} +SF:${path.join('src', 'lib', 'constants.ts')} FNF:0 FNH:0 DA:1,1 @@ -37,8 +37,8 @@ end_of_record beforeEach(() => { vol.fromJSON( { - [join('integration-tests', 'lcov.info')]: UTILS_REPORT, // file name value under SF used in tests - [join('unit-tests', 'lcov.info')]: CONSTANTS_REPORT, // file name value under SF used in tests + [path.join('integration-tests', 'lcov.info')]: UTILS_REPORT, // file name value under SF used in tests + [path.join('unit-tests', 'lcov.info')]: CONSTANTS_REPORT, // file name value under SF used in tests 'lcov.info': '', // empty report file }, 'coverage', @@ -47,9 +47,9 @@ end_of_record it('should identify coverage path passed as a string', async () => { await expect( - parseLcovFiles([join('coverage', 'integration-tests', 'lcov.info')]), + parseLcovFiles([path.join('coverage', 'integration-tests', 'lcov.info')]), ).resolves.toEqual([ - expect.objectContaining({ file: join('common', 'utils.ts') }), + expect.objectContaining({ file: path.join('common', 'utils.ts') }), ]); }); @@ -57,13 +57,13 @@ end_of_record await expect( parseLcovFiles([ { - resultsPath: join('coverage', 'unit-tests', 'lcov.info'), - pathToProject: join('packages', 'cli'), + resultsPath: path.join('coverage', 'unit-tests', 'lcov.info'), + pathToProject: path.join('packages', 'cli'), }, ]), ).resolves.toEqual([ expect.objectContaining({ - file: join('packages', 'cli', 'src', 'lib', 'constants.ts'), + file: path.join('packages', 'cli', 'src', 'lib', 'constants.ts'), }), ]); }); @@ -72,35 +72,35 @@ end_of_record await expect( parseLcovFiles([ { - resultsPath: join('coverage', 'unit-tests', 'lcov.info'), - pathToProject: join('packages', 'cli'), + resultsPath: path.join('coverage', 'unit-tests', 'lcov.info'), + pathToProject: path.join('packages', 'cli'), }, - join('coverage', 'integration-tests', 'lcov.info'), + path.join('coverage', 'integration-tests', 'lcov.info'), ]), ).resolves.toEqual([ expect.objectContaining({ - file: join('packages', 'cli', 'src', 'lib', 'constants.ts'), + file: path.join('packages', 'cli', 'src', 'lib', 'constants.ts'), }), expect.objectContaining({ - file: join('common', 'utils.ts'), + file: path.join('common', 'utils.ts'), }), ]); }); it('should throw for only empty reports', async () => { await expect(() => - parseLcovFiles([join('coverage', 'lcov.info')]), + parseLcovFiles([path.join('coverage', 'lcov.info')]), ).rejects.toThrow('All provided results are empty.'); }); it('should warn about an empty lcov file', async () => { await parseLcovFiles([ - join('coverage', 'integration-tests', 'lcov.info'), - join('coverage', 'lcov.info'), + path.join('coverage', 'integration-tests', 'lcov.info'), + path.join('coverage', 'lcov.info'), ]); expect(getLogMessages(ui().logger)[0]).toContain( - `Coverage plugin: Empty lcov report file detected at ${join( + `Coverage plugin: Empty lcov report file detected at ${path.join( 'coverage', 'lcov.info', )}`, diff --git a/packages/plugin-coverage/src/lib/runner/lcov/merge-lcov.unit.test.ts b/packages/plugin-coverage/src/lib/runner/lcov/merge-lcov.unit.test.ts index dfe71f9b6..8ea4f4ee9 100644 --- a/packages/plugin-coverage/src/lib/runner/lcov/merge-lcov.unit.test.ts +++ b/packages/plugin-coverage/src/lib/runner/lcov/merge-lcov.unit.test.ts @@ -11,7 +11,7 @@ import { mergeLcovFunctionsDetails, mergeLcovLineDetails, mergeLcovResults, -} from './merge-lcov'; +} from './merge-lcov.js'; describe('mergeLcovResults', () => { it('should merge duplicates and keep unique reports', () => { diff --git a/packages/plugin-coverage/src/lib/runner/lcov/transform.ts b/packages/plugin-coverage/src/lib/runner/lcov/transform.ts index 34df3864e..fedbdfd4d 100644 --- a/packages/plugin-coverage/src/lib/runner/lcov/transform.ts +++ b/packages/plugin-coverage/src/lib/runner/lcov/transform.ts @@ -1,10 +1,10 @@ import type { LCOVRecord } from 'parse-lcov'; import type { AuditOutput, Issue } from '@code-pushup/models'; import { toNumberPrecision, toOrdinal } from '@code-pushup/utils'; -import type { CoverageType } from '../../config'; -import { INVALID_FUNCTION_NAME } from '../constants'; -import type { LCOVStat } from './types'; -import { calculateCoverage, mergeConsecutiveNumbers } from './utils'; +import type { CoverageType } from '../../config.js'; +import { INVALID_FUNCTION_NAME } from '../constants.js'; +import type { LCOVStat } from './types.js'; +import { calculateCoverage, mergeConsecutiveNumbers } from './utils.js'; export function lcovReportToFunctionStat(record: LCOVRecord): LCOVStat { const validRecord = removeEmptyReport(record); diff --git a/packages/plugin-coverage/src/lib/runner/lcov/transform.unit.test.ts b/packages/plugin-coverage/src/lib/runner/lcov/transform.unit.test.ts index fe30fc269..3125c29c2 100644 --- a/packages/plugin-coverage/src/lib/runner/lcov/transform.unit.test.ts +++ b/packages/plugin-coverage/src/lib/runner/lcov/transform.unit.test.ts @@ -1,14 +1,14 @@ import type { LCOVRecord } from 'parse-lcov'; import { describe, it } from 'vitest'; import type { AuditOutput, Issue } from '@code-pushup/models'; -import { INVALID_FUNCTION_NAME } from '../constants'; +import { INVALID_FUNCTION_NAME } from '../constants.js'; import { lcovCoverageToAuditOutput, lcovReportToBranchStat, lcovReportToFunctionStat, lcovReportToLineStat, -} from './transform'; -import type { LCOVStat } from './types'; +} from './transform.js'; +import type { LCOVStat } from './types.js'; const lcovRecordMock: LCOVRecord = { file: 'cli.ts', diff --git a/packages/plugin-coverage/src/lib/runner/lcov/types.ts b/packages/plugin-coverage/src/lib/runner/lcov/types.ts index 627105744..1fa924a59 100644 --- a/packages/plugin-coverage/src/lib/runner/lcov/types.ts +++ b/packages/plugin-coverage/src/lib/runner/lcov/types.ts @@ -1,5 +1,5 @@ import type { Issue } from '@code-pushup/models'; -import type { CoverageType } from '../../config'; +import type { CoverageType } from '../../config.js'; export type LCOVStat = { totalFound: number; diff --git a/packages/plugin-coverage/src/lib/runner/lcov/utils.ts b/packages/plugin-coverage/src/lib/runner/lcov/utils.ts index fce9627cf..5678bdc5c 100644 --- a/packages/plugin-coverage/src/lib/runner/lcov/utils.ts +++ b/packages/plugin-coverage/src/lib/runner/lcov/utils.ts @@ -1,4 +1,4 @@ -import type { NumberRange } from './types'; +import type { NumberRange } from './types.js'; /** * This function calculates coverage as ratio of tested entities vs total diff --git a/packages/plugin-coverage/src/lib/runner/lcov/utils.unit.test.ts b/packages/plugin-coverage/src/lib/runner/lcov/utils.unit.test.ts index 1225a91d0..15f8d71ed 100644 --- a/packages/plugin-coverage/src/lib/runner/lcov/utils.unit.test.ts +++ b/packages/plugin-coverage/src/lib/runner/lcov/utils.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { calculateCoverage, mergeConsecutiveNumbers } from './utils'; +import { calculateCoverage, mergeConsecutiveNumbers } from './utils.js'; describe('calculateCoverage', () => { it('should calculate coverage for one type of report', () => { diff --git a/packages/plugin-coverage/src/lib/runner/runner.integration.test.ts b/packages/plugin-coverage/src/lib/runner/runner.integration.test.ts index e697b44a8..abe081b2c 100644 --- a/packages/plugin-coverage/src/lib/runner/runner.integration.test.ts +++ b/packages/plugin-coverage/src/lib/runner/runner.integration.test.ts @@ -1,5 +1,5 @@ import { writeFile } from 'node:fs/promises'; -import { dirname, join } from 'node:path'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { describe, it } from 'vitest'; import type { @@ -8,9 +8,13 @@ import type { RunnerConfig, } from '@code-pushup/models'; import { readJsonFile, removeDirectoryIfExists } from '@code-pushup/utils'; -import { createRunnerConfig, executeRunner } from '.'; -import type { FinalCoveragePluginConfig } from '../config'; -import { PLUGIN_CONFIG_PATH, RUNNER_OUTPUT_PATH, WORKDIR } from './constants'; +import type { FinalCoveragePluginConfig } from '../config.js'; +import { + PLUGIN_CONFIG_PATH, + RUNNER_OUTPUT_PATH, + WORKDIR, +} from './constants.js'; +import { createRunnerConfig, executeRunner } from './index.js'; describe('createRunnerConfig', () => { it('should create a valid runner config', async () => { @@ -49,8 +53,8 @@ describe('executeRunner', () => { it('should successfully execute runner', async () => { const config: FinalCoveragePluginConfig = { reports: [ - join( - fileURLToPath(dirname(import.meta.url)), + path.join( + fileURLToPath(path.dirname(import.meta.url)), '..', '..', '..', diff --git a/packages/plugin-coverage/src/lib/utils.ts b/packages/plugin-coverage/src/lib/utils.ts index 73052641c..371f36a63 100644 --- a/packages/plugin-coverage/src/lib/utils.ts +++ b/packages/plugin-coverage/src/lib/utils.ts @@ -1,5 +1,5 @@ import type { AuditOutputs } from '@code-pushup/models'; -import type { CoverageType } from './config'; +import type { CoverageType } from './config.js'; export const coverageDescription: Record = { branch: @@ -23,10 +23,10 @@ export function applyMaxScoreAboveThreshold( ); } -/* eslint-disable no-magic-numbers */ export const coverageTypeWeightMapper: Record = { + /* eslint-disable @typescript-eslint/no-magic-numbers */ function: 6, branch: 3, line: 1, + /* eslint-enable @typescript-eslint/no-magic-numbers */ }; -/* eslint-enable no-magic-numbers */ diff --git a/packages/plugin-coverage/src/lib/utils.unit.test.ts b/packages/plugin-coverage/src/lib/utils.unit.test.ts index 819e8692a..d1ccedc1b 100644 --- a/packages/plugin-coverage/src/lib/utils.unit.test.ts +++ b/packages/plugin-coverage/src/lib/utils.unit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import type { AuditOutput } from '@code-pushup/models'; -import { applyMaxScoreAboveThreshold } from './utils'; +import { applyMaxScoreAboveThreshold } from './utils.js'; describe('applyMaxScoreAboveThreshold', () => { it('should transform score above threshold to maximum', () => { diff --git a/packages/plugin-coverage/vite.config.integration.ts b/packages/plugin-coverage/vite.config.integration.ts index 5ffe05dce..4c4c6b107 100644 --- a/packages/plugin-coverage/vite.config.integration.ts +++ b/packages/plugin-coverage/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/plugin-coverage', diff --git a/packages/plugin-coverage/vite.config.unit.ts b/packages/plugin-coverage/vite.config.unit.ts index 84340f6e5..e359bb1bb 100644 --- a/packages/plugin-coverage/vite.config.unit.ts +++ b/packages/plugin-coverage/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/plugin-coverage', diff --git a/packages/plugin-eslint/.eslintrc.json b/packages/plugin-eslint/.eslintrc.json deleted file mode 100644 index eb1ddfc46..000000000 --- a/packages/plugin-eslint/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["packages/plugin-eslint/tsconfig.*?.json"] - } - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": ["error"] - } - } - ] -} diff --git a/packages/plugin-eslint/eslint.config.js b/packages/plugin-eslint/eslint.config.js new file mode 100644 index 000000000..40165321a --- /dev/null +++ b/packages/plugin-eslint/eslint.config.js @@ -0,0 +1,21 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config( + ...baseConfig, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': 'error', + }, + }, +); diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/.eslintrc.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/.eslintrc.json deleted file mode 100644 index 7fd93e8d1..000000000 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/.eslintrc.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "root": true, - "ignorePatterns": ["**/*"], - "plugins": ["@nx"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": { - "@nx/enforce-module-boundaries": [ - "error", - { - "enforceBuildableLibDependency": true, - "allow": [], - "depConstraints": [ - { - "sourceTag": "*", - "onlyDependOnLibsWithTags": ["*"] - } - ] - } - ] - } - }, - { - "files": ["*.ts", "*.tsx"], - "extends": ["plugin:@nx/typescript"], - "rules": {} - }, - { - "files": ["*.js", "*.jsx"], - "extends": ["plugin:@nx/javascript"], - "rules": {} - }, - { - "files": "*.json", - "parser": "jsonc-eslint-parser", - "rules": {} - } - ] -} diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/.gitignore b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/.gitignore index 0cba03f65..f21d80021 100644 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/.gitignore +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/.gitignore @@ -1 +1 @@ -.nx/cache \ No newline at end of file +.nx diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/eslint.config.js b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/eslint.config.js new file mode 100644 index 000000000..6ef27db4c --- /dev/null +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/eslint.config.js @@ -0,0 +1,41 @@ +const nx = require('@nx/eslint-plugin'); + +module.exports = [ + { + files: ['**/*.json'], + // Override or add rules here + rules: {}, + languageOptions: { + parser: require('jsonc-eslint-parser'), + }, + }, + ...nx.configs['flat/base'], + ...nx.configs['flat/typescript'], + ...nx.configs['flat/javascript'], + { + ignores: ['**/dist'], + }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + rules: { + '@nx/enforce-module-boundaries': [ + 'warn', + { + enforceBuildableLibDependency: true, + allow: ['^.*/eslint(\\.base)?\\.config\\.[cm]?js$'], + depConstraints: [ + { + sourceTag: '*', + onlyDependOnLibsWithTags: ['*'], + }, + ], + }, + ], + }, + }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + // Override or add rules here + rules: {}, + }, +]; diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/nx.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/nx.json index be05532ae..2b5514041 100644 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/nx.json +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/nx.json @@ -3,5 +3,6 @@ "@nrwl/js": { "analyzeSourceFiles": true } - } + }, + "useDaemonProcess": false } diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/package.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/package.json new file mode 100644 index 000000000..0fef86e33 --- /dev/null +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/package.json @@ -0,0 +1,4 @@ +{ + "private": true, + "type": "commonjs" +} diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/.eslintrc.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/.eslintrc.json deleted file mode 100644 index 498a74926..000000000 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/.eslintrc.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.ts", "*.tsx"], - "rules": {} - }, - { - "files": ["*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": ["error"] - } - } - ] -} diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/eslint.config.js b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/eslint.config.js new file mode 100644 index 000000000..9d2af7a3d --- /dev/null +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/eslint.config.js @@ -0,0 +1,19 @@ +const baseConfig = require('../../eslint.config.js'); + +module.exports = [ + ...baseConfig, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': [ + 'error', + { + ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs}'], + }, + ], + }, + languageOptions: { + parser: require('jsonc-eslint-parser'), + }, + }, +]; diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/project.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/project.json index eaa517967..eb92b91ee 100644 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/project.json +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/cli/project.json @@ -4,14 +4,7 @@ "projectType": "application", "targets": { "lint": { - "executor": "@nx/linter:eslint", - "outputs": ["{options.outputFile}"], - "options": { - "lintFilePatterns": [ - "packages/cli/**/*.ts", - "packages/cli/package.json" - ] - } + "executor": "@nx/eslint:lint" } } } diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/.eslintrc.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/.eslintrc.json deleted file mode 100644 index 498a74926..000000000 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/.eslintrc.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.ts", "*.tsx"], - "rules": {} - }, - { - "files": ["*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": ["error"] - } - } - ] -} diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/eslint.config.js b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/eslint.config.js new file mode 100644 index 000000000..9d2af7a3d --- /dev/null +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/eslint.config.js @@ -0,0 +1,19 @@ +const baseConfig = require('../../eslint.config.js'); + +module.exports = [ + ...baseConfig, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': [ + 'error', + { + ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs}'], + }, + ], + }, + languageOptions: { + parser: require('jsonc-eslint-parser'), + }, + }, +]; diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/project.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/project.json index 238ad8866..c39496eb4 100644 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/project.json +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/core/project.json @@ -4,14 +4,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", - "outputs": ["{options.outputFile}"], - "options": { - "lintFilePatterns": [ - "packages/core/**/*.ts", - "packages/core/package.json" - ] - } + "executor": "@nx/eslint:lint" } } } diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/.eslintrc.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/.eslintrc.json deleted file mode 100644 index 055ebf9d6..000000000 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/.eslintrc.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.ts", "*.tsx"], - "rules": {} - }, - { - "files": ["*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": ["error"] - } - }, - { - "files": ["./package.json", "./generators.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/nx-plugin-checks": "error" - } - } - ] -} diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/eslint.config.js b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/eslint.config.js new file mode 100644 index 000000000..9327f3f52 --- /dev/null +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/eslint.config.js @@ -0,0 +1,28 @@ +const baseConfig = require('../../eslint.config.js'); + +module.exports = [ + ...baseConfig, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': [ + 'error', + { + ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs}'], + }, + ], + }, + languageOptions: { + parser: require('jsonc-eslint-parser'), + }, + }, + { + files: ['**/package.json', '**/package.json', '**/generators.json'], + rules: { + '@nx/nx-plugin-checks': 'error', + }, + languageOptions: { + parser: require('jsonc-eslint-parser'), + }, + }, +]; diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/project.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/project.json index faa609fb0..7c8b0a3d7 100644 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/project.json +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/nx-plugin/project.json @@ -4,15 +4,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", - "outputs": ["{options.outputFile}"], - "options": { - "lintFilePatterns": [ - "packages/nx-plugin/**/*.ts", - "packages/nx-plugin/package.json", - "packages/nx-plugin/generators.json" - ] - } + "executor": "@nx/eslint:lint" } } } diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/.eslintrc.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/.eslintrc.json deleted file mode 100644 index 498a74926..000000000 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/.eslintrc.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.ts", "*.tsx"], - "rules": {} - }, - { - "files": ["*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": ["error"] - } - } - ] -} diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/eslint.config.js b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/eslint.config.js new file mode 100644 index 000000000..9d2af7a3d --- /dev/null +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/eslint.config.js @@ -0,0 +1,19 @@ +const baseConfig = require('../../eslint.config.js'); + +module.exports = [ + ...baseConfig, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': [ + 'error', + { + ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs}'], + }, + ], + }, + languageOptions: { + parser: require('jsonc-eslint-parser'), + }, + }, +]; diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/project.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/project.json index 77632393b..e13c52b59 100644 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/project.json +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/packages/utils/project.json @@ -4,14 +4,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", - "outputs": ["{options.outputFile}"], - "options": { - "lintFilePatterns": [ - "packages/utils/**/*.ts", - "packages/utils/package.json" - ] - } + "executor": "@nx/eslint:lint" } } } diff --git a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/tsconfig.base.json b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/tsconfig.base.json index 05d05e672..6fc9deaa6 100644 --- a/packages/plugin-eslint/mocks/fixtures/nx-monorepo/tsconfig.base.json +++ b/packages/plugin-eslint/mocks/fixtures/nx-monorepo/tsconfig.base.json @@ -8,9 +8,9 @@ "emitDecoratorMetadata": true, "experimentalDecorators": true, "importHelpers": true, - "target": "es2015", + "target": "ES2022", "module": "esnext", - "lib": ["es2020", "dom"], + "lib": ["ES2022", "dom"], "skipLibCheck": true, "skipDefaultLibCheck": true, "baseUrl": ".", diff --git a/packages/plugin-eslint/mocks/fixtures/todos-app/.eslintrc.js b/packages/plugin-eslint/mocks/fixtures/todos-app/.eslintrc.js deleted file mode 100644 index e05f2bb62..000000000 --- a/packages/plugin-eslint/mocks/fixtures/todos-app/.eslintrc.js +++ /dev/null @@ -1,69 +0,0 @@ -/** @type {import('eslint').ESLint.ConfigData} */ -module.exports = { - root: true, - env: { - browser: true, - es2021: true, - }, - plugins: ['react', 'react-hooks'], - overrides: [ - { - env: { - node: true, - }, - files: ['.eslintrc.{js,cjs}'], - parserOptions: { - sourceType: 'script', - }, - }, - ], - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - ecmaFeatures: { - jsx: true, - }, - }, - settings: { - react: { - version: 'detect', - }, - }, - rules: { - // https://eslint.org/docs/latest/rules/#possible-problems - 'no-cond-assign': 'warn', - 'no-const-assign': 'warn', - 'no-debugger': 'warn', - 'no-invalid-regexp': 'warn', - 'no-undef': 'warn', - 'no-unreachable-loop': 'warn', - 'no-unsafe-negation': 'warn', - 'no-unsafe-optional-chaining': 'warn', - 'no-unused-vars': 'warn', - 'use-isnan': 'warn', - 'valid-typeof': 'warn', - // https://eslint.org/docs/latest/rules/#suggestions - 'arrow-body-style': 'warn', - camelcase: 'warn', - curly: 'warn', - eqeqeq: 'warn', - 'max-lines-per-function': 'warn', - 'max-lines': 'warn', - 'no-shadow': 'warn', - 'no-var': 'warn', - 'object-shorthand': 'warn', - 'prefer-arrow-callback': 'warn', - 'prefer-const': 'warn', - 'prefer-object-spread': 'warn', - yoda: 'warn', - // https://github.com/jsx-eslint/eslint-plugin-react#list-of-supported-rules - 'react/jsx-key': 'warn', - 'react/prop-types': 'warn', - 'react/react-in-jsx-scope': 'warn', - 'react/jsx-uses-vars': 'warn', - 'react/jsx-uses-react': 'error', - // https://www.npmjs.com/package/eslint-plugin-react-hooks - 'react-hooks/rules-of-hooks': 'error', - 'react-hooks/exhaustive-deps': 'warn', - }, -}; diff --git a/packages/plugin-eslint/mocks/fixtures/todos-app/code-pushup.eslint.config.mjs b/packages/plugin-eslint/mocks/fixtures/todos-app/code-pushup.eslint.config.mjs new file mode 100644 index 000000000..488adb0b4 --- /dev/null +++ b/packages/plugin-eslint/mocks/fixtures/todos-app/code-pushup.eslint.config.mjs @@ -0,0 +1,3 @@ +import javascript from '@code-pushup/eslint-config'; + +export default javascript; diff --git a/packages/plugin-eslint/mocks/fixtures/todos-app/code-pushup.eslintrc.yml b/packages/plugin-eslint/mocks/fixtures/todos-app/code-pushup.eslintrc.yml deleted file mode 100644 index f7da37f07..000000000 --- a/packages/plugin-eslint/mocks/fixtures/todos-app/code-pushup.eslintrc.yml +++ /dev/null @@ -1,2 +0,0 @@ -root: true -extends: '@code-pushup' diff --git a/packages/plugin-eslint/mocks/fixtures/todos-app/eslint.config.js b/packages/plugin-eslint/mocks/fixtures/todos-app/eslint.config.js new file mode 100644 index 000000000..d4ca65827 --- /dev/null +++ b/packages/plugin-eslint/mocks/fixtures/todos-app/eslint.config.js @@ -0,0 +1,67 @@ +const react = require('eslint-plugin-react'); +const reactHooks = require('eslint-plugin-react-hooks'); +const globals = require('globals'); + +/** @type {import('eslint').Linter.Config[]} */ +module.exports = [ + { + files: ['**/*.jsx', '**/*.js'], + ignores: ['eslint.config.js'], + plugins: { + react, + 'react-hooks': reactHooks, + }, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + globals: { + ...globals.browser, + }, + }, + settings: { + react: { + version: 'detect', + }, + }, + rules: { + // https://eslint.org/docs/latest/rules/#possible-problems + 'no-cond-assign': 'warn', + 'no-const-assign': 'warn', + 'no-debugger': 'warn', + 'no-invalid-regexp': 'warn', + 'no-undef': 'warn', + 'no-unreachable-loop': 'warn', + 'no-unsafe-negation': 'warn', + 'no-unsafe-optional-chaining': 'warn', + 'no-unused-vars': 'warn', + 'use-isnan': 'warn', + 'valid-typeof': 'warn', + // https://eslint.org/docs/latest/rules/#suggestions + 'arrow-body-style': 'warn', + camelcase: 'warn', + curly: 'warn', + eqeqeq: 'warn', + 'max-lines-per-function': 'warn', + 'max-lines': 'warn', + 'no-shadow': 'warn', + 'no-var': 'warn', + 'object-shorthand': 'warn', + 'prefer-arrow-callback': 'warn', + 'prefer-const': 'warn', + 'prefer-object-spread': 'warn', + yoda: 'warn', + // https://github.com/jsx-eslint/eslint-plugin-react#list-of-supported-rules + 'react/jsx-key': 'warn', + 'react/prop-types': 'warn', + 'react/react-in-jsx-scope': 'warn', + 'react/jsx-uses-vars': 'warn', + 'react/jsx-uses-react': 'error', + // https://www.npmjs.com/package/eslint-plugin-react-hooks + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + }, + }, +]; diff --git a/packages/plugin-eslint/mocks/fixtures/todos-app/package.json b/packages/plugin-eslint/mocks/fixtures/todos-app/package.json index 76fa0f9e9..5409f25c7 100644 --- a/packages/plugin-eslint/mocks/fixtures/todos-app/package.json +++ b/packages/plugin-eslint/mocks/fixtures/todos-app/package.json @@ -12,8 +12,9 @@ }, "devDependencies": { "esbuild": "^0.19.2", - "eslint": "^8.48.0", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0" + "eslint": "^9.16.0", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.1.0", + "globals": "^15.13.0" } } diff --git a/packages/plugin-eslint/mocks/fixtures/todos-app/tsconfig.base.json b/packages/plugin-eslint/mocks/fixtures/todos-app/tsconfig.base.json new file mode 100644 index 000000000..adb7ad3ff --- /dev/null +++ b/packages/plugin-eslint/mocks/fixtures/todos-app/tsconfig.base.json @@ -0,0 +1,19 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "rootDir": ".", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "ES2022", + "module": "esnext", + "lib": ["ES2022", "dom"], + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "baseUrl": "." + }, + "exclude": ["node_modules", "tmp"] +} diff --git a/packages/plugin-eslint/package.json b/packages/plugin-eslint/package.json index 4a31f798f..3cc7dbbe3 100644 --- a/packages/plugin-eslint/package.json +++ b/packages/plugin-eslint/package.json @@ -1,6 +1,6 @@ { "name": "@code-pushup/eslint-plugin", - "version": "0.55.0", + "version": "0.57.0", "license": "MIT", "description": "Code PushUp plugin for detecting problems in source code using ESLint.📋", "homepage": "https://github.com/code-pushup/cli/tree/main/packages/plugin-eslint#readme", @@ -37,11 +37,9 @@ "access": "public" }, "type": "module", - "main": "./index.js", - "types": "./src/index.d.ts", "dependencies": { - "@code-pushup/utils": "0.55.0", - "@code-pushup/models": "0.55.0", + "@code-pushup/utils": "0.57.0", + "@code-pushup/models": "0.57.0", "zod": "^3.22.4" }, "peerDependencies": { diff --git a/packages/plugin-eslint/project.json b/packages/plugin-eslint/project.json index 38b5698d0..ab6569a8b 100644 --- a/packages/plugin-eslint/project.json +++ b/packages/plugin-eslint/project.json @@ -5,15 +5,14 @@ "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/packages/plugin-eslint", "main": "packages/plugin-eslint/src/index.ts", "tsConfig": "packages/plugin-eslint/tsconfig.lib.json", "assets": ["packages/plugin-eslint/*.md"], - "additionalEntryPoints": ["packages/plugin-eslint/src/bin.ts"], - "esbuildConfig": "esbuild.config.js" + "additionalEntryPoints": ["packages/plugin-eslint/src/bin.ts"] } }, "lint": { diff --git a/packages/plugin-eslint/src/bin.ts b/packages/plugin-eslint/src/bin.ts index c2ae92523..bf6572a76 100644 --- a/packages/plugin-eslint/src/bin.ts +++ b/packages/plugin-eslint/src/bin.ts @@ -1,3 +1,3 @@ -import { executeRunner } from './lib/runner'; +import { executeRunner } from './lib/runner/index.js'; await executeRunner(); diff --git a/packages/plugin-eslint/src/index.ts b/packages/plugin-eslint/src/index.ts index 3ad1839f0..8e33e0c18 100644 --- a/packages/plugin-eslint/src/index.ts +++ b/packages/plugin-eslint/src/index.ts @@ -1,13 +1,12 @@ -import { eslintPlugin } from './lib/eslint-plugin'; +import { eslintPlugin } from './lib/eslint-plugin.js'; export default eslintPlugin; -export type { ESLintPluginConfig } from './lib/config'; +export type { ESLintPluginConfig } from './lib/config.js'; export { - eslintConfigFromNxProjectAndDeps, - // eslint-disable-next-line deprecation/deprecation - eslintConfigFromNxProjects, eslintConfigFromAllNxProjects, eslintConfigFromNxProject, -} from './lib/nx'; + eslintConfigFromNxProjectAndDeps, + eslintConfigFromNxProjects, +} from './lib/nx/index.js'; diff --git a/packages/plugin-eslint/src/lib/__snapshots__/eslint-plugin.integration.test.ts.snap b/packages/plugin-eslint/src/lib/__snapshots__/eslint-plugin.integration.test.ts.snap index ecb729eac..41d9175c0 100644 --- a/packages/plugin-eslint/src/lib/__snapshots__/eslint-plugin.integration.test.ts.snap +++ b/packages/plugin-eslint/src/lib/__snapshots__/eslint-plugin.integration.test.ts.snap @@ -6,7 +6,7 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` { "description": "ESLint rule **no-cond-assign**.", "docsUrl": "https://eslint.org/docs/latest/rules/no-cond-assign", - "slug": "no-cond-assign", + "slug": "no-cond-assign-4da1eac06e945b1a", "title": "Disallow assignment operators in conditional expressions", }, { @@ -24,31 +24,31 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` { "description": "ESLint rule **no-invalid-regexp**.", "docsUrl": "https://eslint.org/docs/latest/rules/no-invalid-regexp", - "slug": "no-invalid-regexp", + "slug": "no-invalid-regexp-9b874a94de5d65c6", "title": "Disallow invalid regular expression strings in \`RegExp\` constructors", }, { "description": "ESLint rule **no-undef**.", "docsUrl": "https://eslint.org/docs/latest/rules/no-undef", - "slug": "no-undef", + "slug": "no-undef-1c0a571cbd314966", "title": "Disallow the use of undeclared variables unless mentioned in \`/*global */\` comments", }, { "description": "ESLint rule **no-unreachable-loop**.", "docsUrl": "https://eslint.org/docs/latest/rules/no-unreachable-loop", - "slug": "no-unreachable-loop", + "slug": "no-unreachable-loop-6bd5152d46f5cba7", "title": "Disallow loops with a body that allows only one iteration", }, { "description": "ESLint rule **no-unsafe-negation**.", "docsUrl": "https://eslint.org/docs/latest/rules/no-unsafe-negation", - "slug": "no-unsafe-negation", + "slug": "no-unsafe-negation-1c3a548d96c1e95f", "title": "Disallow negating the left operand of relational operators", }, { "description": "ESLint rule **no-unsafe-optional-chaining**.", "docsUrl": "https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining", - "slug": "no-unsafe-optional-chaining", + "slug": "no-unsafe-optional-chaining-0724d742fbe97cb2", "title": "Disallow use of optional chaining in contexts where the \`undefined\` value is not allowed", }, { @@ -60,31 +60,31 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` { "description": "ESLint rule **use-isnan**.", "docsUrl": "https://eslint.org/docs/latest/rules/use-isnan", - "slug": "use-isnan", + "slug": "use-isnan-20b8ba68b5cc1ea7", "title": "Require calls to \`isNaN()\` when checking for \`NaN\`", }, { "description": "ESLint rule **valid-typeof**.", "docsUrl": "https://eslint.org/docs/latest/rules/valid-typeof", - "slug": "valid-typeof", + "slug": "valid-typeof-19926c783be07085", "title": "Enforce comparing \`typeof\` expressions against valid strings", }, { "description": "ESLint rule **arrow-body-style**.", "docsUrl": "https://eslint.org/docs/latest/rules/arrow-body-style", - "slug": "arrow-body-style", + "slug": "arrow-body-style-61b676e8783b0a34", "title": "Require braces around arrow function bodies", }, { "description": "ESLint rule **camelcase**.", "docsUrl": "https://eslint.org/docs/latest/rules/camelcase", - "slug": "camelcase", + "slug": "camelcase-3568b92e56d6fcb0", "title": "Enforce camelcase naming convention", }, { "description": "ESLint rule **curly**.", "docsUrl": "https://eslint.org/docs/latest/rules/curly", - "slug": "curly", + "slug": "curly-da196f7d88e0421b", "title": "Enforce consistent brace style for all control statements", }, { @@ -108,7 +108,7 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` { "description": "ESLint rule **no-shadow**.", "docsUrl": "https://eslint.org/docs/latest/rules/no-shadow", - "slug": "no-shadow", + "slug": "no-shadow-b9e07f46bb0b5444", "title": "Disallow variable declarations from shadowing variables declared in the outer scope", }, { @@ -126,13 +126,13 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` { "description": "ESLint rule **prefer-arrow-callback**.", "docsUrl": "https://eslint.org/docs/latest/rules/prefer-arrow-callback", - "slug": "prefer-arrow-callback", + "slug": "prefer-arrow-callback-81999cc2a4967394", "title": "Require using arrow functions for callbacks", }, { "description": "ESLint rule **prefer-const**.", "docsUrl": "https://eslint.org/docs/latest/rules/prefer-const", - "slug": "prefer-const", + "slug": "prefer-const-519d0b1dc698e7d6", "title": "Require \`const\` declarations for variables that are never reassigned after declared", }, { @@ -144,7 +144,7 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` { "description": "ESLint rule **yoda**.", "docsUrl": "https://eslint.org/docs/latest/rules/yoda", - "slug": "yoda", + "slug": "yoda-e0d68df5f54f65ab", "title": "Require or disallow "Yoda" conditions", }, { @@ -197,7 +197,7 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` "description": "Code that either will cause an error or may cause confusing behavior. Developers should consider this a high priority to resolve.", "refs": [ { - "slug": "no-cond-assign", + "slug": "no-cond-assign-4da1eac06e945b1a", "weight": 1, }, { @@ -209,23 +209,23 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` "weight": 1, }, { - "slug": "no-invalid-regexp", + "slug": "no-invalid-regexp-9b874a94de5d65c6", "weight": 1, }, { - "slug": "no-undef", + "slug": "no-undef-1c0a571cbd314966", "weight": 1, }, { - "slug": "no-unreachable-loop", + "slug": "no-unreachable-loop-6bd5152d46f5cba7", "weight": 1, }, { - "slug": "no-unsafe-negation", + "slug": "no-unsafe-negation-1c3a548d96c1e95f", "weight": 1, }, { - "slug": "no-unsafe-optional-chaining", + "slug": "no-unsafe-optional-chaining-0724d742fbe97cb2", "weight": 1, }, { @@ -233,11 +233,11 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` "weight": 1, }, { - "slug": "use-isnan", + "slug": "use-isnan-20b8ba68b5cc1ea7", "weight": 1, }, { - "slug": "valid-typeof", + "slug": "valid-typeof-19926c783be07085", "weight": 1, }, { @@ -252,15 +252,15 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` "description": "Something that could be done in a better way but no errors will occur if the code isn't changed.", "refs": [ { - "slug": "arrow-body-style", + "slug": "arrow-body-style-61b676e8783b0a34", "weight": 1, }, { - "slug": "camelcase", + "slug": "camelcase-3568b92e56d6fcb0", "weight": 1, }, { - "slug": "curly", + "slug": "curly-da196f7d88e0421b", "weight": 1, }, { @@ -276,7 +276,7 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` "weight": 1, }, { - "slug": "no-shadow", + "slug": "no-shadow-b9e07f46bb0b5444", "weight": 1, }, { @@ -288,11 +288,11 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` "weight": 1, }, { - "slug": "prefer-arrow-callback", + "slug": "prefer-arrow-callback-81999cc2a4967394", "weight": 1, }, { - "slug": "prefer-const", + "slug": "prefer-const-519d0b1dc698e7d6", "weight": 1, }, { @@ -300,7 +300,7 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1` "weight": 1, }, { - "slug": "yoda", + "slug": "yoda-e0d68df5f54f65ab", "weight": 1, }, { diff --git a/packages/plugin-eslint/src/lib/__snapshots__/runner.integration.test.ts.snap b/packages/plugin-eslint/src/lib/__snapshots__/runner.integration.test.ts.snap index 0c9001469..a1ff1b6b3 100644 --- a/packages/plugin-eslint/src/lib/__snapshots__/runner.integration.test.ts.snap +++ b/packages/plugin-eslint/src/lib/__snapshots__/runner.integration.test.ts.snap @@ -8,7 +8,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "no-cond-assign", + "slug": "no-cond-assign-4da1eac06e945b1a", "value": 0, }, { @@ -35,7 +35,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "no-invalid-regexp", + "slug": "no-invalid-regexp-9b874a94de5d65c6", "value": 0, }, { @@ -44,7 +44,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "no-undef", + "slug": "no-undef-1c0a571cbd314966", "value": 0, }, { @@ -53,7 +53,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "no-unreachable-loop", + "slug": "no-unreachable-loop-6bd5152d46f5cba7", "value": 0, }, { @@ -62,7 +62,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "no-unsafe-negation", + "slug": "no-unsafe-negation-1c3a548d96c1e95f", "value": 0, }, { @@ -71,7 +71,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "no-unsafe-optional-chaining", + "slug": "no-unsafe-optional-chaining-0724d742fbe97cb2", "value": 0, }, { @@ -103,7 +103,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "use-isnan", + "slug": "use-isnan-20b8ba68b5cc1ea7", "value": 0, }, { @@ -112,7 +112,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "valid-typeof", + "slug": "valid-typeof-19926c783be07085", "value": 0, }, { @@ -135,7 +135,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "1 warning", "score": 0, - "slug": "arrow-body-style", + "slug": "arrow-body-style-61b676e8783b0a34", "value": 1, }, { @@ -144,7 +144,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "camelcase", + "slug": "camelcase-3568b92e56d6fcb0", "value": 0, }, { @@ -153,7 +153,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "curly", + "slug": "curly-da196f7d88e0421b", "value": 0, }, { @@ -257,7 +257,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "3 warnings", "score": 0, - "slug": "no-shadow", + "slug": "no-shadow-b9e07f46bb0b5444", "value": 3, }, { @@ -324,7 +324,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "prefer-arrow-callback", + "slug": "prefer-arrow-callback-81999cc2a4967394", "value": 0, }, { @@ -347,7 +347,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "1 warning", "score": 0, - "slug": "prefer-const", + "slug": "prefer-const-519d0b1dc698e7d6", "value": 1, }, { @@ -365,7 +365,7 @@ exports[`executeRunner > should execute ESLint and create audit results for Reac }, "displayValue": "passed", "score": 1, - "slug": "yoda", + "slug": "yoda-e0d68df5f54f65ab", "value": 0, }, { diff --git a/packages/plugin-eslint/src/lib/eslint-plugin.integration.test.ts b/packages/plugin-eslint/src/lib/eslint-plugin.integration.test.ts index f0b3bd403..afb82191a 100644 --- a/packages/plugin-eslint/src/lib/eslint-plugin.integration.test.ts +++ b/packages/plugin-eslint/src/lib/eslint-plugin.integration.test.ts @@ -1,15 +1,15 @@ import os from 'node:os'; -import { dirname, join } from 'node:path'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { MockInstance } from 'vitest'; import type { Audit, PluginConfig, RunnerConfig } from '@code-pushup/models'; import { toUnixPath } from '@code-pushup/utils'; -import { eslintPlugin } from './eslint-plugin'; +import { eslintPlugin } from './eslint-plugin.js'; describe('eslintPlugin', () => { - const thisDir = fileURLToPath(dirname(import.meta.url)); + const thisDir = fileURLToPath(path.dirname(import.meta.url)); - const fixturesDir = join(thisDir, '..', '..', 'mocks', 'fixtures'); + const fixturesDir = path.join(thisDir, '..', '..', 'mocks', 'fixtures'); let cwdSpy: MockInstance<[], string>; let platformSpy: MockInstance<[], NodeJS.Platform>; @@ -19,7 +19,7 @@ describe('eslintPlugin', () => { runner: { ...(plugin.runner as RunnerConfig), args: (plugin.runner as RunnerConfig).args?.map(arg => - toUnixPath(arg.replace(thisDir, '')), + toUnixPath(arg.replace(path.dirname(thisDir), '')), ), outputFile: toUnixPath((plugin.runner as RunnerConfig).outputFile), }, @@ -37,9 +37,9 @@ describe('eslintPlugin', () => { }); it('should initialize ESLint plugin for React application', async () => { - cwdSpy.mockReturnValue(join(fixturesDir, 'todos-app')); + cwdSpy.mockReturnValue(path.join(fixturesDir, 'todos-app')); const plugin = await eslintPlugin({ - eslintrc: '.eslintrc.js', + eslintrc: 'eslint.config.js', patterns: ['src/**/*.js', 'src/**/*.jsx'], }); @@ -49,13 +49,13 @@ describe('eslintPlugin', () => { }); it('should initialize ESLint plugin for Nx project', async () => { - cwdSpy.mockReturnValue(join(fixturesDir, 'nx-monorepo')); + cwdSpy.mockReturnValue(path.join(fixturesDir, 'nx-monorepo')); const plugin = await eslintPlugin({ - eslintrc: './packages/utils/.eslintrc.json', - patterns: ['packages/utils/**/*.ts', 'packages/utils/**/*.json'], + eslintrc: './packages/nx-plugin/eslint.config.js', + patterns: ['packages/nx-plugin/**/*.ts', 'packages/nx-plugin/**/*.json'], }); - // expect rule from extended base .eslintrc.json + // expect rule from extended base eslint.config.js expect(plugin.audits).toContainEqual( expect.objectContaining({ slug: expect.stringMatching(/^nx-enforce-module-boundaries/), @@ -63,10 +63,10 @@ describe('eslintPlugin', () => { description: expect.stringContaining('sourceTag'), }), ); - // expect rule from utils project's .eslintrc.json + // expect rule from nx-plugin project's eslint.config.js expect(plugin.audits).toContainEqual( expect.objectContaining>({ - slug: 'nx-dependency-checks', + slug: 'nx-nx-plugin-checks', }), ); }); @@ -81,6 +81,6 @@ describe('eslintPlugin', () => { it("should throw if eslintrc file doesn't exist", async () => { await expect( eslintPlugin({ eslintrc: '.eslintrc.yml', patterns: '**/*.js' }), - ).rejects.toThrow('Cannot read config file'); + ).rejects.toThrow(/Failed to load url .*\.eslintrc.yml/); }); }); diff --git a/packages/plugin-eslint/src/lib/eslint-plugin.ts b/packages/plugin-eslint/src/lib/eslint-plugin.ts index 8a70cc2d0..1393bad09 100644 --- a/packages/plugin-eslint/src/lib/eslint-plugin.ts +++ b/packages/plugin-eslint/src/lib/eslint-plugin.ts @@ -1,10 +1,10 @@ -import { dirname, join } from 'node:path'; +import { createRequire } from 'node:module'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { PluginConfig } from '@code-pushup/models'; -import { name, version } from '../../package.json'; -import { type ESLintPluginConfig, eslintPluginConfigSchema } from './config'; -import { listAuditsAndGroups } from './meta'; -import { createRunnerConfig } from './runner'; +import { type ESLintPluginConfig, eslintPluginConfigSchema } from './config.js'; +import { listAuditsAndGroups } from './meta/index.js'; +import { createRunnerConfig } from './runner/index.js'; /** * Instantiates Code PushUp ESLint plugin for use in core config. @@ -33,19 +33,24 @@ export async function eslintPlugin( const { audits, groups } = await listAuditsAndGroups(targets); - const runnerScriptPath = join( - fileURLToPath(dirname(import.meta.url)), + const runnerScriptPath = path.join( + fileURLToPath(path.dirname(import.meta.url)), + '..', 'bin.js', ); + const packageJson = createRequire(import.meta.url)( + '../../package.json', + ) as typeof import('../../package.json'); + return { slug: 'eslint', title: 'ESLint', icon: 'eslint', description: 'Official Code PushUp ESLint plugin', docsUrl: 'https://www.npmjs.com/package/@code-pushup/eslint-plugin', - packageName: name, - version, + packageName: packageJson.name, + version: packageJson.version, audits, groups, diff --git a/packages/plugin-eslint/src/lib/meta/groups.ts b/packages/plugin-eslint/src/lib/meta/groups.ts index 534dee7f9..b7250aca2 100644 --- a/packages/plugin-eslint/src/lib/meta/groups.ts +++ b/packages/plugin-eslint/src/lib/meta/groups.ts @@ -1,8 +1,8 @@ import type { Rule } from 'eslint'; import type { Group, GroupRef } from '@code-pushup/models'; import { objectToKeys, slugify } from '@code-pushup/utils'; -import { ruleIdToSlug } from './hash'; -import { type RuleData, parseRuleId } from './parse'; +import { ruleToSlug } from './hash.js'; +import { type RuleData, parseRuleId } from './parse.js'; type RuleType = NonNullable; @@ -32,12 +32,15 @@ export function groupsFromRuleTypes(rules: RuleData[]): Group[] { const allTypes = objectToKeys(typeGroups); const auditSlugsMap = rules.reduce>>( - (acc, { meta: { type }, ruleId, options }) => - type == null + (acc, rule) => + rule.meta.type == null ? acc : { ...acc, - [type]: [...(acc[type] ?? []), ruleIdToSlug(ruleId, options)], + [rule.meta.type]: [ + ...(acc[rule.meta.type] ?? []), + ruleToSlug(rule), + ], }, {}, ); @@ -54,21 +57,18 @@ export function groupsFromRuleTypes(rules: RuleData[]): Group[] { export function groupsFromRuleCategories(rules: RuleData[]): Group[] { const categoriesMap = rules.reduce>>( - (acc, { meta: { docs }, ruleId, options }) => { + (acc, rule) => { // meta.docs.category still used by some popular plugins (e.g. import, react, functional) - const category = docs?.category; + const category = rule.meta.docs?.category; if (!category) { return acc; } - const { plugin = '' } = parseRuleId(ruleId); + const { plugin = '' } = parseRuleId(rule.id); return { ...acc, [plugin]: { ...acc[plugin], - [category]: [ - ...(acc[plugin]?.[category] ?? []), - ruleIdToSlug(ruleId, options), - ], + [category]: [...(acc[plugin]?.[category] ?? []), ruleToSlug(rule)], }, }; }, diff --git a/packages/plugin-eslint/src/lib/meta/groups.unit.test.ts b/packages/plugin-eslint/src/lib/meta/groups.unit.test.ts index 006d477f4..1b9070ee8 100644 --- a/packages/plugin-eslint/src/lib/meta/groups.unit.test.ts +++ b/packages/plugin-eslint/src/lib/meta/groups.unit.test.ts @@ -1,10 +1,10 @@ import type { Group } from '@code-pushup/models'; -import { groupsFromRuleCategories, groupsFromRuleTypes } from './groups'; -import type { RuleData } from './parse'; +import { groupsFromRuleCategories, groupsFromRuleTypes } from './groups.js'; +import type { RuleData } from './parse.js'; const eslintRules: RuleData[] = [ { - ruleId: 'no-var', + id: 'no-var', meta: { docs: { description: 'Require `let` or `const` instead of `var`', @@ -21,7 +21,7 @@ const eslintRules: RuleData[] = [ options: [], }, { - ruleId: 'no-const-assign', + id: 'no-const-assign', meta: { docs: { description: 'Disallow reassigning `const` variables', @@ -37,7 +37,7 @@ const eslintRules: RuleData[] = [ options: [], }, { - ruleId: 'no-debugger', + id: 'no-debugger', meta: { type: 'problem', docs: { @@ -53,7 +53,7 @@ const eslintRules: RuleData[] = [ options: [], }, { - ruleId: 'react/jsx-key', + id: 'react/jsx-key', meta: { docs: { category: 'Possible Errors', @@ -66,7 +66,7 @@ const eslintRules: RuleData[] = [ options: [], }, { - ruleId: 'react/react-in-jsx-scope', + id: 'react/react-in-jsx-scope', meta: { docs: { description: 'Disallow missing React when using JSX', @@ -82,7 +82,7 @@ const eslintRules: RuleData[] = [ options: [], }, { - ruleId: 'react/no-deprecated', + id: 'react/no-deprecated', meta: { docs: { description: 'Disallow usage of deprecated methods', @@ -99,7 +99,7 @@ const eslintRules: RuleData[] = [ options: [], }, { - ruleId: '@typescript-eslint/no-array-constructor', + id: '@typescript-eslint/no-array-constructor', meta: { type: 'suggestion', docs: { diff --git a/packages/plugin-eslint/src/lib/meta/hash.ts b/packages/plugin-eslint/src/lib/meta/hash.ts index a5849ecf8..bf8fa30fe 100644 --- a/packages/plugin-eslint/src/lib/meta/hash.ts +++ b/packages/plugin-eslint/src/lib/meta/hash.ts @@ -1,5 +1,10 @@ import { createHash } from 'node:crypto'; import { slugify } from '@code-pushup/utils'; +import { type RuleData, resolveRuleOptions } from './parse.js'; + +export function ruleToSlug(rule: RuleData): string { + return ruleIdToSlug(rule.id, resolveRuleOptions(rule)); +} export function ruleIdToSlug( ruleId: string, diff --git a/packages/plugin-eslint/src/lib/meta/hash.unit.test.ts b/packages/plugin-eslint/src/lib/meta/hash.unit.test.ts index f04377202..d7c42f7d4 100644 --- a/packages/plugin-eslint/src/lib/meta/hash.unit.test.ts +++ b/packages/plugin-eslint/src/lib/meta/hash.unit.test.ts @@ -1,4 +1,4 @@ -import { jsonHash, ruleIdToSlug } from './hash'; +import { jsonHash, ruleIdToSlug } from './hash.js'; describe('ruleIdToSlug', () => { it('should leave core rule unchanged', () => { diff --git a/packages/plugin-eslint/src/lib/meta/index.ts b/packages/plugin-eslint/src/lib/meta/index.ts index 1252c8778..2b4f61728 100644 --- a/packages/plugin-eslint/src/lib/meta/index.ts +++ b/packages/plugin-eslint/src/lib/meta/index.ts @@ -1,8 +1,11 @@ import type { Audit, Group } from '@code-pushup/models'; -import type { ESLintTarget } from '../config'; -import { groupsFromRuleCategories, groupsFromRuleTypes } from './groups'; -import { listRules } from './rules'; -import { ruleToAudit } from './transform'; +import type { ESLintTarget } from '../config.js'; +import { groupsFromRuleCategories, groupsFromRuleTypes } from './groups.js'; +import { listRules } from './rules.js'; +import { ruleToAudit } from './transform.js'; + +export { ruleIdToSlug } from './hash.js'; +export { detectConfigVersion, type ConfigFormat } from './versions/index.js'; export async function listAuditsAndGroups( targets: ESLintTarget[], diff --git a/packages/plugin-eslint/src/lib/meta/parse.ts b/packages/plugin-eslint/src/lib/meta/parse.ts index 31523a39c..47d1ca6cb 100644 --- a/packages/plugin-eslint/src/lib/meta/parse.ts +++ b/packages/plugin-eslint/src/lib/meta/parse.ts @@ -2,14 +2,16 @@ import type { Linter, Rule } from 'eslint'; import { toArray } from '@code-pushup/utils'; export type RuleData = { - ruleId: string; + id: string; meta: Rule.RuleMetaData; options: unknown[] | undefined; }; export function parseRuleId(ruleId: string): { plugin?: string; name: string } { - const i = ruleId.lastIndexOf('/'); - if (i < 0) { + const i = ruleId.startsWith('@') + ? ruleId.lastIndexOf('/') + : ruleId.indexOf('/'); + if (i === -1) { return { name: ruleId }; } return { @@ -38,3 +40,10 @@ export function optionsFromRuleEntry( ): unknown[] { return toArray(entry).slice(1); } + +export function resolveRuleOptions(rule: RuleData): unknown[] | undefined { + if (rule.options?.length) { + return rule.options; + } + return rule.meta.defaultOptions; +} diff --git a/packages/plugin-eslint/src/lib/meta/parse.unit.test.ts b/packages/plugin-eslint/src/lib/meta/parse.unit.test.ts index 6817fc3d2..2781d64a9 100644 --- a/packages/plugin-eslint/src/lib/meta/parse.unit.test.ts +++ b/packages/plugin-eslint/src/lib/meta/parse.unit.test.ts @@ -1,5 +1,10 @@ import type { Linter } from 'eslint'; -import { isRuleOff, optionsFromRuleEntry, parseRuleId } from './parse'; +import { + isRuleOff, + optionsFromRuleEntry, + parseRuleId, + resolveRuleOptions, +} from './parse.js'; describe('parseRuleId', () => { it.each([ @@ -27,6 +32,11 @@ describe('parseRuleId', () => { plugin: '@angular-eslint/template', name: 'no-negated-async', }, + { + ruleId: 'n/prefer-promises/fs', + plugin: 'n', + name: 'prefer-promises/fs', + }, ])('$ruleId => name: $name, plugin: $plugin', ({ ruleId, name, plugin }) => { expect(parseRuleId(ruleId)).toEqual({ name, plugin }); }); @@ -83,3 +93,31 @@ describe('optionsFromRuleEntry', () => { expect(optionsFromRuleEntry(['warn'])).toEqual([]); }); }); + +describe('resolveRuleOptions', () => { + it('should prioritize custom options', () => { + expect( + resolveRuleOptions({ + id: 'arrow-body-style', + options: ['always'], + meta: { defaultOptions: ['as-needed'] }, + }), + ).toEqual(['always']); + }); + + it('should fallback to default options if no custom options', () => { + expect( + resolveRuleOptions({ + id: 'arrow-body-style', + options: [], + meta: { defaultOptions: ['as-needed'] }, + }), + ).toEqual(['as-needed']); + }); + + it('should return undefined if neither custom not default options are set', () => { + expect( + resolveRuleOptions({ id: 'require-await', options: [], meta: {} }), + ).toBeUndefined(); + }); +}); diff --git a/packages/plugin-eslint/src/lib/meta/rules.unit.test.ts b/packages/plugin-eslint/src/lib/meta/rules.integration.test.ts similarity index 82% rename from packages/plugin-eslint/src/lib/meta/rules.unit.test.ts rename to packages/plugin-eslint/src/lib/meta/rules.integration.test.ts index e70a6a1e8..6526243d7 100644 --- a/packages/plugin-eslint/src/lib/meta/rules.unit.test.ts +++ b/packages/plugin-eslint/src/lib/meta/rules.integration.test.ts @@ -1,13 +1,13 @@ -import { dirname, join } from 'node:path'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { MockInstance } from 'vitest'; -import type { ESLintTarget } from '../config'; -import type { RuleData } from './parse'; -import { listRules } from './rules'; +import type { ESLintTarget } from '../config.js'; +import type { RuleData } from './parse.js'; +import { listRules } from './rules.js'; describe('listRules', () => { - const fixturesDir = join( - fileURLToPath(dirname(import.meta.url)), + const fixturesDir = path.join( + fileURLToPath(path.dirname(import.meta.url)), '..', '..', '..', @@ -26,8 +26,8 @@ describe('listRules', () => { }); describe('React app', () => { - const appRootDir = join(fixturesDir, 'todos-app'); - const eslintrc = join(appRootDir, '.eslintrc.js'); + const appRootDir = path.join(fixturesDir, 'todos-app'); + const eslintrc = path.join(appRootDir, 'eslint.config.js'); const patterns = ['src/**/*.js', 'src/**/*.jsx']; const targets: ESLintTarget[] = [{ eslintrc, patterns }]; @@ -42,7 +42,7 @@ describe('listRules', () => { it('should include explicitly set built-in rule', async () => { await expect(listRules(targets)).resolves.toContainEqual({ - ruleId: 'no-const-assign', + id: 'no-const-assign', meta: { docs: { description: 'Disallow reassigning `const` variables', @@ -61,7 +61,7 @@ describe('listRules', () => { it('should include explicitly set plugin rule', async () => { await expect(listRules(targets)).resolves.toContainEqual({ - ruleId: 'react/jsx-key', + id: 'react/jsx-key', meta: { docs: { category: 'Possible Errors', @@ -89,8 +89,8 @@ describe('listRules', () => { }); describe('Nx monorepo project', () => { - const nxRootDir = join(fixturesDir, 'nx-monorepo'); - const eslintrc = join(nxRootDir, 'packages/utils/.eslintrc.json'); + const nxRootDir = path.join(fixturesDir, 'nx-monorepo'); + const eslintrc = path.join(nxRootDir, 'packages/utils/eslint.config.js'); const patterns = ['packages/utils/**/*.ts', 'packages/utils/**/*.json']; const targets: ESLintTarget[] = [{ eslintrc, patterns }]; @@ -105,13 +105,12 @@ describe('listRules', () => { }); it('should include explicitly set plugin rule with custom options', async () => { - // set in root .eslintrc.json + // set in root eslint.config.js await expect(listRules(targets)).resolves.toContainEqual({ - ruleId: '@nx/enforce-module-boundaries', + id: '@nx/enforce-module-boundaries', meta: expect.any(Object), options: [ - { - allow: [], + expect.objectContaining({ depConstraints: [ { onlyDependOnLibsWithTags: ['*'], @@ -119,7 +118,7 @@ describe('listRules', () => { }, ], enforceBuildableLibDependency: true, - }, + }), ], } satisfies RuleData); }); @@ -127,7 +126,7 @@ describe('listRules', () => { it('should include built-in rule set implicitly by extending recommended config', async () => { // extended via @nx/typescript -> @typescript-eslint/eslint-recommended await expect(listRules(targets)).resolves.toContainEqual({ - ruleId: 'no-var', + id: 'no-var', meta: expect.any(Object), options: [], } as RuleData); @@ -136,7 +135,7 @@ describe('listRules', () => { it('should include plugin rule set implicitly by extending recommended config', async () => { // extended via @nx/typescript -> @typescript-eslint/recommended await expect(listRules(targets)).resolves.toContainEqual({ - ruleId: '@typescript-eslint/no-unused-vars', + id: '@typescript-eslint/no-unused-vars', meta: expect.any(Object), options: [], } satisfies RuleData); @@ -146,17 +145,17 @@ describe('listRules', () => { // extended TypeScript config sets "no-unused-semi": "off" await expect(listRules(targets)).resolves.not.toContainEqual( expect.objectContaining({ - ruleId: 'no-unused-vars', + id: 'no-unused-expressions', } satisfies Partial), ); }); it('should include rule added to root config by project config', async () => { - // set only in packages/utils/.eslintrc.json + // set only in packages/utils/eslint.config.js await expect(listRules(targets)).resolves.toContainEqual({ - ruleId: '@nx/dependency-checks', + id: '@nx/dependency-checks', meta: expect.any(Object), - options: [], + options: expect.any(Array), } satisfies RuleData); }); }); diff --git a/packages/plugin-eslint/src/lib/meta/rules.ts b/packages/plugin-eslint/src/lib/meta/rules.ts index 839308085..2750a7b8a 100644 --- a/packages/plugin-eslint/src/lib/meta/rules.ts +++ b/packages/plugin-eslint/src/lib/meta/rules.ts @@ -1,7 +1,7 @@ -import type { ESLintTarget } from '../config'; -import { jsonHash } from './hash'; -import type { RuleData } from './parse'; -import { detectConfigVersion, selectRulesLoader } from './versions'; +import type { ESLintTarget } from '../config.js'; +import { jsonHash } from './hash.js'; +import type { RuleData } from './parse.js'; +import { detectConfigVersion, selectRulesLoader } from './versions/index.js'; type RulesMap = Record>; @@ -21,8 +21,8 @@ export async function listRules(targets: ESLintTarget[]): Promise { function mergeRuleIntoMap(map: RulesMap, rule: RuleData): RulesMap { return { ...map, - [rule.ruleId]: { - ...map[rule.ruleId], + [rule.id]: { + ...map[rule.id], [jsonHash(rule.options)]: rule, }, }; diff --git a/packages/plugin-eslint/src/lib/meta/transform.ts b/packages/plugin-eslint/src/lib/meta/transform.ts index 549aeed6d..459ca554c 100644 --- a/packages/plugin-eslint/src/lib/meta/transform.ts +++ b/packages/plugin-eslint/src/lib/meta/transform.ts @@ -1,28 +1,28 @@ import type { Audit } from '@code-pushup/models'; import { truncateDescription, truncateTitle } from '@code-pushup/utils'; -import { ruleIdToSlug } from './hash'; -import type { RuleData } from './parse'; +import { ruleToSlug } from './hash.js'; +import type { RuleData } from './parse.js'; -export function ruleToAudit({ ruleId, meta, options }: RuleData): Audit { - const name = ruleId.split('/').at(-1) ?? ruleId; +export function ruleToAudit(rule: RuleData): Audit { + const name = rule.id.split('/').at(-1) ?? rule.id; const plugin = - name === ruleId ? null : ruleId.slice(0, ruleId.lastIndexOf('/')); + name === rule.id ? null : rule.id.slice(0, rule.id.lastIndexOf('/')); const pluginContext = plugin ? `, from _${plugin}_ plugin` : ''; const lines: string[] = [ `ESLint rule **${name}**${pluginContext}.`, - ...(options?.length ? ['Custom options:'] : []), - ...(options?.map(option => + ...(rule.options?.length ? ['Custom options:'] : []), + ...(rule.options?.map(option => ['```json', JSON.stringify(option, null, 2), '```'].join('\n'), ) ?? []), ]; return { - slug: ruleIdToSlug(ruleId, options), - title: truncateTitle(meta.docs?.description ?? name), + slug: ruleToSlug(rule), + title: truncateTitle(rule.meta.docs?.description ?? name), description: truncateDescription(lines.join('\n\n')), - ...(meta.docs?.url && { - docsUrl: meta.docs.url, + ...(rule.meta.docs?.url && { + docsUrl: rule.meta.docs.url, }), }; } diff --git a/packages/plugin-eslint/src/lib/meta/transform.unit.test.ts b/packages/plugin-eslint/src/lib/meta/transform.unit.test.ts index 2be905995..8d3b2951a 100644 --- a/packages/plugin-eslint/src/lib/meta/transform.unit.test.ts +++ b/packages/plugin-eslint/src/lib/meta/transform.unit.test.ts @@ -1,11 +1,11 @@ import type { Audit } from '@code-pushup/models'; -import { ruleToAudit } from './transform'; +import { ruleToAudit } from './transform.js'; describe('ruleToAudit', () => { it('built-in rule without custom options', () => { expect( ruleToAudit({ - ruleId: 'no-invalid-regexp', + id: 'no-invalid-regexp', meta: { docs: { description: @@ -27,7 +27,7 @@ describe('ruleToAudit', () => { it('plugin rule without custom options', () => { expect( ruleToAudit({ - ruleId: '@typescript-eslint/no-explicit-any', + id: '@typescript-eslint/no-explicit-any', meta: { docs: { description: 'Disallow the `any` type.', @@ -48,7 +48,7 @@ describe('ruleToAudit', () => { it('plugin rule with custom options object', () => { expect( ruleToAudit({ - ruleId: 'max-lines', + id: 'max-lines', meta: { docs: { description: 'Enforce a maximum number of lines per file', @@ -84,7 +84,7 @@ Custom options: it('built-in rule with custom options array', () => { expect( ruleToAudit({ - ruleId: 'no-restricted-imports', + id: 'no-restricted-imports', meta: { docs: { description: 'Disallow specified modules when loaded by import', @@ -114,7 +114,7 @@ Custom options: it('plugin rule with custom options', () => { expect( ruleToAudit({ - ruleId: 'import/extensions', + id: 'import/extensions', meta: { docs: { description: @@ -148,7 +148,7 @@ Custom options: it('rule with overlong description -> title is truncated', () => { expect( ruleToAudit({ - ruleId: '@angular-eslint/template/mouse-events-have-key-events', + id: '@angular-eslint/template/mouse-events-have-key-events', meta: { docs: { description: diff --git a/packages/plugin-eslint/src/lib/meta/versions/detect.ts b/packages/plugin-eslint/src/lib/meta/versions/detect.ts index 09baca7c6..5fe55214f 100644 --- a/packages/plugin-eslint/src/lib/meta/versions/detect.ts +++ b/packages/plugin-eslint/src/lib/meta/versions/detect.ts @@ -1,6 +1,6 @@ import { ESLint } from 'eslint'; import { fileExists } from '@code-pushup/utils'; -import type { ConfigFormat } from './formats'; +import type { ConfigFormat } from './formats.js'; // relevant ESLint docs: // - https://eslint.org/docs/latest/use/configure/configuration-files diff --git a/packages/plugin-eslint/src/lib/meta/versions/detect.unit.test.ts b/packages/plugin-eslint/src/lib/meta/versions/detect.unit.test.ts index 2aa4ff50a..b9a028ceb 100644 --- a/packages/plugin-eslint/src/lib/meta/versions/detect.unit.test.ts +++ b/packages/plugin-eslint/src/lib/meta/versions/detect.unit.test.ts @@ -1,7 +1,7 @@ import { ESLint } from 'eslint'; import { vol } from 'memfs'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; -import { detectConfigVersion } from './detect'; +import { detectConfigVersion } from './detect.js'; describe('detectConfigVersion', () => { beforeEach(() => { diff --git a/packages/plugin-eslint/src/lib/meta/versions/flat.integration.test.ts b/packages/plugin-eslint/src/lib/meta/versions/flat.integration.test.ts index 8ba0dba7b..757f16718 100644 --- a/packages/plugin-eslint/src/lib/meta/versions/flat.integration.test.ts +++ b/packages/plugin-eslint/src/lib/meta/versions/flat.integration.test.ts @@ -1,11 +1,11 @@ import type { ESLint, Linter, Rule } from 'eslint'; import { mkdir, rm, writeFile } from 'node:fs/promises'; -import { join } from 'node:path'; -import type { RuleData } from '../parse'; -import { loadRulesForFlatConfig } from './flat'; +import path from 'node:path'; +import type { RuleData } from '../parse.js'; +import { loadRulesForFlatConfig } from './flat.js'; describe('loadRulesForFlatConfig', () => { - const workDir = join( + const workDir = path.join( process.cwd(), 'tmp', 'plugin-eslint', @@ -22,14 +22,14 @@ describe('loadRulesForFlatConfig', () => { }); it('should load built-in rules from implicit flat config location', async () => { - const config: Linter.FlatConfig = { + const config: Linter.Config = { rules: { 'no-unused-vars': 'error', 'prefer-const': 'warn', }, }; await writeFile( - join(workDir, 'eslint.config.js'), + path.join(workDir, 'eslint.config.js'), `export default ${JSON.stringify(config, null, 2)}`, ); @@ -40,8 +40,8 @@ describe('loadRulesForFlatConfig', () => { }), }); await expect(loadRulesForFlatConfig({})).resolves.toEqual([ - { ruleId: 'no-unused-vars', meta: expectedMeta, options: [] }, - { ruleId: 'prefer-const', meta: expectedMeta, options: [] }, + { id: 'no-unused-vars', meta: expectedMeta, options: [] }, + { id: 'prefer-const', meta: expectedMeta, options: [] }, ] satisfies RuleData[]); }); @@ -78,7 +78,7 @@ describe('loadRulesForFlatConfig', () => { } as Rule.RuleModule, }, } as ESLint.Plugin; - const config: Linter.FlatConfig[] = [ + const config: Linter.Config[] = [ { plugins: { '@typescript-eslint': tseslint, @@ -102,7 +102,7 @@ describe('loadRulesForFlatConfig', () => { }, ]; await writeFile( - join(workDir, 'code-pushup.eslint.config.js'), + path.join(workDir, 'code-pushup.eslint.config.js'), `export default ${JSON.stringify(config, null, 2)}`, ); @@ -110,7 +110,7 @@ describe('loadRulesForFlatConfig', () => { loadRulesForFlatConfig({ eslintrc: 'code-pushup.eslint.config.js' }), ).resolves.toEqual([ { - ruleId: '@typescript-eslint/no-explicit-any', + id: '@typescript-eslint/no-explicit-any', meta: { docs: { description: 'Disallow the `any` type', @@ -120,7 +120,7 @@ describe('loadRulesForFlatConfig', () => { options: [], }, { - ruleId: 'react-hooks/rules-of-hooks', + id: 'react-hooks/rules-of-hooks', meta: { docs: { description: 'enforces the Rules of Hooks', @@ -130,7 +130,7 @@ describe('loadRulesForFlatConfig', () => { options: [], }, { - ruleId: '@typescript-eslint/no-unsafe-call', + id: '@typescript-eslint/no-unsafe-call', meta: { docs: { description: 'Disallow calling a value with type `any`', @@ -143,7 +143,7 @@ describe('loadRulesForFlatConfig', () => { }); it('should load custom rule options', async () => { - const config: Linter.FlatConfig[] = [ + const config: Linter.Config[] = [ { rules: { complexity: ['warn', 30], @@ -152,18 +152,18 @@ describe('loadRulesForFlatConfig', () => { }, ]; await writeFile( - join(workDir, 'eslint.config.cjs'), + path.join(workDir, 'eslint.config.cjs'), `module.exports = ${JSON.stringify(config, null, 2)}`, ); await expect(loadRulesForFlatConfig({})).resolves.toEqual([ { - ruleId: 'complexity', + id: 'complexity', meta: expect.any(Object), options: [30], }, { - ruleId: 'eqeqeq', + id: 'eqeqeq', meta: expect.any(Object), options: ['always', { null: 'never' }], }, @@ -171,7 +171,7 @@ describe('loadRulesForFlatConfig', () => { }); it('should create multiple rule instances when different options used', async () => { - const config: Linter.FlatConfig[] = [ + const config: Linter.Config[] = [ { rules: { 'max-lines': ['warn', { max: 300 }], @@ -185,18 +185,18 @@ describe('loadRulesForFlatConfig', () => { }, ]; await writeFile( - join(workDir, 'eslint.config.mjs'), + path.join(workDir, 'eslint.config.mjs'), `export default ${JSON.stringify(config, null, 2)}`, ); await expect(loadRulesForFlatConfig({})).resolves.toEqual([ { - ruleId: 'max-lines', + id: 'max-lines', meta: expect.any(Object), options: [{ max: 300 }], }, { - ruleId: 'max-lines', + id: 'max-lines', meta: expect.any(Object), options: [{ max: 500 }], }, diff --git a/packages/plugin-eslint/src/lib/meta/versions/flat.ts b/packages/plugin-eslint/src/lib/meta/versions/flat.ts index 2fca56c38..80e9377ca 100644 --- a/packages/plugin-eslint/src/lib/meta/versions/flat.ts +++ b/packages/plugin-eslint/src/lib/meta/versions/flat.ts @@ -1,17 +1,16 @@ import type { Linter, Rule } from 'eslint'; -// eslint-disable-next-line import/no-deprecated import { builtinRules } from 'eslint/use-at-your-own-risk'; -import { isAbsolute, join } from 'node:path'; +import path from 'node:path'; import { pathToFileURL } from 'node:url'; import { exists, findNearestFile, toArray, ui } from '@code-pushup/utils'; -import type { ESLintTarget } from '../../config'; -import { jsonHash } from '../hash'; +import type { ESLintTarget } from '../../config.js'; +import { jsonHash } from '../hash.js'; import { type RuleData, isRuleOff, optionsFromRuleEntry, parseRuleId, -} from '../parse'; +} from '../parse.js'; export async function loadRulesForFlatConfig({ eslintrc, @@ -24,9 +23,9 @@ export async function loadRulesForFlatConfig({ const rules = findEnabledRulesWithOptions(configs); return rules .map(rule => { - const meta = findRuleMeta(rule.ruleId, configs); + const meta = findRuleMeta(rule.id, configs); if (!meta) { - ui().logger.warning(`Cannot find metadata for rule ${rule.ruleId}`); + ui().logger.warning(`Cannot find metadata for rule ${rule.id}`); return null; } return { ...rule, meta }; @@ -34,7 +33,7 @@ export async function loadRulesForFlatConfig({ .filter(exists); } -type FlatConfig = Linter.FlatConfig | Linter.FlatConfig[]; +type FlatConfig = Linter.Config | Linter.Config[]; async function loadConfigByDefaultLocation(): Promise { const flatConfigFileNames = [ @@ -54,27 +53,29 @@ async function loadConfigByDefaultLocation(): Promise { ); } -async function loadConfigByPath(path: string): Promise { - const absolutePath = isAbsolute(path) ? path : join(process.cwd(), path); +async function loadConfigByPath(configPath: string): Promise { + const absolutePath = path.isAbsolute(configPath) + ? configPath + : path.join(process.cwd(), configPath); const url = pathToFileURL(absolutePath).toString(); const mod = (await import(url)) as FlatConfig | { default: FlatConfig }; return 'default' in mod ? mod.default : mod; } function findEnabledRulesWithOptions( - configs: Linter.FlatConfig[], + configs: Linter.Config[], ): Omit[] { const enabledRules = configs .flatMap(({ rules }) => Object.entries(rules ?? {})) .filter(([, entry]) => entry != null && !isRuleOff(entry)) - .map(([ruleId, entry]) => ({ - ruleId, + .map(([id, entry]) => ({ + id, options: entry ? optionsFromRuleEntry(entry) : [], })); const uniqueRulesMap = new Map( - enabledRules.map(({ ruleId, options }) => [ - `${ruleId}::${jsonHash(options)}`, - { ruleId, options }, + enabledRules.map(({ id, options }) => [ + `${id}::${jsonHash(options)}`, + { id, options }, ]), ); return [...uniqueRulesMap.values()]; @@ -82,7 +83,7 @@ function findEnabledRulesWithOptions( function findRuleMeta( ruleId: string, - configs: Linter.FlatConfig[], + configs: Linter.Config[], ): Rule.RuleMetaData | undefined { const { plugin, name } = parseRuleId(ruleId); if (!plugin) { @@ -92,7 +93,6 @@ function findRuleMeta( } function findBuiltinRuleMeta(name: string): Rule.RuleMetaData | undefined { - // eslint-disable-next-line import/no-deprecated, deprecation/deprecation const rule = builtinRules.get(name); return rule?.meta; } @@ -100,7 +100,7 @@ function findBuiltinRuleMeta(name: string): Rule.RuleMetaData | undefined { function findPluginRuleMeta( plugin: string, name: string, - configs: Linter.FlatConfig[], + configs: Linter.Config[], ): Rule.RuleMetaData | undefined { const config = configs.find(({ plugins = {} }) => plugin in plugins); const rule = config?.plugins?.[plugin]?.rules?.[name]; diff --git a/packages/plugin-eslint/src/lib/meta/versions/index.ts b/packages/plugin-eslint/src/lib/meta/versions/index.ts index e7944ae25..73027db50 100644 --- a/packages/plugin-eslint/src/lib/meta/versions/index.ts +++ b/packages/plugin-eslint/src/lib/meta/versions/index.ts @@ -1,11 +1,11 @@ -import type { ESLintTarget } from '../../config'; -import type { RuleData } from '../parse'; -import { loadRulesForFlatConfig } from './flat'; -import type { ConfigFormat } from './formats'; -import { loadRulesForLegacyConfig } from './legacy'; +import type { ESLintTarget } from '../../config.js'; +import type { RuleData } from '../parse.js'; +import { loadRulesForFlatConfig } from './flat.js'; +import type { ConfigFormat } from './formats.js'; +import { loadRulesForLegacyConfig } from './legacy.js'; -export { detectConfigVersion } from './detect'; -export type { ConfigFormat } from './formats'; +export { detectConfigVersion } from './detect.js'; +export type { ConfigFormat } from './formats.js'; export function selectRulesLoader( version: ConfigFormat, diff --git a/packages/plugin-eslint/src/lib/meta/versions/legacy.ts b/packages/plugin-eslint/src/lib/meta/versions/legacy.ts index 903dda9c7..e44f5145c 100644 --- a/packages/plugin-eslint/src/lib/meta/versions/legacy.ts +++ b/packages/plugin-eslint/src/lib/meta/versions/legacy.ts @@ -1,8 +1,8 @@ import type { ESLint, Linter } from 'eslint'; import { distinct, exists, toArray, ui } from '@code-pushup/utils'; -import type { ESLintTarget } from '../../config'; -import { setupESLint } from '../../setup'; -import { type RuleData, isRuleOff, optionsFromRuleEntry } from '../parse'; +import type { ESLintTarget } from '../../config.js'; +import { setupESLint } from '../../setup.js'; +import { type RuleData, isRuleOff, optionsFromRuleEntry } from '../parse.js'; export async function loadRulesForLegacyConfig({ eslintrc, @@ -13,9 +13,9 @@ export async function loadRulesForLegacyConfig({ const configs = await toArray(patterns).reduce( async (acc, pattern) => [ ...(await acc), - (await eslint.calculateConfigForFile(pattern)) as Linter.Config, + (await eslint.calculateConfigForFile(pattern)) as Linter.LegacyConfig, ], - Promise.resolve([]), + Promise.resolve([]), ); const rulesIds = distinct( @@ -31,21 +31,19 @@ export async function loadRulesForLegacyConfig({ return configs .flatMap(config => Object.entries(config.rules ?? {})) - .map(([ruleId, ruleEntry]): RuleData | null => { - if (ruleEntry == null || isRuleOff(ruleEntry)) { + .map(([id, entry]): RuleData | null => { + if (entry == null || isRuleOff(entry)) { return null; } - const meta = rulesMeta[ruleId]; - if (!meta) { - ui().logger.warning(`Metadata not found for ESLint rule ${ruleId}`); + const ruleMeta = rulesMeta[id]; + if (!ruleMeta) { + ui().logger.warning(`Metadata not found for ESLint rule ${id}`); return null; } - const options = optionsFromRuleEntry(ruleEntry); - return { - ruleId, - meta, - options, - }; + // ignoring meta.defaultOptions to match legacy config handling in calculateConfigForFile + const { defaultOptions: _, ...meta } = ruleMeta; + const options = optionsFromRuleEntry(entry); + return { id, meta, options }; }) .filter(exists); } diff --git a/packages/plugin-eslint/src/lib/nx.integration.test.ts b/packages/plugin-eslint/src/lib/nx.integration.test.ts index 0c19b77c8..0874b39d5 100644 --- a/packages/plugin-eslint/src/lib/nx.integration.test.ts +++ b/packages/plugin-eslint/src/lib/nx.integration.test.ts @@ -1,24 +1,22 @@ -import { dirname, join } from 'node:path'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; -import { setWorkspaceRoot, workspaceRoot } from 'nx/src/utils/workspace-root'; import type { MockInstance } from 'vitest'; -import type { ESLintTarget } from './config'; +import { executeProcess } from '@code-pushup/utils'; +import type { ESLintTarget } from './config.js'; +import { eslintConfigFromNxProject } from './nx/find-project-without-deps.js'; import { eslintConfigFromAllNxProjects, eslintConfigFromNxProjectAndDeps, -} from './nx'; -import { eslintConfigFromNxProject } from './nx/find-project-without-deps'; +} from './nx/index.js'; -const ALL_PROJECTS = ['cli', 'core', 'nx-plugin', 'utils'] as const; -type Project = (typeof ALL_PROJECTS)[number]; +type Project = 'cli' | 'core' | 'nx-plugin' | 'utils'; describe('Nx helpers', () => { let cwdSpy: MockInstance<[], string>; - const originalWorkspaceRoot = workspaceRoot; - beforeAll(() => { - const workspaceDir = join( - fileURLToPath(dirname(import.meta.url)), + beforeAll(async () => { + const workspaceDir = path.join( + fileURLToPath(path.dirname(import.meta.url)), '..', '..', 'mocks', @@ -27,64 +25,35 @@ describe('Nx helpers', () => { ); cwdSpy = vi.spyOn(process, 'cwd').mockReturnValue(workspaceDir); - // eslint-disable-next-line functional/immutable-data - process.env['NX_DAEMON'] = 'false'; - - setWorkspaceRoot(workspaceDir); + // HACK: somehow prevents "Failed to process project graph" errors + await executeProcess({ + command: 'npx nx graph --file=.nx/graph.json', + cwd: workspaceDir, + }); }); afterAll(() => { cwdSpy.mockRestore(); - setWorkspaceRoot(originalWorkspaceRoot); }); describe('create config from all Nx projects', () => { it('should include eslintrc and patterns of each project', async () => { await expect(eslintConfigFromAllNxProjects()).resolves.toEqual([ { - eslintrc: './packages/cli/.eslintrc.json', - patterns: [ - 'packages/cli/**/*.ts', - 'packages/cli/package.json', - 'packages/cli/src/*.spec.ts', - 'packages/cli/src/*.cy.ts', - 'packages/cli/src/*.stories.ts', - 'packages/cli/src/.storybook/main.ts', - ], + eslintrc: './packages/cli/eslint.config.js', + patterns: ['packages/cli'], }, { - eslintrc: './packages/core/.eslintrc.json', - patterns: [ - 'packages/core/**/*.ts', - 'packages/core/package.json', - 'packages/core/src/*.spec.ts', - 'packages/core/src/*.cy.ts', - 'packages/core/src/*.stories.ts', - 'packages/core/src/.storybook/main.ts', - ], + eslintrc: './packages/core/eslint.config.js', + patterns: ['packages/core'], }, { - eslintrc: './packages/nx-plugin/.eslintrc.json', - patterns: [ - 'packages/nx-plugin/**/*.ts', - 'packages/nx-plugin/package.json', - 'packages/nx-plugin/generators.json', - 'packages/nx-plugin/src/*.spec.ts', - 'packages/nx-plugin/src/*.cy.ts', - 'packages/nx-plugin/src/*.stories.ts', - 'packages/nx-plugin/src/.storybook/main.ts', - ], + eslintrc: './packages/nx-plugin/eslint.config.js', + patterns: ['packages/nx-plugin'], }, { - eslintrc: './packages/utils/.eslintrc.json', - patterns: [ - 'packages/utils/**/*.ts', - 'packages/utils/package.json', - 'packages/utils/src/*.spec.ts', - 'packages/utils/src/*.cy.ts', - 'packages/utils/src/*.stories.ts', - 'packages/utils/src/.storybook/main.ts', - ], + eslintrc: './packages/utils/eslint.config.js', + patterns: ['packages/utils'], }, ] satisfies ESLintTarget[]); }); @@ -94,16 +63,8 @@ describe('Nx helpers', () => { eslintConfigFromAllNxProjects({ exclude: ['cli', 'core', 'utils'] }), ).resolves.toEqual([ { - eslintrc: './packages/nx-plugin/.eslintrc.json', - patterns: [ - 'packages/nx-plugin/**/*.ts', - 'packages/nx-plugin/package.json', - 'packages/nx-plugin/generators.json', - 'packages/nx-plugin/src/*.spec.ts', - 'packages/nx-plugin/src/*.cy.ts', - 'packages/nx-plugin/src/*.stories.ts', - 'packages/nx-plugin/src/.storybook/main.ts', - ], + eslintrc: './packages/nx-plugin/eslint.config.js', + patterns: ['packages/nx-plugin'], }, ] satisfies ESLintTarget[]); }); @@ -137,8 +98,8 @@ describe('Nx helpers', () => { expect(targets).toEqual( expectedProjects.map( (p): ESLintTarget => ({ - eslintrc: `./packages/${p}/.eslintrc.json`, - patterns: expect.arrayContaining([`packages/${p}/**/*.ts`]), + eslintrc: `./packages/${p}/eslint.config.js`, + patterns: [`packages/${p}`], }), ), ); @@ -167,8 +128,8 @@ describe('Nx helpers', () => { const targets = await eslintConfigFromNxProject(project); expect(targets).toEqual({ - eslintrc: `./packages/${project}/.eslintrc.json`, - patterns: expect.arrayContaining([`packages/${project}/**/*.ts`]), + eslintrc: `./packages/${project}/eslint.config.js`, + patterns: [`packages/${project}`], }); }, ); diff --git a/packages/plugin-eslint/src/lib/nx/filter-project-graph.unit.test.ts b/packages/plugin-eslint/src/lib/nx/filter-project-graph.unit.test.ts index 291ef7edc..5501a02ca 100644 --- a/packages/plugin-eslint/src/lib/nx/filter-project-graph.unit.test.ts +++ b/packages/plugin-eslint/src/lib/nx/filter-project-graph.unit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { toProjectGraph } from '@code-pushup/test-utils'; -import { filterProjectGraph } from './filter-project-graph'; +import { filterProjectGraph } from './filter-project-graph.js'; describe('filterProjectGraph', () => { it('should exclude specified projects from nodes', () => { diff --git a/packages/plugin-eslint/src/lib/nx/find-all-projects.ts b/packages/plugin-eslint/src/lib/nx/find-all-projects.ts index d33e20a1d..11ecfb284 100644 --- a/packages/plugin-eslint/src/lib/nx/find-all-projects.ts +++ b/packages/plugin-eslint/src/lib/nx/find-all-projects.ts @@ -1,6 +1,6 @@ -import type { ESLintTarget } from '../config'; -import { filterProjectGraph } from './filter-project-graph'; -import { nxProjectsToConfig } from './projects-to-config'; +import type { ESLintTarget } from '../config.js'; +import { filterProjectGraph } from './filter-project-graph.js'; +import { nxProjectsToConfig } from './projects-to-config.js'; /** * Finds all Nx projects in workspace and converts their lint configurations to Code PushUp ESLint plugin parameters. diff --git a/packages/plugin-eslint/src/lib/nx/find-project-with-deps.ts b/packages/plugin-eslint/src/lib/nx/find-project-with-deps.ts index 1c52a7de0..55279f828 100644 --- a/packages/plugin-eslint/src/lib/nx/find-project-with-deps.ts +++ b/packages/plugin-eslint/src/lib/nx/find-project-with-deps.ts @@ -1,6 +1,6 @@ -import type { ESLintTarget } from '../config'; -import { nxProjectsToConfig } from './projects-to-config'; -import { findAllDependencies } from './traverse-graph'; +import type { ESLintTarget } from '../config.js'; +import { nxProjectsToConfig } from './projects-to-config.js'; +import { findAllDependencies } from './traverse-graph.js'; /** * Accepts a target Nx projects, finds projects it depends on, and converts lint configurations to Code PushUp ESLint plugin parameters. diff --git a/packages/plugin-eslint/src/lib/nx/find-project-without-deps.ts b/packages/plugin-eslint/src/lib/nx/find-project-without-deps.ts index 46c7f953e..abf78c56c 100644 --- a/packages/plugin-eslint/src/lib/nx/find-project-without-deps.ts +++ b/packages/plugin-eslint/src/lib/nx/find-project-without-deps.ts @@ -1,5 +1,5 @@ -import type { ESLintTarget } from '../config'; -import { nxProjectsToConfig } from './projects-to-config'; +import type { ESLintTarget } from '../config.js'; +import { nxProjectsToConfig } from './projects-to-config.js'; /** * Accepts a target Nx project, converts its lint configuration to Code PushUp ESLint plugin parameters. diff --git a/packages/plugin-eslint/src/lib/nx/index.ts b/packages/plugin-eslint/src/lib/nx/index.ts index 5cdafbc92..900692698 100644 --- a/packages/plugin-eslint/src/lib/nx/index.ts +++ b/packages/plugin-eslint/src/lib/nx/index.ts @@ -1,7 +1,6 @@ export { - // eslint-disable-next-line deprecation/deprecation - eslintConfigFromNxProjects, eslintConfigFromAllNxProjects, -} from './find-all-projects'; -export { eslintConfigFromNxProject } from './find-project-without-deps'; -export { eslintConfigFromNxProjectAndDeps } from './find-project-with-deps'; + eslintConfigFromNxProjects, +} from './find-all-projects.js'; +export { eslintConfigFromNxProjectAndDeps } from './find-project-with-deps.js'; +export { eslintConfigFromNxProject } from './find-project-without-deps.js'; diff --git a/packages/plugin-eslint/src/lib/nx/projects-to-config.ts b/packages/plugin-eslint/src/lib/nx/projects-to-config.ts index 02bd699bd..54180d7f8 100644 --- a/packages/plugin-eslint/src/lib/nx/projects-to-config.ts +++ b/packages/plugin-eslint/src/lib/nx/projects-to-config.ts @@ -1,10 +1,11 @@ import type { ProjectConfiguration, ProjectGraph } from '@nx/devkit'; -import type { ESLintTarget } from '../config'; +import type { ESLintTarget } from '../config.js'; +import { detectConfigVersion } from '../meta/index.js'; import { - findCodePushupEslintrc, - getEslintConfig, + findCodePushupEslintConfig, + findEslintConfig, getLintFilePatterns, -} from './utils'; +} from './utils.js'; export async function nxProjectsToConfig( projectGraph: ProjectGraph, @@ -21,21 +22,15 @@ export async function nxProjectsToConfig( .filter(predicate) // apply predicate .sort((a, b) => a.root.localeCompare(b.root)); + const format = await detectConfigVersion(); + return Promise.all( projects.map( async (project): Promise => ({ eslintrc: - (await findCodePushupEslintrc(project)) ?? getEslintConfig(project), - patterns: [ - ...getLintFilePatterns(project), - // HACK: ESLint.calculateConfigForFile won't find rules included only for subsets of *.ts when globs used - // so we explicitly provide additional patterns used by @code-pushup/eslint-config to ensure those rules are included - // this workaround won't be necessary once flat configs are stable (much easier to find all rules) - `${project.sourceRoot}/*.spec.ts`, // jest/* and vitest/* rules - `${project.sourceRoot}/*.cy.ts`, // cypress/* rules - `${project.sourceRoot}/*.stories.ts`, // storybook/* rules - `${project.sourceRoot}/.storybook/main.ts`, // storybook/no-uninstalled-addons rule - ], + (await findCodePushupEslintConfig(project, format)) ?? + (await findEslintConfig(project, format)), + patterns: getLintFilePatterns(project, format), }), ), ); diff --git a/packages/plugin-eslint/src/lib/nx/projects-to-config.unit.test.ts b/packages/plugin-eslint/src/lib/nx/projects-to-config.unit.test.ts index ae4c12197..7bf51e644 100644 --- a/packages/plugin-eslint/src/lib/nx/projects-to-config.unit.test.ts +++ b/packages/plugin-eslint/src/lib/nx/projects-to-config.unit.test.ts @@ -1,8 +1,8 @@ import { vol } from 'memfs'; import type { MockInstance } from 'vitest'; import { MEMFS_VOLUME, toProjectGraph } from '@code-pushup/test-utils'; -import type { ESLintPluginConfig, ESLintTarget } from '../config'; -import { nxProjectsToConfig } from './projects-to-config'; +import type { ESLintPluginConfig, ESLintTarget } from '../config.js'; +import { nxProjectsToConfig } from './projects-to-config.js'; describe('nxProjectsToConfig', () => { let cwdSpy: MockInstance<[], string>; @@ -25,18 +25,9 @@ describe('nxProjectsToConfig', () => { const config = await nxProjectsToConfig(projectGraph); expect(config).toEqual([ - { - eslintrc: './apps/client/.eslintrc.json', - patterns: expect.arrayContaining(['apps/client/**/*.ts']), - }, - { - eslintrc: './apps/server/.eslintrc.json', - patterns: expect.arrayContaining(['apps/server/**/*.ts']), - }, - { - eslintrc: './libs/models/.eslintrc.json', - patterns: expect.arrayContaining(['libs/models/**/*.ts']), - }, + { patterns: expect.arrayContaining(['apps/client/**/*.ts']) }, + { patterns: expect.arrayContaining(['apps/server/**/*.ts']) }, + { patterns: expect.arrayContaining(['libs/models/**/*.ts']) }, ]); }); @@ -65,10 +56,7 @@ describe('nxProjectsToConfig', () => { ); expect(config).toEqual([ - { - eslintrc: './libs/models/.eslintrc.json', - patterns: expect.arrayContaining(['libs/models/**/*.ts']), - }, + { patterns: expect.arrayContaining(['libs/models/**/*.ts']) }, ]); }); @@ -107,18 +95,13 @@ describe('nxProjectsToConfig', () => { const config = await nxProjectsToConfig(projectGraph); expect(config).toEqual([ - { - eslintrc: './apps/client/.eslintrc.json', - patterns: expect.arrayContaining(['apps/client/**/*.ts']), - }, - { - eslintrc: './apps/server/.eslintrc.json', - patterns: expect.arrayContaining(['apps/server/**/*.ts']), - }, + { patterns: expect.arrayContaining(['apps/client/**/*.ts']) }, + { patterns: expect.arrayContaining(['apps/server/**/*.ts']) }, ]); }); - it('should use code-pushup.eslintrc.json if available', async () => { + it('should use code-pushup.eslintrc.json if available and using legacy config', async () => { + vi.stubEnv('ESLINT_USE_FLAT_CONFIG', 'false'); vol.fromJSON( { 'apps/client/code-pushup.eslintrc.json': @@ -139,6 +122,45 @@ describe('nxProjectsToConfig', () => { ]); }); + it('should use eslint.strict.config.js if available and using flat config', async () => { + vi.stubEnv('ESLINT_USE_FLAT_CONFIG', 'true'); + vol.fromJSON( + { + 'apps/client/eslint.strict.config.js': 'export default [/*...*/]', + }, + MEMFS_VOLUME, + ); + const projectGraph = toProjectGraph([ + { name: 'client', type: 'app', data: { root: 'apps/client' } }, + ]); + + const config = await nxProjectsToConfig(projectGraph); + + expect(config).toEqual([ + expect.objectContaining>({ + eslintrc: './apps/client/eslint.strict.config.js', + }), + ]); + }); + + it('should NOT use code-pushup.eslintrc.json if available but using flat config', async () => { + vi.stubEnv('ESLINT_USE_FLAT_CONFIG', 'true'); + vol.fromJSON( + { + 'apps/client/code-pushup.eslintrc.json': + '{ "eslintrc": "@code-pushup" }', + }, + MEMFS_VOLUME, + ); + const projectGraph = toProjectGraph([ + { name: 'client', type: 'app', data: { root: 'apps/client' } }, + ]); + + const config = await nxProjectsToConfig(projectGraph); + + expect(config[0]!.eslintrc).toBeUndefined(); + }); + it("should use each project's lint file patterns", async () => { const projectGraph = toProjectGraph([ { @@ -176,14 +198,12 @@ describe('nxProjectsToConfig', () => { await expect(nxProjectsToConfig(projectGraph)).resolves.toEqual([ { - eslintrc: './apps/client/.eslintrc.json', patterns: expect.arrayContaining([ 'apps/client/**/*.ts', 'apps/client/**/*.html', ]), }, { - eslintrc: './apps/server/.eslintrc.json', patterns: expect.arrayContaining(['apps/server/**/*.ts']), }, ] satisfies ESLintPluginConfig); diff --git a/packages/plugin-eslint/src/lib/nx/traverse-graph.unit.test.ts b/packages/plugin-eslint/src/lib/nx/traverse-graph.unit.test.ts index 9c77ffc13..4a5f951e2 100644 --- a/packages/plugin-eslint/src/lib/nx/traverse-graph.unit.test.ts +++ b/packages/plugin-eslint/src/lib/nx/traverse-graph.unit.test.ts @@ -1,5 +1,5 @@ import type { ProjectGraph } from '@nx/devkit'; -import { findAllDependencies } from './traverse-graph'; +import { findAllDependencies } from './traverse-graph.js'; describe('findAllDependencies', () => { const mockProjectGraph = (dependencies: ProjectGraph['dependencies']) => diff --git a/packages/plugin-eslint/src/lib/nx/utils.ts b/packages/plugin-eslint/src/lib/nx/utils.ts index 2169d90f1..17564f2b6 100644 --- a/packages/plugin-eslint/src/lib/nx/utils.ts +++ b/packages/plugin-eslint/src/lib/nx/utils.ts @@ -1,39 +1,105 @@ import type { ProjectConfiguration } from '@nx/devkit'; -import { join } from 'node:path'; +import path from 'node:path'; import { fileExists, toArray } from '@code-pushup/utils'; +import type { ConfigFormat } from '../meta/index.js'; -export async function findCodePushupEslintrc( - project: ProjectConfiguration, -): Promise { - const name = 'code-pushup.eslintrc'; +const ESLINT_CONFIG_EXTENSIONS: Record = { + // https://eslint.org/docs/latest/use/configure/configuration-files#configuration-file-formats + flat: ['js', 'mjs', 'cjs'], + // https://eslint.org/docs/latest/use/configure/configuration-files-deprecated + legacy: ['json', 'js', 'cjs', 'yml', 'yaml'], +}; +const ESLINT_CONFIG_NAMES: Record = { // https://eslint.org/docs/latest/use/configure/configuration-files#configuration-file-formats - const extensions = ['json', 'js', 'cjs', 'yml', 'yaml']; + flat: ['eslint.config'], + // https://eslint.org/docs/latest/use/configure/configuration-files-deprecated + legacy: ['.eslintrc'], +}; - // eslint-disable-next-line functional/no-loop-statements - for (const ext of extensions) { - const filename = `./${project.root}/${name}.${ext}`; - if (await fileExists(join(process.cwd(), filename))) { - return filename; - } - } +const CP_ESLINT_CONFIG_NAMES: Record = { + flat: [ + 'code-pushup.eslint.config', + 'eslint.code-pushup.config', + 'eslint.config.code-pushup', + 'eslint.strict.config', + 'eslint.config.strict', + ], + legacy: ['code-pushup.eslintrc', '.eslintrc.code-pushup', '.eslintrc.strict'], +}; - return null; +export async function findCodePushupEslintConfig( + project: ProjectConfiguration, + format: ConfigFormat, +): Promise { + return findProjectFile(project, { + names: CP_ESLINT_CONFIG_NAMES[format], + extensions: ESLINT_CONFIG_EXTENSIONS[format], + }); } -export function getLintFilePatterns(project: ProjectConfiguration): string[] { +export async function findEslintConfig( + project: ProjectConfiguration, + format: ConfigFormat, +): Promise { const options = project.targets?.['lint']?.options as - | { lintFilePatterns?: string | string[] } + | { eslintConfig?: string } | undefined; - return options?.lintFilePatterns == null - ? [`${project.root}/**/*`] // lintFilePatterns defaults to ["{projectRoot}"] - https://github.com/nrwl/nx/pull/20313 - : toArray(options.lintFilePatterns); + return ( + options?.eslintConfig ?? + (await findProjectFile(project, { + names: ESLINT_CONFIG_NAMES[format], + extensions: ESLINT_CONFIG_EXTENSIONS[format], + })) + ); } -export function getEslintConfig( +export function getLintFilePatterns( project: ProjectConfiguration, -): string | undefined { + format: ConfigFormat, +): string[] { const options = project.targets?.['lint']?.options as - | { eslintConfig?: string } + | { lintFilePatterns?: string | string[] } | undefined; - return options?.eslintConfig ?? `./${project.root}/.eslintrc.json`; + // lintFilePatterns defaults to ["{projectRoot}"] - https://github.com/nrwl/nx/pull/20313 + const defaultPatterns = + format === 'legacy' + ? `${project.root}/**/*` // files not folder needed for legacy because rules detected with ESLint.calculateConfigForFile + : project.root; + const patterns = + options?.lintFilePatterns == null + ? [defaultPatterns] + : toArray(options.lintFilePatterns); + if (format === 'legacy') { + return [ + ...patterns, + // HACK: ESLint.calculateConfigForFile won't find rules included only for subsets of *.ts when globs used + // so we explicitly provide additional patterns used by @code-pushup/eslint-config to ensure those rules are included + // this workaround is only necessary for legacy configs (rules are detected more reliably in flat configs) + `${project.root}/*.spec.ts`, // jest/* and vitest/* rules + `${project.root}/*.cy.ts`, // cypress/* rules + `${project.root}/*.stories.ts`, // storybook/* rules + `${project.root}/.storybook/main.ts`, // storybook/no-uninstalled-addons rule + ]; + } + return patterns; +} + +async function findProjectFile( + project: ProjectConfiguration, + file: { + names: string[]; + extensions: string[]; + }, +): Promise { + // eslint-disable-next-line functional/no-loop-statements + for (const name of file.names) { + // eslint-disable-next-line functional/no-loop-statements + for (const ext of file.extensions) { + const filename = `./${project.root}/${name}.${ext}`; + if (await fileExists(path.join(process.cwd(), filename))) { + return filename; + } + } + } + return undefined; } diff --git a/packages/plugin-eslint/src/lib/nx/utils.unit.test.ts b/packages/plugin-eslint/src/lib/nx/utils.unit.test.ts index 0ab2b3bee..69dd3f58d 100644 --- a/packages/plugin-eslint/src/lib/nx/utils.unit.test.ts +++ b/packages/plugin-eslint/src/lib/nx/utils.unit.test.ts @@ -1,86 +1,366 @@ import { vol } from 'memfs'; -import type { MockInstance } from 'vitest'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; -import { findCodePushupEslintrc } from './utils'; +import { + findCodePushupEslintConfig, + findEslintConfig, + getLintFilePatterns, +} from './utils.js'; -describe('find code-pushup.eslintrc.* file', () => { - let cwdSpy: MockInstance<[], string>; +describe('findCodePushupEslintConfig', () => { + describe('flat config format', () => { + const fileContent = `import javascript from '@code-pushup/eslint-config/javascript';\n\nexport default javascript;\n`; - beforeAll(() => { - cwdSpy = vi.spyOn(process, 'cwd').mockReturnValue(MEMFS_VOLUME); - }); + it('should find code-pushup.eslint.config.js', async () => { + vol.fromJSON( + { + 'packages/cli/code-pushup.eslint.config.js': fileContent, + 'packages/core/code-pushup.eslint.config.js': fileContent, + }, + MEMFS_VOLUME, + ); + + await expect( + findCodePushupEslintConfig({ root: 'packages/cli' }, 'flat'), + ).resolves.toBe('./packages/cli/code-pushup.eslint.config.js'); + }); + + it('should find eslint.config.code-pushup.mjs', async () => { + vol.fromJSON( + { + 'packages/cli/eslint.config.code-pushup.mjs': fileContent, + 'packages/core/eslint.config.code-pushup.mjs': fileContent, + }, + MEMFS_VOLUME, + ); + + await expect( + findCodePushupEslintConfig({ root: 'packages/core' }, 'flat'), + ).resolves.toBe('./packages/core/eslint.config.code-pushup.mjs'); + }); + + it('should find eslint.strict.config.js', async () => { + vol.fromJSON( + { + 'packages/cli/eslint.strict.config.mjs': fileContent, + 'packages/core/eslint.strict.config.js': fileContent, + }, + MEMFS_VOLUME, + ); + + await expect( + findCodePushupEslintConfig({ root: 'packages/core' }, 'flat'), + ).resolves.toBe('./packages/core/eslint.strict.config.js'); + }); + + it('should return undefined if no config exists', async () => { + vol.fromJSON({}, MEMFS_VOLUME); - afterAll(() => { - cwdSpy.mockRestore(); + await expect( + findCodePushupEslintConfig({ root: 'libs/utils' }, 'flat'), + ).resolves.toBeUndefined(); + }); + + it('should return undefined if only standard config exists', async () => { + vol.fromJSON( + { 'libs/utils/eslint.config.js': fileContent }, + MEMFS_VOLUME, + ); + + await expect( + findCodePushupEslintConfig({ root: 'libs/utils' }, 'flat'), + ).resolves.toBeUndefined(); + }); }); - it('should find code-pushup.eslinrc.json', async () => { - vol.fromJSON( - { - 'packages/cli/code-pushup.eslintrc.json': - '{ "extends": "@code-pushup" }', - 'packages/core/code-pushup.eslintrc.json': - '{ "extends": "@code-pushup" }', - }, - MEMFS_VOLUME, - ); + describe('legacy config format', () => { + it('should find code-pushup.eslintrc.json', async () => { + vol.fromJSON( + { + 'packages/cli/code-pushup.eslintrc.json': + '{ "extends": "@code-pushup" }', + 'packages/core/code-pushup.eslintrc.json': + '{ "extends": "@code-pushup" }', + }, + MEMFS_VOLUME, + ); + + await expect( + findCodePushupEslintConfig({ root: 'packages/cli' }, 'legacy'), + ).resolves.toBe('./packages/cli/code-pushup.eslintrc.json'); + }); + + it('should find .eslintrc.code-pushup.json', async () => { + vol.fromJSON( + { + 'packages/cli/.eslintrc.code-pushup.json': + "module.exports = { extends: '@code-pushup' };", + 'packages/core/.eslintrc.code-pushup.json': + "module.exports = { extends: '@code-pushup' };", + }, + MEMFS_VOLUME, + ); + + await expect( + findCodePushupEslintConfig({ root: 'packages/core' }, 'legacy'), + ).resolves.toBe('./packages/core/.eslintrc.code-pushup.json'); + }); + it('should return undefined if no config exists', async () => { + vol.fromJSON({}, MEMFS_VOLUME); + + await expect( + findCodePushupEslintConfig({ root: 'libs/utils' }, 'legacy'), + ).resolves.toBeUndefined(); + }); + + it('should return undefined if only standard config exists', async () => { + vol.fromJSON( + { + 'libs/utils/.eslintrc.json': + '{ "extends": "@code-pushup/eslint-config" }', + }, + MEMFS_VOLUME, + ); + + await expect( + findCodePushupEslintConfig({ root: 'libs/utils' }, 'legacy'), + ).resolves.toBeUndefined(); + }); + }); +}); + +describe('findEslintConfig', () => { + it('should use eslintConfig from project.json if configured', async () => { await expect( - findCodePushupEslintrc({ root: 'packages/cli' }), - ).resolves.toBe('./packages/cli/code-pushup.eslintrc.json'); + findEslintConfig( + { + root: 'packages/cli', + targets: { + lint: { + options: { eslintConfig: 'packages/cli/eslint.ci.config.js' }, + }, + }, + }, + 'flat', + ), + ).resolves.toBe('packages/cli/eslint.ci.config.js'); }); - it('should find code-pushup.eslinrc.js', async () => { - vol.fromJSON( - { - 'packages/cli/code-pushup.eslintrc.json': - '{ "extends": "@code-pushup" }', - 'packages/core/code-pushup.eslintrc.js': - "module.exports = { extends: '@code-pushup' };", - }, - MEMFS_VOLUME, - ); + describe('flat config format', () => { + const fileContent = `import javascript from '@code-pushup/eslint-config/javascript';\n\nexport default javascript;\n`; - await expect( - findCodePushupEslintrc({ root: 'packages/core' }), - ).resolves.toBe('./packages/core/code-pushup.eslintrc.js'); + it('should find eslint.config.js', async () => { + vol.fromJSON( + { + 'packages/cli/eslint.config.js': fileContent, + 'packages/core/eslint.config.js': fileContent, + }, + MEMFS_VOLUME, + ); + + await expect( + findEslintConfig({ root: 'packages/cli' }, 'flat'), + ).resolves.toBe('./packages/cli/eslint.config.js'); + }); + + it('should find eslint.config.mjs', async () => { + vol.fromJSON( + { + 'packages/cli/eslint.config.mjs': fileContent, + 'packages/core/eslint.config.mjs': fileContent, + }, + MEMFS_VOLUME, + ); + + await expect( + findEslintConfig({ root: 'packages/core' }, 'flat'), + ).resolves.toBe('./packages/core/eslint.config.mjs'); + }); + + it('should look for JS extension before MJS', async () => { + vol.fromJSON( + { + 'libs/utils/eslint.config.js': fileContent, + 'libs/utils/eslint.config.mjs': fileContent, + }, + MEMFS_VOLUME, + ); + + await expect( + findEslintConfig({ root: 'libs/utils' }, 'flat'), + ).resolves.toBe('./libs/utils/eslint.config.js'); + }); + + it('should return undefined if no config exists', async () => { + vol.fromJSON({}, MEMFS_VOLUME); + + await expect( + findEslintConfig({ root: 'libs/utils' }, 'flat'), + ).resolves.toBeUndefined(); + }); + + it('should return undefined if only legacy config exists', async () => { + vol.fromJSON( + { 'libs/utils/.eslintrc.json': '{ "extends": "@code-pushup" }' }, + MEMFS_VOLUME, + ); + + await expect( + findEslintConfig({ root: 'libs/utils' }, 'flat'), + ).resolves.toBeUndefined(); + }); }); - it('should look for JSON extension before JavaScript', async () => { - vol.fromJSON( - { - 'libs/utils/code-pushup.eslintrc.js': - "module.exports = { extends: '@code-pushup' };", - 'libs/utils/code-pushup.eslintrc.json': '{ "extends": "@code-pushup" }', - }, - MEMFS_VOLUME, - ); + describe('legacy config format', () => { + it('should find .eslintrc.json', async () => { + vol.fromJSON( + { + 'packages/cli/.eslintrc.json': '{ "extends": "@code-pushup" }', + 'packages/core/.eslintrc.json': '{ "extends": "@code-pushup" }', + }, + MEMFS_VOLUME, + ); - await expect(findCodePushupEslintrc({ root: 'libs/utils' })).resolves.toBe( - './libs/utils/code-pushup.eslintrc.json', - ); + await expect( + findEslintConfig({ root: 'packages/cli' }, 'legacy'), + ).resolves.toBe('./packages/cli/.eslintrc.json'); + }); + + it('should find .eslintrc.js', async () => { + vol.fromJSON( + { + 'packages/cli/.eslintrc.json': '{ "extends": "@code-pushup" }', + 'packages/core/.eslintrc.js': + "module.exports = { extends: '@code-pushup' };", + }, + MEMFS_VOLUME, + ); + + await expect( + findEslintConfig({ root: 'packages/core' }, 'legacy'), + ).resolves.toBe('./packages/core/.eslintrc.js'); + }); + + it('should look for JSON extension before JavaScript', async () => { + vol.fromJSON( + { + 'libs/utils/.eslintrc.js': + "module.exports = { extends: '@code-pushup' };", + 'libs/utils/.eslintrc.json': '{ "extends": "@code-pushup" }', + }, + MEMFS_VOLUME, + ); + + await expect( + findEslintConfig({ root: 'libs/utils' }, 'legacy'), + ).resolves.toBe('./libs/utils/.eslintrc.json'); + }); + + it('should look for JavaScript extensions before YAML', async () => { + vol.fromJSON( + { + 'libs/utils/.eslintrc.cjs': + "module.exports = { extends: '@code-pushup' };", + 'libs/utils/.eslintrc.yml': '- extends: "@code-pushup"\n', + }, + MEMFS_VOLUME, + ); + + await expect( + findEslintConfig({ root: 'libs/utils' }, 'legacy'), + ).resolves.toBe('./libs/utils/.eslintrc.cjs'); + }); + + it('should return undefined if no config exists', async () => { + vol.fromJSON({}, MEMFS_VOLUME); + + await expect( + findEslintConfig({ root: 'libs/utils' }, 'legacy'), + ).resolves.toBeUndefined(); + }); + + it('should return undefined if only flat config exists', async () => { + vol.fromJSON( + { 'libs/utils/eslint.config.js': 'export default [/*...*/]' }, + MEMFS_VOLUME, + ); + + await expect( + findEslintConfig({ root: 'libs/utils' }, 'legacy'), + ).resolves.toBeUndefined(); + }); + }); +}); + +describe('getLintFilePatterns', () => { + it('should get lintFilePatterns from project.json if configured', () => { + expect( + getLintFilePatterns( + { + root: 'apps/website', + targets: { + lint: { + options: { + lintFilePatterns: [ + 'apps/website/**/*.ts', + 'apps/website/**/*.html', + ], + }, + }, + }, + }, + 'flat', + ), + ).toEqual(['apps/website/**/*.ts', 'apps/website/**/*.html']); }); - it('should look for JavaScript extensions before YAML', async () => { - vol.fromJSON( - { - 'libs/utils/code-pushup.eslintrc.cjs': - "module.exports = { extends: '@code-pushup' };", - 'libs/utils/code-pushup.eslintrc.yml': '- extends: "@code-pushup"\n', - }, - MEMFS_VOLUME, - ); + it('should default to project root folder if using flat config', () => { + expect(getLintFilePatterns({ root: 'apps/website' }, 'flat')).toEqual([ + 'apps/website', + ]); + }); - await expect(findCodePushupEslintrc({ root: 'libs/utils' })).resolves.toBe( - './libs/utils/code-pushup.eslintrc.cjs', + it('should default to all files in project root folder if using legacy config', () => { + expect(getLintFilePatterns({ root: 'apps/website' }, 'legacy')).toEqual( + expect.arrayContaining(['apps/website/**/*']), ); }); - it('should return null if not found', async () => { - vol.fromJSON({}, MEMFS_VOLUME); + it('should add additional patterns to defaults if using legacy config', () => { + expect(getLintFilePatterns({ root: 'apps/website' }, 'legacy')).toEqual([ + 'apps/website/**/*', + 'apps/website/*.spec.ts', + 'apps/website/*.cy.ts', + 'apps/website/*.stories.ts', + 'apps/website/.storybook/main.ts', + ]); + }); - await expect( - findCodePushupEslintrc({ root: 'libs/utils' }), - ).resolves.toBeNull(); + it('should add additional patterns to lintFilePatterns if using legacy config', () => { + expect( + getLintFilePatterns( + { + root: 'apps/website', + targets: { + lint: { + options: { + lintFilePatterns: [ + 'apps/website/**/*.ts', + 'apps/website/**/*.html', + ], + }, + }, + }, + }, + 'legacy', + ), + ).toEqual([ + 'apps/website/**/*.ts', + 'apps/website/**/*.html', + 'apps/website/*.spec.ts', + 'apps/website/*.cy.ts', + 'apps/website/*.stories.ts', + 'apps/website/.storybook/main.ts', + ]); }); }); diff --git a/packages/plugin-eslint/src/lib/runner.integration.test.ts b/packages/plugin-eslint/src/lib/runner.integration.test.ts index d354b27f7..5f78884e5 100644 --- a/packages/plugin-eslint/src/lib/runner.integration.test.ts +++ b/packages/plugin-eslint/src/lib/runner.integration.test.ts @@ -1,17 +1,17 @@ import os from 'node:os'; -import { dirname, join } from 'node:path'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { type MockInstance, describe, expect, it } from 'vitest'; import type { AuditOutput, AuditOutputs, Issue } from '@code-pushup/models'; import { osAgnosticAuditOutputs } from '@code-pushup/test-utils'; import { readJsonFile } from '@code-pushup/utils'; -import type { ESLintTarget } from './config'; -import { listAuditsAndGroups } from './meta'; +import type { ESLintTarget } from './config.js'; +import { listAuditsAndGroups } from './meta/index.js'; import { RUNNER_OUTPUT_PATH, createRunnerConfig, executeRunner, -} from './runner'; +} from './runner/index.js'; describe('executeRunner', () => { let cwdSpy: MockInstance<[], string>; @@ -24,8 +24,8 @@ describe('executeRunner', () => { await createRunnerConfig('bin.js', audits, targets); }; - const appDir = join( - fileURLToPath(dirname(import.meta.url)), + const appDir = path.join( + fileURLToPath(path.dirname(import.meta.url)), '..', '..', 'mocks', @@ -45,7 +45,7 @@ describe('executeRunner', () => { }); it('should execute ESLint and create audit results for React application', async () => { - await createPluginConfig('.eslintrc.js'); + await createPluginConfig('eslint.config.js'); await executeRunner(); const json = await readJsonFile(RUNNER_OUTPUT_PATH); @@ -53,7 +53,7 @@ describe('executeRunner', () => { }); it('should execute runner with custom config using @code-pushup/eslint-config', async () => { - await createPluginConfig('code-pushup.eslintrc.yml'); + await createPluginConfig('code-pushup.eslint.config.mjs'); await executeRunner(); const json = await readJsonFile(RUNNER_OUTPUT_PATH); @@ -69,7 +69,7 @@ describe('executeRunner', () => { message: 'Filename is not in kebab case. Rename it to `use-todos.js`.', source: expect.objectContaining({ - file: join(appDir, 'src', 'hooks', 'useTodos.js'), + file: path.join(appDir, 'src', 'hooks', 'useTodos.js'), }), }, ]), diff --git a/packages/plugin-eslint/src/lib/runner/index.ts b/packages/plugin-eslint/src/lib/runner/index.ts index 120cc8eff..fc60360e9 100644 --- a/packages/plugin-eslint/src/lib/runner/index.ts +++ b/packages/plugin-eslint/src/lib/runner/index.ts @@ -1,5 +1,5 @@ import { writeFile } from 'node:fs/promises'; -import { dirname, join } from 'node:path'; +import path from 'node:path'; import type { Audit, AuditOutput, RunnerConfig } from '@code-pushup/models'; import { ensureDirectoryExists, @@ -7,14 +7,14 @@ import { pluginWorkDir, readJsonFile, } from '@code-pushup/utils'; -import type { ESLintPluginRunnerConfig, ESLintTarget } from '../config'; -import { lint } from './lint'; -import { lintResultsToAudits, mergeLinterOutputs } from './transform'; -import type { LinterOutput } from './types'; +import type { ESLintPluginRunnerConfig, ESLintTarget } from '../config.js'; +import { lint } from './lint.js'; +import { lintResultsToAudits, mergeLinterOutputs } from './transform.js'; +import type { LinterOutput } from './types.js'; export const WORKDIR = pluginWorkDir('eslint'); -export const RUNNER_OUTPUT_PATH = join(WORKDIR, 'runner-output.json'); -export const PLUGIN_CONFIG_PATH = join( +export const RUNNER_OUTPUT_PATH = path.join(WORKDIR, 'runner-output.json'); +export const PLUGIN_CONFIG_PATH = path.join( process.cwd(), WORKDIR, 'plugin-config.json', @@ -42,7 +42,7 @@ export async function executeRunner(): Promise { }, ); - await ensureDirectoryExists(dirname(RUNNER_OUTPUT_PATH)); + await ensureDirectoryExists(path.dirname(RUNNER_OUTPUT_PATH)); await writeFile(RUNNER_OUTPUT_PATH, JSON.stringify(audits)); } @@ -55,7 +55,7 @@ export async function createRunnerConfig( targets, slugs: audits.map(audit => audit.slug), }; - await ensureDirectoryExists(dirname(PLUGIN_CONFIG_PATH)); + await ensureDirectoryExists(path.dirname(PLUGIN_CONFIG_PATH)); await writeFile(PLUGIN_CONFIG_PATH, JSON.stringify(config)); return { diff --git a/packages/plugin-eslint/src/lib/runner/lint.ts b/packages/plugin-eslint/src/lib/runner/lint.ts index f1a8595d3..80300ded3 100644 --- a/packages/plugin-eslint/src/lib/runner/lint.ts +++ b/packages/plugin-eslint/src/lib/runner/lint.ts @@ -6,9 +6,9 @@ import { filePathToCliArg, toArray, } from '@code-pushup/utils'; -import type { ESLintTarget } from '../config'; -import { setupESLint } from '../setup'; -import type { LinterOutput, RuleOptionsPerFile } from './types'; +import type { ESLintTarget } from '../config.js'; +import { setupESLint } from '../setup.js'; +import type { LinterOutput, RuleOptionsPerFile } from './types.js'; export async function lint({ eslintrc, diff --git a/packages/plugin-eslint/src/lib/runner/lint.unit.test.ts b/packages/plugin-eslint/src/lib/runner/lint.unit.test.ts index bafabe1e5..c0166b1c4 100644 --- a/packages/plugin-eslint/src/lib/runner/lint.unit.test.ts +++ b/packages/plugin-eslint/src/lib/runner/lint.unit.test.ts @@ -1,8 +1,8 @@ import { ESLint, type Linter } from 'eslint'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; import { executeProcess } from '@code-pushup/utils'; -import type { ESLintPluginConfig } from '../config'; -import { lint } from './lint'; +import type { ESLintPluginConfig } from '../config.js'; +import { lint } from './lint.js'; class MockESLint { calculateConfigForFile = vi.fn().mockImplementation( @@ -32,7 +32,6 @@ vi.mock('eslint', () => ({ vi.mock('@code-pushup/utils', async () => { const utils = await vi.importActual('@code-pushup/utils'); - // eslint-disable-next-line @typescript-eslint/naming-convention const testUtils: { MEMFS_VOLUME: string } = await vi.importActual( '@code-pushup/test-utils', ); diff --git a/packages/plugin-eslint/src/lib/runner/transform.ts b/packages/plugin-eslint/src/lib/runner/transform.ts index a199d9be6..7d30e35ce 100644 --- a/packages/plugin-eslint/src/lib/runner/transform.ts +++ b/packages/plugin-eslint/src/lib/runner/transform.ts @@ -8,8 +8,8 @@ import { truncateIssueMessage, ui, } from '@code-pushup/utils'; -import { ruleIdToSlug } from '../meta/hash'; -import type { LinterOutput } from './types'; +import { ruleIdToSlug } from '../meta/index.js'; +import type { LinterOutput } from './types.js'; type LintIssue = Linter.LintMessage & { filePath: string; diff --git a/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts b/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts index 4f3001578..108dd16b1 100644 --- a/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts +++ b/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts @@ -1,6 +1,6 @@ import type { ESLint } from 'eslint'; import type { AuditOutput } from '@code-pushup/models'; -import { lintResultsToAudits } from './transform'; +import { lintResultsToAudits } from './transform.js'; describe('lintResultsToAudits', () => { it('should convert ESLint results with custom options to Code PushUp audits', () => { diff --git a/packages/plugin-eslint/src/lib/setup.ts b/packages/plugin-eslint/src/lib/setup.ts index 50a7e3364..405b70dbd 100644 --- a/packages/plugin-eslint/src/lib/setup.ts +++ b/packages/plugin-eslint/src/lib/setup.ts @@ -1,5 +1,5 @@ import { ESLint } from 'eslint'; -import type { ESLintTarget } from './config'; +import type { ESLintTarget } from './config.js'; export async function setupESLint(eslintrc: ESLintTarget['eslintrc']) { const eslintConstructor = await loadESLint(); diff --git a/packages/plugin-eslint/vite.config.integration.ts b/packages/plugin-eslint/vite.config.integration.ts index fc13938ef..f7c0e3b58 100644 --- a/packages/plugin-eslint/vite.config.integration.ts +++ b/packages/plugin-eslint/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/plugin-eslint', diff --git a/packages/plugin-eslint/vite.config.unit.ts b/packages/plugin-eslint/vite.config.unit.ts index c245d5853..da6bc190f 100644 --- a/packages/plugin-eslint/vite.config.unit.ts +++ b/packages/plugin-eslint/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/plugin-eslint', diff --git a/packages/plugin-js-packages/.eslintrc.json b/packages/plugin-js-packages/.eslintrc.json deleted file mode 100644 index cbc1f6668..000000000 --- a/packages/plugin-js-packages/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["packages/plugin-js-packages/tsconfig.*?.json"] - } - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": ["error"] - } - } - ] -} diff --git a/packages/plugin-js-packages/README.md b/packages/plugin-js-packages/README.md index 2dad00eb6..0bc12de9f 100644 --- a/packages/plugin-js-packages/README.md +++ b/packages/plugin-js-packages/README.md @@ -78,8 +78,8 @@ It supports the following package managers: refs: [ { type: 'group', - plugin: 'npm-audit', // replace prefix with your package manager - slug: 'js-packages', + slug: 'npm-audit', // replace prefix with your package manager + plugin: 'js-packages', weight: 1, }, ], @@ -90,8 +90,8 @@ It supports the following package managers: refs: [ { type: 'group', - plugin: 'npm-outdated', // replace prefix with your package manager - slug: 'js-packages', + slug: 'npm-outdated', // replace prefix with your package manager + plugin: 'js-packages', weight: 1, }, // ... diff --git a/packages/plugin-js-packages/eslint.config.js b/packages/plugin-js-packages/eslint.config.js new file mode 100644 index 000000000..40165321a --- /dev/null +++ b/packages/plugin-js-packages/eslint.config.js @@ -0,0 +1,21 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config( + ...baseConfig, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': 'error', + }, + }, +); diff --git a/packages/plugin-js-packages/package.json b/packages/plugin-js-packages/package.json index 0ae50c832..9164e132c 100644 --- a/packages/plugin-js-packages/package.json +++ b/packages/plugin-js-packages/package.json @@ -1,6 +1,6 @@ { "name": "@code-pushup/js-packages-plugin", - "version": "0.55.0", + "version": "0.57.0", "description": "Code PushUp plugin for JavaScript packages 🛡️", "license": "MIT", "homepage": "https://github.com/code-pushup/cli/tree/main/packages/plugin-js-packages#readme", @@ -36,11 +36,9 @@ "access": "public" }, "type": "module", - "main": "./index.js", - "types": "./src/index.d.ts", "dependencies": { - "@code-pushup/models": "0.55.0", - "@code-pushup/utils": "0.55.0", + "@code-pushup/models": "0.57.0", + "@code-pushup/utils": "0.57.0", "build-md": "^0.4.1", "semver": "^7.6.0", "zod": "^3.22.4" diff --git a/packages/plugin-js-packages/project.json b/packages/plugin-js-packages/project.json index 7a7a38eab..c0c3c06ec 100644 --- a/packages/plugin-js-packages/project.json +++ b/packages/plugin-js-packages/project.json @@ -5,15 +5,14 @@ "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/packages/plugin-js-packages", "main": "packages/plugin-js-packages/src/index.ts", "tsConfig": "packages/plugin-js-packages/tsconfig.lib.json", "additionalEntryPoints": ["packages/plugin-js-packages/src/bin.ts"], - "assets": ["packages/plugin-js-packages/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["packages/plugin-js-packages/*.md"] } }, "lint": { diff --git a/packages/plugin-js-packages/src/bin.ts b/packages/plugin-js-packages/src/bin.ts index c2ae92523..bf6572a76 100644 --- a/packages/plugin-js-packages/src/bin.ts +++ b/packages/plugin-js-packages/src/bin.ts @@ -1,3 +1,3 @@ -import { executeRunner } from './lib/runner'; +import { executeRunner } from './lib/runner/index.js'; await executeRunner(); diff --git a/packages/plugin-js-packages/src/index.ts b/packages/plugin-js-packages/src/index.ts index 51f3ced7d..380d69cbd 100644 --- a/packages/plugin-js-packages/src/index.ts +++ b/packages/plugin-js-packages/src/index.ts @@ -1,4 +1,4 @@ -import { jsPackagesPlugin } from './lib/js-packages-plugin'; +import { jsPackagesPlugin } from './lib/js-packages-plugin.js'; export default jsPackagesPlugin; -export type { JSPackagesPluginConfig } from './lib/config'; +export type { JSPackagesPluginConfig } from './lib/config.js'; diff --git a/packages/plugin-js-packages/src/lib/config.ts b/packages/plugin-js-packages/src/lib/config.ts index 9f4773ec0..8a8f4a75a 100644 --- a/packages/plugin-js-packages/src/lib/config.ts +++ b/packages/plugin-js-packages/src/lib/config.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; import { type IssueSeverity, issueSeveritySchema } from '@code-pushup/models'; -import { defaultAuditLevelMapping } from './constants'; +import { defaultAuditLevelMapping } from './constants.js'; export const dependencyGroups = ['prod', 'dev', 'optional'] as const; const dependencyGroupSchema = z.enum(dependencyGroups); diff --git a/packages/plugin-js-packages/src/lib/config.unit.test.ts b/packages/plugin-js-packages/src/lib/config.unit.test.ts index 4b2f9118a..e6e871734 100644 --- a/packages/plugin-js-packages/src/lib/config.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/config.unit.test.ts @@ -5,7 +5,7 @@ import { type JSPackagesPluginConfig, fillAuditLevelMapping, jsPackagesPluginConfigSchema, -} from './config'; +} from './config.js'; describe('jsPackagesPluginConfigSchema', () => { it('should accept a JS package configuration with all entities', () => { diff --git a/packages/plugin-js-packages/src/lib/constants.ts b/packages/plugin-js-packages/src/lib/constants.ts index ba2bc1400..8f51db12d 100644 --- a/packages/plugin-js-packages/src/lib/constants.ts +++ b/packages/plugin-js-packages/src/lib/constants.ts @@ -1,6 +1,6 @@ import type { IssueSeverity } from '@code-pushup/models'; -import type { DependencyGroup, PackageAuditLevel } from './config'; -import type { DependencyGroupLong } from './runner/outdated/types'; +import type { DependencyGroup, PackageAuditLevel } from './config.js'; +import type { DependencyGroupLong } from './runner/outdated/types.js'; export const defaultAuditLevelMapping: Record< PackageAuditLevel, @@ -22,13 +22,13 @@ export const dependencyGroupToLong: Record< optional: 'optionalDependencies', }; -/* eslint-disable no-magic-numbers */ export const dependencyGroupWeights: Record = { + /* eslint-disable @typescript-eslint/no-magic-numbers */ prod: 80, dev: 15, optional: 5, + /* eslint-enable @typescript-eslint/no-magic-numbers */ }; -/* eslint-enable no-magic-numbers */ export const dependencyDocs: Record = { prod: 'https://classic.yarnpkg.com/docs/dependency-types#toc-dependencies', diff --git a/packages/plugin-js-packages/src/lib/js-packages-plugin.ts b/packages/plugin-js-packages/src/lib/js-packages-plugin.ts index cf14b3858..2744f2b27 100644 --- a/packages/plugin-js-packages/src/lib/js-packages-plugin.ts +++ b/packages/plugin-js-packages/src/lib/js-packages-plugin.ts @@ -1,18 +1,18 @@ -import { dirname, join } from 'node:path'; +import { createRequire } from 'node:module'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { Audit, Group, PluginConfig } from '@code-pushup/models'; -import { name, version } from '../../package.json'; import { type DependencyGroup, type JSPackagesPluginConfig, type PackageCommand, type PackageManagerId, dependencyGroups, -} from './config'; -import { dependencyDocs, dependencyGroupWeights } from './constants'; -import { packageManagers } from './package-managers'; -import { createRunnerConfig } from './runner'; -import { normalizeConfig } from './utils'; +} from './config.js'; +import { dependencyDocs, dependencyGroupWeights } from './constants.js'; +import { packageManagers } from './package-managers/package-managers.js'; +import { createRunnerConfig } from './runner/index.js'; +import { normalizeConfig } from './utils.js'; /** * Instantiates Code PushUp JS packages plugin for core config. @@ -37,11 +37,16 @@ export async function jsPackagesPlugin( const { packageManager, checks, depGroups, ...jsPackagesPluginConfigRest } = await normalizeConfig(config); - const runnerScriptPath = join( - fileURLToPath(dirname(import.meta.url)), + const runnerScriptPath = path.join( + fileURLToPath(path.dirname(import.meta.url)), + '..', 'bin.js', ); + const packageJson = createRequire(import.meta.url)( + '../../package.json', + ) as typeof import('../../package.json'); + return { slug: 'js-packages', title: 'JS Packages', @@ -49,8 +54,8 @@ export async function jsPackagesPlugin( description: 'This plugin runs audit to uncover vulnerabilities and lists outdated dependencies. It supports npm, yarn classic, yarn modern, and pnpm package managers.', docsUrl: packageManager.docs.homepage, - packageName: name, - version, + packageName: packageJson.name, + version: packageJson.version, audits: createAudits(packageManager.slug, checks, depGroups), groups: createGroups(packageManager.slug, checks, depGroups), runner: await createRunnerConfig(runnerScriptPath, { diff --git a/packages/plugin-js-packages/src/lib/js-packages-plugin.unit.test.ts b/packages/plugin-js-packages/src/lib/js-packages-plugin.unit.test.ts index 4202b60df..7bb2a682a 100644 --- a/packages/plugin-js-packages/src/lib/js-packages-plugin.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/js-packages-plugin.unit.test.ts @@ -2,7 +2,7 @@ import { vol } from 'memfs'; import { describe, expect, it } from 'vitest'; import type { Group, PluginConfig, RunnerConfig } from '@code-pushup/models'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; -import { jsPackagesPlugin } from './js-packages-plugin'; +import { jsPackagesPlugin } from './js-packages-plugin.js'; vi.mock('./runner/index.ts', () => ({ createRunnerConfig: vi.fn().mockReturnValue({ diff --git a/packages/plugin-js-packages/src/lib/package-managers/derive-package-manager.ts b/packages/plugin-js-packages/src/lib/package-managers/derive-package-manager.ts index e28efbaa1..e527603e5 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/derive-package-manager.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/derive-package-manager.ts @@ -1,15 +1,15 @@ import { readFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { fileExists } from '@code-pushup/utils'; -import type { PackageManagerId } from '../config'; -import { deriveYarnVersion } from './derive-yarn'; +import type { PackageManagerId } from '../config.js'; +import { deriveYarnVersion } from './derive-yarn.js'; export async function derivePackageManagerInPackageJson( currentDir = process.cwd(), ) { - if (await fileExists(join(currentDir, 'package.json'))) { + if (await fileExists(path.join(currentDir, 'package.json'))) { const content = JSON.parse( - (await readFile(join('package.json'))).toString(), + (await readFile(path.join('package.json'))).toString(), ) as { packageManager?: string }; const { packageManager: packageManagerData = '' } = content; @@ -39,11 +39,11 @@ export async function derivePackageManager( } // Check for lock files - if (await fileExists(join(currentDir, 'package-lock.json'))) { + if (await fileExists(path.join(currentDir, 'package-lock.json'))) { return 'npm'; - } else if (await fileExists(join(currentDir, 'pnpm-lock.yaml'))) { + } else if (await fileExists(path.join(currentDir, 'pnpm-lock.yaml'))) { return 'pnpm'; - } else if (await fileExists(join(currentDir, 'yarn.lock'))) { + } else if (await fileExists(path.join(currentDir, 'yarn.lock'))) { const yarnVersion = await deriveYarnVersion(); if (yarnVersion) { return yarnVersion; diff --git a/packages/plugin-js-packages/src/lib/package-managers/derive-package-manager.unit.test.ts b/packages/plugin-js-packages/src/lib/package-managers/derive-package-manager.unit.test.ts index 6608400df..ab4dc90fd 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/derive-package-manager.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/derive-package-manager.unit.test.ts @@ -5,8 +5,8 @@ import * as utils from '@code-pushup/utils'; import { derivePackageManager, derivePackageManagerInPackageJson, -} from './derive-package-manager'; -import * as deriveYarn from './derive-yarn'; +} from './derive-package-manager.js'; +import * as deriveYarn from './derive-yarn.js'; describe('derivePackageManagerInPackageJson', () => { const fileExistsSpy = vi.spyOn(utils, 'fileExists'); @@ -16,6 +16,7 @@ describe('derivePackageManagerInPackageJson', () => { fileExistsSpy.mockClear(); executeProcessSpy.mockClear(); }); + afterAll(() => { executeProcessSpy.mockRestore(); }); @@ -105,6 +106,7 @@ describe('derivePackageManager', () => { fileExistsSpy.mockClear(); deriveYarnVersionSpy.mockClear(); }); + afterAll(() => { fileExistsSpy.mockRestore(); deriveYarnVersionSpy.mockRestore(); diff --git a/packages/plugin-js-packages/src/lib/package-managers/derive-yarn.unit.test.ts b/packages/plugin-js-packages/src/lib/package-managers/derive-yarn.unit.test.ts index 1b2916576..b8ee0bc88 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/derive-yarn.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/derive-yarn.unit.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import * as utils from '@code-pushup/utils'; import type { ProcessResult } from '@code-pushup/utils'; -import { deriveYarnVersion } from './derive-yarn'; +import { deriveYarnVersion } from './derive-yarn.js'; describe('deriveYarnVersion', () => { const executeProcessSpy = vi.spyOn(utils, 'executeProcess'); @@ -9,6 +9,7 @@ describe('deriveYarnVersion', () => { beforeEach(() => { executeProcessSpy.mockClear(); }); + afterAll(() => { executeProcessSpy.mockRestore(); }); diff --git a/packages/plugin-js-packages/src/lib/package-managers/index.ts b/packages/plugin-js-packages/src/lib/package-managers/index.ts deleted file mode 100644 index 2efa790f0..000000000 --- a/packages/plugin-js-packages/src/lib/package-managers/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { packageManagers } from './package-managers'; -export type { PackageManager } from './types'; diff --git a/packages/plugin-js-packages/src/lib/package-managers/npm/audit-result.ts b/packages/plugin-js-packages/src/lib/package-managers/npm/audit-result.ts index 23cd94b29..ba04e3d46 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/npm/audit-result.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/npm/audit-result.ts @@ -1,11 +1,11 @@ import { objectToEntries } from '@code-pushup/utils'; -import type { AuditResult, Vulnerability } from '../../runner/audit/types'; +import type { AuditResult, Vulnerability } from '../../runner/audit/types.js'; import type { NpmAdvisory, NpmAuditResultJson, NpmFixInformation, NpmVulnerabilities, -} from './types'; +} from './types.js'; export function npmToAuditResult(output: string): AuditResult { const npmAudit = JSON.parse(output) as NpmAuditResultJson; @@ -48,7 +48,7 @@ export function npmToFixInformation( export function npmToAdvisory( name: string, vulnerabilities: NpmVulnerabilities, - prevNodes: Set = new Set(), + prevNodes = new Set(), ): NpmAdvisory | null { const advisory = vulnerabilities[name]?.via; diff --git a/packages/plugin-js-packages/src/lib/package-managers/npm/audit-result.unit.test.ts b/packages/plugin-js-packages/src/lib/package-managers/npm/audit-result.unit.test.ts index 739972086..92e123582 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/npm/audit-result.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/npm/audit-result.unit.test.ts @@ -1,15 +1,15 @@ import { describe, expect, it } from 'vitest'; -import type { AuditResult } from '../../runner/audit/types'; +import type { AuditResult } from '../../runner/audit/types.js'; import { npmToAdvisory, npmToAuditResult, npmToFixInformation, -} from './audit-result'; +} from './audit-result.js'; import type { NpmAdvisory, NpmAuditResultJson, NpmVulnerability, -} from './types'; +} from './types.js'; describe('npmToAuditResult', () => { it('should transform NPM audit to unified audit result', () => { diff --git a/packages/plugin-js-packages/src/lib/package-managers/npm/npm.ts b/packages/plugin-js-packages/src/lib/package-managers/npm/npm.ts index 6ed13ecc6..7935c8709 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/npm/npm.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/npm/npm.ts @@ -1,10 +1,10 @@ import { objectToKeys } from '@code-pushup/utils'; -import type { DependencyGroup } from '../../config'; -import { filterAuditResult } from '../../runner/utils'; -import { COMMON_AUDIT_ARGS, COMMON_OUTDATED_ARGS } from '../constants'; -import type { AuditResults, PackageManager } from '../types'; -import { npmToAuditResult } from './audit-result'; -import { npmToOutdatedResult } from './outdated-result'; +import type { DependencyGroup } from '../../config.js'; +import { filterAuditResult } from '../../runner/utils.js'; +import { COMMON_AUDIT_ARGS, COMMON_OUTDATED_ARGS } from '../constants.js'; +import type { AuditResults, PackageManager } from '../types.js'; +import { npmToAuditResult } from './audit-result.js'; +import { npmToOutdatedResult } from './outdated-result.js'; const npmDependencyOptions: Record = { prod: ['--omit=dev', '--omit=optional'], diff --git a/packages/plugin-js-packages/src/lib/package-managers/npm/outdated-result.ts b/packages/plugin-js-packages/src/lib/package-managers/npm/outdated-result.ts index f5f93c077..ebb6973b7 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/npm/outdated-result.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/npm/outdated-result.ts @@ -1,6 +1,6 @@ import { objectToEntries } from '@code-pushup/utils'; -import type { OutdatedResult } from '../../runner/outdated/types'; -import type { NpmNormalizedOverview, NpmOutdatedResultJson } from './types'; +import type { OutdatedResult } from '../../runner/outdated/types.js'; +import type { NpmNormalizedOverview, NpmOutdatedResultJson } from './types.js'; export function npmToOutdatedResult(output: string): OutdatedResult { const npmOutdated = JSON.parse(output) as NpmOutdatedResultJson; diff --git a/packages/plugin-js-packages/src/lib/package-managers/npm/outdated-result.unit.test.ts b/packages/plugin-js-packages/src/lib/package-managers/npm/outdated-result.unit.test.ts index 37b223af0..0810e08de 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/npm/outdated-result.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/npm/outdated-result.unit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import type { OutdatedResult } from '../../runner/outdated/types'; -import { npmToOutdatedResult } from './outdated-result'; +import type { OutdatedResult } from '../../runner/outdated/types.js'; +import { npmToOutdatedResult } from './outdated-result.js'; describe('npmToOutdatedResult', () => { it('should transform NPM outdated to unified outdated result', () => { diff --git a/packages/plugin-js-packages/src/lib/package-managers/npm/types.ts b/packages/plugin-js-packages/src/lib/package-managers/npm/types.ts index 3d785bd8f..e0525ef23 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/npm/types.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/npm/types.ts @@ -1,6 +1,6 @@ -import type { PackageAuditLevel } from '../../config'; -import type { AuditSummary } from '../../runner/audit/types'; -import type { DependencyGroupLong } from '../../runner/outdated/types'; +import type { PackageAuditLevel } from '../../config.js'; +import type { AuditSummary } from '../../runner/audit/types.js'; +import type { DependencyGroupLong } from '../../runner/outdated/types.js'; // Subset of NPM audit JSON type export type NpmAdvisory = { diff --git a/packages/plugin-js-packages/src/lib/package-managers/package-managers.ts b/packages/plugin-js-packages/src/lib/package-managers/package-managers.ts index cb2655c44..8772da89a 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/package-managers.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/package-managers.ts @@ -1,9 +1,9 @@ -import type { PackageManagerId } from '../config'; -import { npmPackageManager } from './npm/npm'; -import { pnpmPackageManager } from './pnpm/pnpm'; -import type { PackageManager } from './types'; -import { yarnv1PackageManager } from './yarn-classic/yarn-classic'; -import { yarnv2PackageManager } from './yarn-modern/yarn-modern'; +import type { PackageManagerId } from '../config.js'; +import { npmPackageManager } from './npm/npm.js'; +import { pnpmPackageManager } from './pnpm/pnpm.js'; +import type { PackageManager } from './types.js'; +import { yarnv1PackageManager } from './yarn-classic/yarn-classic.js'; +import { yarnv2PackageManager } from './yarn-modern/yarn-modern.js'; export const packageManagers: Record = { npm: npmPackageManager, diff --git a/packages/plugin-js-packages/src/lib/package-managers/pnpm/audit-result.ts b/packages/plugin-js-packages/src/lib/package-managers/pnpm/audit-result.ts index 292062313..1a57f157b 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/pnpm/audit-result.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/pnpm/audit-result.ts @@ -1,7 +1,7 @@ -import type { AuditResult, Vulnerability } from '../../runner/audit/types'; -import { getVulnerabilitiesTotal } from '../../runner/audit/utils'; -import type { PnpmAuditResultJson } from './types'; -import { filterOutWarnings } from './utils'; +import type { AuditResult, Vulnerability } from '../../runner/audit/types.js'; +import { getVulnerabilitiesTotal } from '../../runner/audit/utils.js'; +import type { PnpmAuditResultJson } from './types.js'; +import { filterOutWarnings } from './utils.js'; export function pnpmToAuditResult(output: string): AuditResult { const pnpmResult = JSON.parse( diff --git a/packages/plugin-js-packages/src/lib/package-managers/pnpm/audit-result.unit.test.ts b/packages/plugin-js-packages/src/lib/package-managers/pnpm/audit-result.unit.test.ts index b75a7fafd..f550a7c39 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/pnpm/audit-result.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/pnpm/audit-result.unit.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import type { AuditResult } from '../../runner/audit/types'; -import { pnpmToAuditResult, pnpmToDirectDependency } from './audit-result'; -import type { PnpmAuditResultJson } from './types'; +import type { AuditResult } from '../../runner/audit/types.js'; +import { pnpmToAuditResult, pnpmToDirectDependency } from './audit-result.js'; +import type { PnpmAuditResultJson } from './types.js'; describe('pnpmToAuditResult', () => { it('should transform PNPM audit to unified audit result', () => { diff --git a/packages/plugin-js-packages/src/lib/package-managers/pnpm/outdated-result.ts b/packages/plugin-js-packages/src/lib/package-managers/pnpm/outdated-result.ts index 48ef6d319..239ba8656 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/pnpm/outdated-result.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/pnpm/outdated-result.ts @@ -1,7 +1,7 @@ import { objectToEntries } from '@code-pushup/utils'; -import type { OutdatedResult } from '../../runner/outdated/types'; -import type { PnpmOutdatedResultJson } from './types'; -import { filterOutWarnings } from './utils'; +import type { OutdatedResult } from '../../runner/outdated/types.js'; +import type { PnpmOutdatedResultJson } from './types.js'; +import { filterOutWarnings } from './utils.js'; export function pnpmToOutdatedResult(output: string): OutdatedResult { const pnpmOutdated = JSON.parse( diff --git a/packages/plugin-js-packages/src/lib/package-managers/pnpm/outdated-result.unit.test.ts b/packages/plugin-js-packages/src/lib/package-managers/pnpm/outdated-result.unit.test.ts index 88d6aa554..7e38b838a 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/pnpm/outdated-result.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/pnpm/outdated-result.unit.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import type { OutdatedResult } from '../../runner/outdated/types'; -import { pnpmToOutdatedResult } from './outdated-result'; -import type { PnpmOutdatedResultJson } from './types'; +import type { OutdatedResult } from '../../runner/outdated/types.js'; +import { pnpmToOutdatedResult } from './outdated-result.js'; +import type { PnpmOutdatedResultJson } from './types.js'; describe('pnpmToOutdatedResult', () => { it('should transform PNPM outdated to unified outdated result', () => { diff --git a/packages/plugin-js-packages/src/lib/package-managers/pnpm/pnpm.ts b/packages/plugin-js-packages/src/lib/package-managers/pnpm/pnpm.ts index bb688407a..9cf1a5023 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/pnpm/pnpm.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/pnpm/pnpm.ts @@ -1,10 +1,10 @@ import { objectToKeys } from '@code-pushup/utils'; -import type { DependencyGroup } from '../../config'; -import { filterAuditResult } from '../../runner/utils'; -import { COMMON_AUDIT_ARGS, COMMON_OUTDATED_ARGS } from '../constants'; -import type { AuditResults, PackageManager } from '../types'; -import { pnpmToAuditResult } from './audit-result'; -import { pnpmToOutdatedResult } from './outdated-result'; +import type { DependencyGroup } from '../../config.js'; +import { filterAuditResult } from '../../runner/utils.js'; +import { COMMON_AUDIT_ARGS, COMMON_OUTDATED_ARGS } from '../constants.js'; +import type { AuditResults, PackageManager } from '../types.js'; +import { pnpmToAuditResult } from './audit-result.js'; +import { pnpmToOutdatedResult } from './outdated-result.js'; const pnpmDependencyOptions: Record = { prod: ['--prod', '--no-optional'], diff --git a/packages/plugin-js-packages/src/lib/package-managers/pnpm/types.ts b/packages/plugin-js-packages/src/lib/package-managers/pnpm/types.ts index 410804609..80c2aa40d 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/pnpm/types.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/pnpm/types.ts @@ -1,8 +1,7 @@ // Subset of PNPM audit JSON type -import type { PackageAuditLevel } from '../../config'; -import type { DependencyGroupLong } from '../../runner/outdated/types'; +import type { PackageAuditLevel } from '../../config.js'; +import type { DependencyGroupLong } from '../../runner/outdated/types.js'; -/* eslint-disable @typescript-eslint/naming-convention */ export type PnpmAuditAdvisory = { module_name: string; id: number; @@ -13,7 +12,6 @@ export type PnpmAuditAdvisory = { url: string; findings: { paths: string[] }[]; }; -/* eslint-enable @typescript-eslint/naming-convention */ export type PnpmAuditResultJson = { advisories: Record; diff --git a/packages/plugin-js-packages/src/lib/package-managers/types.ts b/packages/plugin-js-packages/src/lib/package-managers/types.ts index e43855079..c8529e2b1 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/types.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/types.ts @@ -1,7 +1,7 @@ import type { MaterialIcon } from '@code-pushup/models'; -import type { DependencyGroup, PackageManagerId } from '../config'; -import type { AuditResult } from '../runner/audit/types'; -import type { OutdatedResult } from '../runner/outdated/types'; +import type { DependencyGroup, PackageManagerId } from '../config.js'; +import type { AuditResult } from '../runner/audit/types.js'; +import type { OutdatedResult } from '../runner/outdated/types.js'; export type AuditResults = Partial>; diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/audit-result.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/audit-result.ts index cac1b11f8..3c8f57af4 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/audit-result.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/audit-result.ts @@ -1,11 +1,11 @@ import { fromJsonLines } from '@code-pushup/utils'; -import type { AuditResult, Vulnerability } from '../../runner/audit/types'; -import { filterAuditResult } from '../../runner/utils'; +import type { AuditResult, Vulnerability } from '../../runner/audit/types.js'; +import { filterAuditResult } from '../../runner/utils.js'; import type { Yarnv1AuditAdvisory, Yarnv1AuditResultJson, Yarnv1AuditSummary, -} from './types'; +} from './types.js'; export function yarnv1ToAuditResult(output: string): AuditResult { const yarnv1Result = fromJsonLines(output); diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/audit-result.unit.test.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/audit-result.unit.test.ts index 985f69208..5c0a393d2 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/audit-result.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/audit-result.unit.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it } from 'vitest'; import { toJsonLines } from '@code-pushup/utils'; -import type { AuditResult } from '../../runner/audit/types'; -import { yarnv1ToAuditResult } from './audit-result'; -import type { Yarnv1AuditAdvisory, Yarnv1AuditSummary } from './types'; +import type { AuditResult } from '../../runner/audit/types.js'; +import { yarnv1ToAuditResult } from './audit-result.js'; +import type { Yarnv1AuditAdvisory, Yarnv1AuditSummary } from './types.js'; describe('yarnv1ToAuditResult', () => { it('should transform Yarn v1 audit to unified audit result', () => { diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/constants.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/constants.ts index 72ec1524c..414cdbca9 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/constants.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/constants.ts @@ -1,5 +1,5 @@ -import type { OutdatedDependency } from '../../runner/outdated/types'; -import type { Yarnv1FieldName } from './types'; +import type { OutdatedDependency } from '../../runner/outdated/types.js'; +import type { Yarnv1FieldName } from './types.js'; export const outdatedtoFieldMapper: Record< keyof OutdatedDependency, diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/outdated-result.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/outdated-result.ts index 8b4bfe8ef..dc605d0ce 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/outdated-result.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/outdated-result.ts @@ -7,13 +7,16 @@ import { import type { OutdatedDependency, OutdatedResult, -} from '../../runner/outdated/types'; -import { REQUIRED_OUTDATED_FIELDS, outdatedtoFieldMapper } from './constants'; +} from '../../runner/outdated/types.js'; +import { + REQUIRED_OUTDATED_FIELDS, + outdatedtoFieldMapper, +} from './constants.js'; import { type Yarnv1FieldName, type Yarnv1OutdatedResultJson, yarnv1FieldNames, -} from './types'; +} from './types.js'; export function yarnv1ToOutdatedResult(output: string): OutdatedResult { const yarnv1Outdated = fromJsonLines(output); diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/outdated-result.unit.test.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/outdated-result.unit.test.ts index a459d6686..c47113e64 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/outdated-result.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/outdated-result.unit.test.ts @@ -3,17 +3,18 @@ import { toJsonLines } from '@code-pushup/utils'; import type { OutdatedDependency, OutdatedResult, -} from '../../runner/outdated/types'; -import { REQUIRED_OUTDATED_FIELDS } from './constants'; +} from '../../runner/outdated/types.js'; +import { REQUIRED_OUTDATED_FIELDS } from './constants.js'; import { getOutdatedFieldIndexes, validateOutdatedFields, yarnv1ToOutdatedResult, -} from './outdated-result'; -import type { Yarnv1FieldName } from './types'; +} from './outdated-result.js'; +import type { Yarnv1FieldName } from './types.js'; describe('yarnv1ToOutdatedResult', () => { const yarnInfo = { type: 'info', data: 'Colours' }; + it('should transform Yarn v1 outdated to unified outdated result', () => { const table = { type: 'table', diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/types.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/types.ts index 91233f5cb..24bc4e29e 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/types.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/types.ts @@ -1,4 +1,4 @@ -import type { PackageAuditLevel } from '../../config'; +import type { PackageAuditLevel } from '../../config.js'; // Subset of Yarn v1 audit JSON type export type Yarnv1AuditAdvisory = { @@ -8,7 +8,6 @@ export type Yarnv1AuditAdvisory = { id: number; path: string; }; - /* eslint-disable @typescript-eslint/naming-convention */ advisory: { module_name: string; severity: PackageAuditLevel; @@ -17,7 +16,6 @@ export type Yarnv1AuditAdvisory = { title: string; url: string; }; - /* eslint-enable @typescript-eslint/naming-convention */ }; }; diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/yarn-classic.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/yarn-classic.ts index f41a1d93b..af6a7d08f 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/yarn-classic.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-classic/yarn-classic.ts @@ -1,8 +1,8 @@ -import { dependencyGroupToLong } from '../../constants'; -import { COMMON_AUDIT_ARGS, COMMON_OUTDATED_ARGS } from '../constants'; -import type { PackageManager } from '../types'; -import { yarnv1ToAuditResult } from './audit-result'; -import { yarnv1ToOutdatedResult } from './outdated-result'; +import { dependencyGroupToLong } from '../../constants.js'; +import { COMMON_AUDIT_ARGS, COMMON_OUTDATED_ARGS } from '../constants.js'; +import type { PackageManager } from '../types.js'; +import { yarnv1ToAuditResult } from './audit-result.js'; +import { yarnv1ToOutdatedResult } from './outdated-result.js'; export const yarnv1PackageManager: PackageManager = { slug: 'yarn-classic', diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/audit-result.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/audit-result.ts index 4e36a94a1..f86ac8671 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/audit-result.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/audit-result.ts @@ -1,6 +1,6 @@ -import type { AuditResult, Vulnerability } from '../../runner/audit/types'; -import { getVulnerabilitiesTotal } from '../../runner/audit/utils'; -import type { Yarnv2AuditResultJson } from './types'; +import type { AuditResult, Vulnerability } from '../../runner/audit/types.js'; +import { getVulnerabilitiesTotal } from '../../runner/audit/utils.js'; +import type { Yarnv2AuditResultJson } from './types.js'; export function yarnv2ToAuditResult(output: string): AuditResult { const yarnv2Audit = JSON.parse(output) as Yarnv2AuditResultJson; diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/audit-result.unit.test.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/audit-result.unit.test.ts index 545c43b7c..cc3a2b23c 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/audit-result.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/audit-result.unit.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import type { AuditResult } from '../../runner/audit/types'; -import { yarnv2ToAuditResult } from './audit-result'; -import type { Yarnv2AuditResultJson } from './types'; +import type { AuditResult } from '../../runner/audit/types.js'; +import { yarnv2ToAuditResult } from './audit-result.js'; +import type { Yarnv2AuditResultJson } from './types.js'; describe('yarnv2ToAuditResult', () => { it('should transform Yarn v2 audit to unified audit result', () => { diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/outdated-result.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/outdated-result.ts index 541223498..8bc52f71d 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/outdated-result.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/outdated-result.ts @@ -1,5 +1,5 @@ -import type { OutdatedResult } from '../../runner/outdated/types'; -import type { Yarnv2OutdatedResultJson } from './types'; +import type { OutdatedResult } from '../../runner/outdated/types.js'; +import type { Yarnv2OutdatedResultJson } from './types.js'; export function yarnv2ToOutdatedResult(output: string): OutdatedResult { const npmOutdated = JSON.parse(output) as Yarnv2OutdatedResultJson; diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/outdated-result.unit.test.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/outdated-result.unit.test.ts index 122d74aa4..87f20caf4 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/outdated-result.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/outdated-result.unit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { yarnv2ToOutdatedResult } from './outdated-result'; -import type { Yarnv2OutdatedResultJson } from './types'; +import { yarnv2ToOutdatedResult } from './outdated-result.js'; +import type { Yarnv2OutdatedResultJson } from './types.js'; describe('yarnv2ToOutdatedResult', () => { it('should transform Yarn v2 outdated to unified outdated result', () => { diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/types.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/types.ts index abea5368f..3dcc164ad 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/types.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/types.ts @@ -1,8 +1,7 @@ // Subset of Yarn v2+ audit JSON type -import type { PackageAuditLevel } from '../../config'; -import type { DependencyGroupLong } from '../../runner/outdated/types'; +import type { PackageAuditLevel } from '../../config.js'; +import type { DependencyGroupLong } from '../../runner/outdated/types.js'; -/* eslint-disable @typescript-eslint/naming-convention */ export type Yarnv2AuditAdvisory = { module_name: string; severity: PackageAuditLevel; @@ -12,7 +11,6 @@ export type Yarnv2AuditAdvisory = { url: string; findings: { paths: string[] }[]; // TODO indirect? }; -/* eslint-enable @typescript-eslint/naming-convention */ export type Yarnv2AuditResultJson = { advisories: Record; diff --git a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/yarn-modern.ts b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/yarn-modern.ts index 3a8e94b43..c1eea5145 100644 --- a/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/yarn-modern.ts +++ b/packages/plugin-js-packages/src/lib/package-managers/yarn-modern/yarn-modern.ts @@ -1,9 +1,9 @@ // Yarn v2 does not currently audit optional dependencies -import type { DependencyGroup } from '../../config'; -import { COMMON_AUDIT_ARGS, COMMON_OUTDATED_ARGS } from '../constants'; -import type { PackageManager } from '../types'; -import { yarnv2ToAuditResult } from './audit-result'; -import { yarnv2ToOutdatedResult } from './outdated-result'; +import type { DependencyGroup } from '../../config.js'; +import { COMMON_AUDIT_ARGS, COMMON_OUTDATED_ARGS } from '../constants.js'; +import type { PackageManager } from '../types.js'; +import { yarnv2ToAuditResult } from './audit-result.js'; +import { yarnv2ToOutdatedResult } from './outdated-result.js'; // see https://github.com/yarnpkg/berry/blob/master/packages/plugin-npm-cli/sources/npmAuditTypes.ts#L5 const yarnv2EnvironmentOptions: Record = { diff --git a/packages/plugin-js-packages/src/lib/runner/audit/constants.ts b/packages/plugin-js-packages/src/lib/runner/audit/constants.ts index e55de6ce8..1c9350eb7 100644 --- a/packages/plugin-js-packages/src/lib/runner/audit/constants.ts +++ b/packages/plugin-js-packages/src/lib/runner/audit/constants.ts @@ -1,11 +1,11 @@ -import type { PackageAuditLevel } from '../../config'; +import type { PackageAuditLevel } from '../../config.js'; -/* eslint-disable no-magic-numbers */ export const auditScoreModifiers: Record = { + /* eslint-disable @typescript-eslint/no-magic-numbers */ critical: 1, high: 0.1, moderate: 0.05, low: 0.02, info: 0.01, + /* eslint-enable @typescript-eslint/no-magic-numbers */ }; -/* eslint-enable no-magic-numbers */ diff --git a/packages/plugin-js-packages/src/lib/runner/audit/transform.ts b/packages/plugin-js-packages/src/lib/runner/audit/transform.ts index 91f2adddc..7eddde570 100644 --- a/packages/plugin-js-packages/src/lib/runner/audit/transform.ts +++ b/packages/plugin-js-packages/src/lib/runner/audit/transform.ts @@ -6,9 +6,9 @@ import { type DependencyGroup, type PackageManagerId, packageAuditLevels, -} from '../../config'; -import { auditScoreModifiers } from './constants'; -import type { AuditResult, AuditSummary, Vulnerability } from './types'; +} from '../../config.js'; +import { auditScoreModifiers } from './constants.js'; +import type { AuditResult, AuditSummary, Vulnerability } from './types.js'; export function auditResultToAuditOutput( result: AuditResult, diff --git a/packages/plugin-js-packages/src/lib/runner/audit/transform.unit.test.ts b/packages/plugin-js-packages/src/lib/runner/audit/transform.unit.test.ts index f50ff6148..3d839ff2c 100644 --- a/packages/plugin-js-packages/src/lib/runner/audit/transform.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/runner/audit/transform.unit.test.ts @@ -1,13 +1,13 @@ import { describe, expect, it } from 'vitest'; import type { AuditOutput, Issue } from '@code-pushup/models'; -import { defaultAuditLevelMapping } from '../../constants'; +import { defaultAuditLevelMapping } from '../../constants.js'; import { auditResultToAuditOutput, calculateAuditScore, summaryToDisplayValue, vulnerabilitiesToIssues, -} from './transform'; -import type { Vulnerability } from './types'; +} from './transform.js'; +import type { Vulnerability } from './types.js'; describe('auditResultToAuditOutput', () => { it('should return audit output with no vulnerabilities', () => { diff --git a/packages/plugin-js-packages/src/lib/runner/audit/types.ts b/packages/plugin-js-packages/src/lib/runner/audit/types.ts index e32fe3d3c..916d6db35 100644 --- a/packages/plugin-js-packages/src/lib/runner/audit/types.ts +++ b/packages/plugin-js-packages/src/lib/runner/audit/types.ts @@ -1,4 +1,4 @@ -import type { PackageAuditLevel } from '../../config'; +import type { PackageAuditLevel } from '../../config.js'; // Unified Audit result type export type Vulnerability = { diff --git a/packages/plugin-js-packages/src/lib/runner/audit/utils.ts b/packages/plugin-js-packages/src/lib/runner/audit/utils.ts index 6c2ec7f24..48a915b7c 100644 --- a/packages/plugin-js-packages/src/lib/runner/audit/utils.ts +++ b/packages/plugin-js-packages/src/lib/runner/audit/utils.ts @@ -1,4 +1,4 @@ -import type { PackageAuditLevel } from '../../config'; +import type { PackageAuditLevel } from '../../config.js'; export function getVulnerabilitiesTotal( summary: Record, diff --git a/packages/plugin-js-packages/src/lib/runner/constants.ts b/packages/plugin-js-packages/src/lib/runner/constants.ts index e2bcec21b..19d0f6f7d 100644 --- a/packages/plugin-js-packages/src/lib/runner/constants.ts +++ b/packages/plugin-js-packages/src/lib/runner/constants.ts @@ -1,9 +1,9 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { pluginWorkDir } from '@code-pushup/utils'; export const WORKDIR = pluginWorkDir('js-packages'); -export const RUNNER_OUTPUT_PATH = join(WORKDIR, 'runner-output.json'); -export const PLUGIN_CONFIG_PATH = join( +export const RUNNER_OUTPUT_PATH = path.join(WORKDIR, 'runner-output.json'); +export const PLUGIN_CONFIG_PATH = path.join( process.cwd(), WORKDIR, 'plugin-config.json', diff --git a/packages/plugin-js-packages/src/lib/runner/index.ts b/packages/plugin-js-packages/src/lib/runner/index.ts index 5176155fc..2c5f9a9e7 100644 --- a/packages/plugin-js-packages/src/lib/runner/index.ts +++ b/packages/plugin-js-packages/src/lib/runner/index.ts @@ -1,5 +1,5 @@ import { writeFile } from 'node:fs/promises'; -import { dirname } from 'node:path'; +import path from 'node:path'; import type { RunnerConfig } from '@code-pushup/models'; import { ensureDirectoryExists, @@ -17,20 +17,20 @@ import { type PackageJsonPaths, type PackageManagerId, dependencyGroups, -} from '../config'; -import { dependencyGroupToLong } from '../constants'; -import { packageManagers } from '../package-managers'; -import { auditResultToAuditOutput } from './audit/transform'; -import type { AuditResult } from './audit/types'; -import { PLUGIN_CONFIG_PATH, RUNNER_OUTPUT_PATH } from './constants'; -import { outdatedResultToAuditOutput } from './outdated/transform'; -import { findAllPackageJson, getTotalDependencies } from './utils'; +} from '../config.js'; +import { dependencyGroupToLong } from '../constants.js'; +import { packageManagers } from '../package-managers/package-managers.js'; +import { auditResultToAuditOutput } from './audit/transform.js'; +import type { AuditResult } from './audit/types.js'; +import { PLUGIN_CONFIG_PATH, RUNNER_OUTPUT_PATH } from './constants.js'; +import { outdatedResultToAuditOutput } from './outdated/transform.js'; +import { findAllPackageJson, getTotalDependencies } from './utils.js'; export async function createRunnerConfig( scriptPath: string, config: FinalJSPackagesPluginConfig, ): Promise { - await ensureDirectoryExists(dirname(PLUGIN_CONFIG_PATH)); + await ensureDirectoryExists(path.dirname(PLUGIN_CONFIG_PATH)); await writeFile(PLUGIN_CONFIG_PATH, JSON.stringify(config)); return { @@ -58,7 +58,7 @@ export async function executeRunner(): Promise { : []; const checkResults = [...auditResults, ...outdatedResults]; - await ensureDirectoryExists(dirname(RUNNER_OUTPUT_PATH)); + await ensureDirectoryExists(path.dirname(RUNNER_OUTPUT_PATH)); await writeFile(RUNNER_OUTPUT_PATH, JSON.stringify(checkResults)); } @@ -129,7 +129,7 @@ async function processAudit( const rejected = auditResults.filter(isPromiseRejectedResult); if (rejected.length > 0) { - rejected.map(result => { + rejected.forEach(result => { console.error(result.reason); }); diff --git a/packages/plugin-js-packages/src/lib/runner/outdated/transform.ts b/packages/plugin-js-packages/src/lib/runner/outdated/transform.ts index b702a9895..424b348d2 100644 --- a/packages/plugin-js-packages/src/lib/runner/outdated/transform.ts +++ b/packages/plugin-js-packages/src/lib/runner/outdated/transform.ts @@ -2,10 +2,10 @@ import { md } from 'build-md'; import { clean, diff, neq } from 'semver'; import type { AuditOutput, Issue } from '@code-pushup/models'; import { objectFromEntries, pluralize } from '@code-pushup/utils'; -import type { DependencyGroup, PackageManagerId } from '../../config'; -import { dependencyGroupToLong } from '../../constants'; -import { RELEASE_TYPES, outdatedSeverity } from './constants'; -import type { OutdatedResult, PackageVersion } from './types'; +import type { DependencyGroup, PackageManagerId } from '../../config.js'; +import { dependencyGroupToLong } from '../../constants.js'; +import { RELEASE_TYPES, outdatedSeverity } from './constants.js'; +import type { OutdatedResult, PackageVersion } from './types.js'; export function outdatedResultToAuditOutput( result: OutdatedResult, diff --git a/packages/plugin-js-packages/src/lib/runner/outdated/transform.unit.test.ts b/packages/plugin-js-packages/src/lib/runner/outdated/transform.unit.test.ts index 76ad658b5..352836adc 100644 --- a/packages/plugin-js-packages/src/lib/runner/outdated/transform.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/runner/outdated/transform.unit.test.ts @@ -1,13 +1,13 @@ import { describe, expect, it } from 'vitest'; import type { AuditOutput, Issue } from '@code-pushup/models'; import { objectFromEntries } from '@code-pushup/utils'; -import { RELEASE_TYPES } from './constants'; +import { RELEASE_TYPES } from './constants.js'; import { calculateOutdatedScore, outdatedResultToAuditOutput, outdatedToDisplayValue, outdatedToIssues, -} from './transform'; +} from './transform.js'; describe('outdatedResultToAuditOutput', () => { it('should create an audit output', () => { diff --git a/packages/plugin-js-packages/src/lib/runner/runner.integration.test.ts b/packages/plugin-js-packages/src/lib/runner/runner.integration.test.ts index 65090b62c..9e648923d 100644 --- a/packages/plugin-js-packages/src/lib/runner/runner.integration.test.ts +++ b/packages/plugin-js-packages/src/lib/runner/runner.integration.test.ts @@ -1,10 +1,10 @@ import { describe, expect, it } from 'vitest'; import type { RunnerConfig } from '@code-pushup/models'; import { readJsonFile, removeDirectoryIfExists } from '@code-pushup/utils'; -import { createRunnerConfig } from '.'; -import type { FinalJSPackagesPluginConfig } from '../config'; -import { defaultAuditLevelMapping } from '../constants'; -import { PLUGIN_CONFIG_PATH, WORKDIR } from './constants'; +import type { FinalJSPackagesPluginConfig } from '../config.js'; +import { defaultAuditLevelMapping } from '../constants.js'; +import { PLUGIN_CONFIG_PATH, WORKDIR } from './constants.js'; +import { createRunnerConfig } from './index.js'; describe('createRunnerConfig', () => { it('should create a valid runner config', async () => { diff --git a/packages/plugin-js-packages/src/lib/runner/utils.ts b/packages/plugin-js-packages/src/lib/runner/utils.ts index 7d0933e50..db0f318e6 100644 --- a/packages/plugin-js-packages/src/lib/runner/utils.ts +++ b/packages/plugin-js-packages/src/lib/runner/utils.ts @@ -1,17 +1,17 @@ -import { sep } from 'node:path'; +import path from 'node:path'; import { crawlFileSystem, objectFromEntries, objectToKeys, readJsonFile, } from '@code-pushup/utils'; -import type { AuditResult, Vulnerability } from './audit/types'; +import type { AuditResult, Vulnerability } from './audit/types.js'; import { type DependencyGroupLong, type DependencyTotals, type PackageJson, dependencyGroupLong, -} from './outdated/types'; +} from './outdated/types.js'; export function filterAuditResult( result: AuditResult, @@ -62,10 +62,10 @@ export async function findAllPackageJson(): Promise { pattern: /(^|[\\/])package\.json$/, }) ).filter( - path => - !path.startsWith(`node_modules${sep}`) && - !path.includes(`${sep}node_modules${sep}`) && - !path.startsWith(`.nx${sep}`), + filePath => + !filePath.startsWith(`node_modules${path.sep}`) && + !filePath.includes(`${path.sep}node_modules${path.sep}`) && + !filePath.startsWith(`.nx${path.sep}`), ); } diff --git a/packages/plugin-js-packages/src/lib/runner/utils.unit.test.ts b/packages/plugin-js-packages/src/lib/runner/utils.unit.test.ts index d2a1c7fd3..321606a30 100644 --- a/packages/plugin-js-packages/src/lib/runner/utils.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/runner/utils.unit.test.ts @@ -1,25 +1,25 @@ import { vol } from 'memfs'; -import { join } from 'node:path'; +import path from 'node:path'; import { describe, expect, it } from 'vitest'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; -import type { AuditResult, Vulnerability } from './audit/types'; -import type { DependencyTotals, PackageJson } from './outdated/types'; +import type { AuditResult, Vulnerability } from './audit/types.js'; +import type { DependencyTotals, PackageJson } from './outdated/types.js'; import { filterAuditResult, findAllPackageJson, getTotalDependencies, -} from './utils'; +} from './utils.js'; describe('findAllPackageJson', () => { beforeEach(() => { vol.fromJSON( { 'package.json': '', - [join('ui', 'package.json')]: '', - [join('ui', 'ng-package.json')]: '', // non-exact file match should be excluded - [join('.nx', 'cache', 'ui', 'package.json')]: '', // nx cache should be excluded - [join('node_modules', 'eslint', 'package.json')]: '', // root node_modules should be excluded - [join('ui', 'node_modules', 'eslint', 'package.json')]: '', // project node_modules should be excluded + [path.join('ui', 'package.json')]: '', + [path.join('ui', 'ng-package.json')]: '', // non-exact file match should be excluded + [path.join('.nx', 'cache', 'ui', 'package.json')]: '', // nx cache should be excluded + [path.join('node_modules', 'eslint', 'package.json')]: '', // root node_modules should be excluded + [path.join('ui', 'node_modules', 'eslint', 'package.json')]: '', // project node_modules should be excluded }, MEMFS_VOLUME, ); @@ -28,7 +28,7 @@ describe('findAllPackageJson', () => { it('should return all valid package.json files (exclude .nx, node_modules)', async () => { await expect(findAllPackageJson()).resolves.toEqual([ 'package.json', - join('ui', 'package.json'), + path.join('ui', 'package.json'), ]); }); }); @@ -45,7 +45,7 @@ describe('getTotalDependencies', () => { vitest: '1.3.1', }, } satisfies PackageJson), - [join('ui', 'package.json')]: JSON.stringify({ + [path.join('ui', 'package.json')]: JSON.stringify({ dependencies: { '@code-pushup/eslint-config': '1.0.0', '@typescript-eslint/eslint-plugin': '2.0.0', @@ -64,7 +64,7 @@ describe('getTotalDependencies', () => { it('should return correct number of dependencies', async () => { await expect( - getTotalDependencies([join(MEMFS_VOLUME, 'package.json')]), + getTotalDependencies([path.join(MEMFS_VOLUME, 'package.json')]), ).resolves.toStrictEqual({ dependencies: 1, devDependencies: 3, @@ -75,8 +75,8 @@ describe('getTotalDependencies', () => { it('should merge dependencies for multiple package.json files', async () => { await expect( getTotalDependencies([ - join(MEMFS_VOLUME, 'package.json'), - join(MEMFS_VOLUME, 'ui', 'package.json'), + path.join(MEMFS_VOLUME, 'package.json'), + path.join(MEMFS_VOLUME, 'ui', 'package.json'), ]), ).resolves.toStrictEqual({ dependencies: 2, diff --git a/packages/plugin-js-packages/src/lib/utils.ts b/packages/plugin-js-packages/src/lib/utils.ts index cc13ec96b..b87835ba9 100644 --- a/packages/plugin-js-packages/src/lib/utils.ts +++ b/packages/plugin-js-packages/src/lib/utils.ts @@ -1,9 +1,9 @@ import { type JSPackagesPluginConfig, jsPackagesPluginConfigSchema, -} from './config'; -import { packageManagers } from './package-managers'; -import { derivePackageManager } from './package-managers/derive-package-manager'; +} from './config.js'; +import { derivePackageManager } from './package-managers/derive-package-manager.js'; +import { packageManagers } from './package-managers/package-managers.js'; export async function normalizeConfig(config?: JSPackagesPluginConfig) { const jsPackagesPluginConfig = jsPackagesPluginConfigSchema.parse( diff --git a/packages/plugin-js-packages/src/lib/utils.unit.test.ts b/packages/plugin-js-packages/src/lib/utils.unit.test.ts index 9cc321362..0f2b87f81 100644 --- a/packages/plugin-js-packages/src/lib/utils.unit.test.ts +++ b/packages/plugin-js-packages/src/lib/utils.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { normalizeConfig } from './utils'; +import { normalizeConfig } from './utils.js'; describe('normalizeConfig', () => { it('should return checks object', async () => { diff --git a/packages/plugin-js-packages/vite.config.integration.ts b/packages/plugin-js-packages/vite.config.integration.ts index 143f1bd10..1d22bec69 100644 --- a/packages/plugin-js-packages/vite.config.integration.ts +++ b/packages/plugin-js-packages/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/plugin-js-packages', diff --git a/packages/plugin-js-packages/vite.config.unit.ts b/packages/plugin-js-packages/vite.config.unit.ts index 8beae7f5e..68f80bdce 100644 --- a/packages/plugin-js-packages/vite.config.unit.ts +++ b/packages/plugin-js-packages/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/plugin-js-packages', diff --git a/packages/plugin-lighthouse/.eslintrc.json b/packages/plugin-lighthouse/.eslintrc.json deleted file mode 100644 index cdaf49e79..000000000 --- a/packages/plugin-lighthouse/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["packages/plugin-lighthouse/tsconfig.*?.json"] - } - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": ["error"] - } - } - ] -} diff --git a/packages/plugin-lighthouse/eslint.config.js b/packages/plugin-lighthouse/eslint.config.js new file mode 100644 index 000000000..40165321a --- /dev/null +++ b/packages/plugin-lighthouse/eslint.config.js @@ -0,0 +1,21 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config( + ...baseConfig, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': 'error', + }, + }, +); diff --git a/packages/plugin-lighthouse/package.json b/packages/plugin-lighthouse/package.json index e20e2be6b..9f1729c40 100644 --- a/packages/plugin-lighthouse/package.json +++ b/packages/plugin-lighthouse/package.json @@ -1,6 +1,6 @@ { "name": "@code-pushup/lighthouse-plugin", - "version": "0.55.0", + "version": "0.57.0", "license": "MIT", "description": "Code PushUp plugin for measuring web performance and quality with Lighthouse 🔥", "homepage": "https://github.com/code-pushup/cli/tree/main/packages/plugin-lighthouse#readme", @@ -35,11 +35,9 @@ "access": "public" }, "type": "module", - "main": "./index.js", - "types": "./src/index.d.ts", "dependencies": { - "@code-pushup/models": "0.55.0", - "@code-pushup/utils": "0.55.0", + "@code-pushup/models": "0.57.0", + "@code-pushup/utils": "0.57.0", "ansis": "^3.3.0", "chrome-launcher": "^1.1.1", "lighthouse": "^12.0.0", diff --git a/packages/plugin-lighthouse/project.json b/packages/plugin-lighthouse/project.json index f58622ae5..84f7f91f1 100644 --- a/packages/plugin-lighthouse/project.json +++ b/packages/plugin-lighthouse/project.json @@ -5,14 +5,13 @@ "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/packages/plugin-lighthouse", "main": "packages/plugin-lighthouse/src/index.ts", "tsConfig": "packages/plugin-lighthouse/tsconfig.lib.json", - "assets": ["packages/plugin-lighthouse/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["packages/plugin-lighthouse/*.md"] } }, "lint": { diff --git a/packages/plugin-lighthouse/src/index.ts b/packages/plugin-lighthouse/src/index.ts index 7153e6f50..5e454f03b 100644 --- a/packages/plugin-lighthouse/src/index.ts +++ b/packages/plugin-lighthouse/src/index.ts @@ -1,16 +1,16 @@ -import { lighthousePlugin } from './lib/lighthouse-plugin'; +import { lighthousePlugin } from './lib/lighthouse-plugin.js'; -export { LIGHTHOUSE_REPORT_NAME } from './lib/runner'; +export { LIGHTHOUSE_REPORT_NAME } from './lib/runner/constants.js'; export { DEFAULT_CHROME_FLAGS, LIGHTHOUSE_PLUGIN_SLUG, LIGHTHOUSE_OUTPUT_PATH, -} from './lib/constants'; +} from './lib/constants.js'; export { lighthouseAuditRef, lighthouseGroupRef, type LighthouseGroupSlugs, -} from './lib/utils'; -export type { LighthouseOptions } from './lib/types'; -export { lighthousePlugin } from './lib/lighthouse-plugin'; +} from './lib/utils.js'; +export type { LighthouseOptions } from './lib/types.js'; +export { lighthousePlugin } from './lib/lighthouse-plugin.js'; export default lighthousePlugin; diff --git a/packages/plugin-lighthouse/src/lib/constants.ts b/packages/plugin-lighthouse/src/lib/constants.ts index 12f1d6d5d..5d3cce15c 100644 --- a/packages/plugin-lighthouse/src/lib/constants.ts +++ b/packages/plugin-lighthouse/src/lib/constants.ts @@ -1,12 +1,12 @@ import { DEFAULT_FLAGS } from 'chrome-launcher/dist/flags.js'; -import { join } from 'node:path'; +import path from 'node:path'; import { DEFAULT_PERSIST_OUTPUT_DIR } from '@code-pushup/models'; // headless is needed to pass CI on Linux and Windows (locally it works without headless too) export const DEFAULT_CHROME_FLAGS = [...DEFAULT_FLAGS, '--headless']; export const LIGHTHOUSE_PLUGIN_SLUG = 'lighthouse'; -export const LIGHTHOUSE_OUTPUT_PATH = join( +export const LIGHTHOUSE_OUTPUT_PATH = path.join( DEFAULT_PERSIST_OUTPUT_DIR, LIGHTHOUSE_PLUGIN_SLUG, ); diff --git a/packages/plugin-lighthouse/src/lib/lighthouse-plugin.ts b/packages/plugin-lighthouse/src/lib/lighthouse-plugin.ts index 5ad53ba71..7683f4586 100644 --- a/packages/plugin-lighthouse/src/lib/lighthouse-plugin.ts +++ b/packages/plugin-lighthouse/src/lib/lighthouse-plugin.ts @@ -1,14 +1,14 @@ +import { createRequire } from 'node:module'; import type { PluginConfig } from '@code-pushup/models'; -import { name, version } from '../../package.json'; -import { LIGHTHOUSE_PLUGIN_SLUG } from './constants'; -import { normalizeFlags } from './normalize-flags'; +import { LIGHTHOUSE_PLUGIN_SLUG } from './constants.js'; +import { normalizeFlags } from './normalize-flags.js'; import { LIGHTHOUSE_GROUPS, LIGHTHOUSE_NAVIGATION_AUDITS, - createRunnerFunction, -} from './runner'; -import type { LighthouseOptions } from './types'; -import { filterAuditsAndGroupsByOnlyOptions } from './utils'; +} from './runner/constants.js'; +import { createRunnerFunction } from './runner/runner.js'; +import type { LighthouseOptions } from './types.js'; +import { filterAuditsAndGroupsByOnlyOptions } from './utils.js'; export function lighthousePlugin( url: string, @@ -23,10 +23,14 @@ export function lighthousePlugin( { skipAudits, onlyAudits, onlyCategories }, ); + const packageJson = createRequire(import.meta.url)( + '../../package.json', + ) as typeof import('../../package.json'); + return { slug: LIGHTHOUSE_PLUGIN_SLUG, - packageName: name, - version, + packageName: packageJson.name, + version: packageJson.version, title: 'Lighthouse', icon: 'lighthouse', audits, diff --git a/packages/plugin-lighthouse/src/lib/lighthouse-plugin.unit.test.ts b/packages/plugin-lighthouse/src/lib/lighthouse-plugin.unit.test.ts index 400faa800..18034a36d 100644 --- a/packages/plugin-lighthouse/src/lib/lighthouse-plugin.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/lighthouse-plugin.unit.test.ts @@ -1,6 +1,6 @@ import { expect } from 'vitest'; import { pluginConfigSchema } from '@code-pushup/models'; -import { lighthousePlugin } from './lighthouse-plugin'; +import { lighthousePlugin } from './lighthouse-plugin.js'; describe('lighthousePlugin-config-object', () => { it('should create valid plugin config', () => { @@ -50,4 +50,14 @@ describe('lighthousePlugin-config-object', () => { ]), ); }); + + it('should throw when filtering groups by zero-weight onlyAudits', () => { + const pluginConfig = lighthousePlugin('https://code-pushup-portal.com', { + onlyAudits: ['csp-xss'], + }); + + expect(() => pluginConfigSchema.parse(pluginConfig)).toThrow( + 'In a category, there has to be at least one ref with weight > 0. Affected refs: csp-xss', + ); + }); }); diff --git a/packages/plugin-lighthouse/src/lib/normalize-flags.ts b/packages/plugin-lighthouse/src/lib/normalize-flags.ts index e7c1c0eb4..a5d45e62f 100644 --- a/packages/plugin-lighthouse/src/lib/normalize-flags.ts +++ b/packages/plugin-lighthouse/src/lib/normalize-flags.ts @@ -1,8 +1,9 @@ import { bold, yellow } from 'ansis'; import { ui } from '@code-pushup/utils'; -import { LIGHTHOUSE_PLUGIN_SLUG } from './constants'; -import { DEFAULT_CLI_FLAGS, type LighthouseCliFlags } from './runner'; -import type { LighthouseOptions } from './types'; +import { LIGHTHOUSE_PLUGIN_SLUG } from './constants.js'; +import { DEFAULT_CLI_FLAGS } from './runner/constants.js'; +import type { LighthouseCliFlags } from './runner/types.js'; +import type { LighthouseOptions } from './types.js'; const { onlyCategories, ...originalDefaultCliFlags } = DEFAULT_CLI_FLAGS; export const DEFAULT_LIGHTHOUSE_OPTIONS = { diff --git a/packages/plugin-lighthouse/src/lib/normalize-flags.unit.test.ts b/packages/plugin-lighthouse/src/lib/normalize-flags.unit.test.ts index 92c195df5..31c817d02 100644 --- a/packages/plugin-lighthouse/src/lib/normalize-flags.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/normalize-flags.unit.test.ts @@ -1,12 +1,12 @@ import { bold, yellow } from 'ansis'; -import { join } from 'node:path'; +import path from 'node:path'; import { describe, expect, it } from 'vitest'; import { getLogMessages } from '@code-pushup/test-utils'; import { ui } from '@code-pushup/utils'; -import { DEFAULT_CHROME_FLAGS, LIGHTHOUSE_OUTPUT_PATH } from './constants'; -import { logUnsupportedFlagsInUse, normalizeFlags } from './normalize-flags'; -import { LIGHTHOUSE_REPORT_NAME } from './runner/constants'; -import type { LighthouseOptions } from './types'; +import { DEFAULT_CHROME_FLAGS, LIGHTHOUSE_OUTPUT_PATH } from './constants.js'; +import { logUnsupportedFlagsInUse, normalizeFlags } from './normalize-flags.js'; +import { LIGHTHOUSE_REPORT_NAME } from './runner/constants.js'; +import type { LighthouseOptions } from './types.js'; describe('logUnsupportedFlagsInUse', () => { it('should log unsupported entries', () => { @@ -18,6 +18,7 @@ describe('logUnsupportedFlagsInUse', () => { )} used unsupported flags: ${bold('list-all-audits')}`, ); }); + it('should log only 3 details of unsupported entries', () => { const unsupportedFlags = { 'list-all-audits': true, @@ -54,8 +55,9 @@ describe('normalizeFlags', () => { // custom overwrites in favour of the plugin quiet: true, output: ['json'], - outputPath: join(LIGHTHOUSE_OUTPUT_PATH, LIGHTHOUSE_REPORT_NAME), + outputPath: path.join(LIGHTHOUSE_OUTPUT_PATH, LIGHTHOUSE_REPORT_NAME), }; + it('should fill defaults with undefined flags', () => { expect(normalizeFlags()).toStrictEqual(normalizedDefaults); }); diff --git a/packages/plugin-lighthouse/src/lib/runner/constants.ts b/packages/plugin-lighthouse/src/lib/runner/constants.ts index c3d5cf458..e57a7ef55 100644 --- a/packages/plugin-lighthouse/src/lib/runner/constants.ts +++ b/packages/plugin-lighthouse/src/lib/runner/constants.ts @@ -5,9 +5,9 @@ import { type Audit as LHAudit, defaultConfig, } from 'lighthouse'; -import { join } from 'node:path'; +import path from 'node:path'; import type { Audit, Group } from '@code-pushup/models'; -import { DEFAULT_CHROME_FLAGS, LIGHTHOUSE_OUTPUT_PATH } from '../constants'; +import { DEFAULT_CHROME_FLAGS, LIGHTHOUSE_OUTPUT_PATH } from '../constants.js'; const { audits, categories } = defaultConfig; @@ -75,8 +75,8 @@ async function loadLighthouseAudit( // shape: string // otherwise it is a JS object maintaining a `path` property // shape: { path: string, options?: {}; } - const path = typeof value === 'string' ? value : value.path; - const module = (await import(`lighthouse/core/audits/${path}.js`)) as { + const file = typeof value === 'string' ? value : value.path; + const module = (await import(`lighthouse/core/audits/${file}.js`)) as { default: typeof LHAudit; }; return module.default; @@ -101,5 +101,5 @@ export const DEFAULT_CLI_FLAGS = { skipAudits: [], onlyCategories: [], output: ['json'], - outputPath: join(LIGHTHOUSE_OUTPUT_PATH, LIGHTHOUSE_REPORT_NAME), + outputPath: path.join(LIGHTHOUSE_OUTPUT_PATH, LIGHTHOUSE_REPORT_NAME), } satisfies Partial; diff --git a/packages/plugin-lighthouse/src/lib/runner/constants.unit.test.ts b/packages/plugin-lighthouse/src/lib/runner/constants.unit.test.ts index 1bf902290..b316b36b6 100644 --- a/packages/plugin-lighthouse/src/lib/runner/constants.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/runner/constants.unit.test.ts @@ -1,6 +1,9 @@ import { expect } from 'vitest'; import { auditSchema, groupSchema } from '@code-pushup/models'; -import { LIGHTHOUSE_GROUPS, LIGHTHOUSE_NAVIGATION_AUDITS } from './constants'; +import { + LIGHTHOUSE_GROUPS, + LIGHTHOUSE_NAVIGATION_AUDITS, +} from './constants.js'; describe('constants', () => { it.each(LIGHTHOUSE_NAVIGATION_AUDITS.map(a => [a.slug, a]))( diff --git a/packages/plugin-lighthouse/src/lib/runner/details/details.ts b/packages/plugin-lighthouse/src/lib/runner/details/details.ts index 1467a9147..df54d238c 100644 --- a/packages/plugin-lighthouse/src/lib/runner/details/details.ts +++ b/packages/plugin-lighthouse/src/lib/runner/details/details.ts @@ -4,9 +4,9 @@ import type Details from 'lighthouse/types/lhr/audit-details'; import type { Result } from 'lighthouse/types/lhr/audit-result'; import type { AuditDetails, Table } from '@code-pushup/models'; import { ui } from '@code-pushup/utils'; -import { PLUGIN_SLUG } from '../constants'; -import { parseOpportunityToAuditDetailsTable } from './opportunity.type'; -import { parseTableToAuditDetailsTable } from './table.type'; +import { PLUGIN_SLUG } from '../constants.js'; +import { parseOpportunityToAuditDetailsTable } from './opportunity.type.js'; +import { parseTableToAuditDetailsTable } from './table.type.js'; export function toAuditDetails>( details: T | undefined, diff --git a/packages/plugin-lighthouse/src/lib/runner/details/details.unit.test.ts b/packages/plugin-lighthouse/src/lib/runner/details/details.unit.test.ts index 4cdcb142f..276a839e1 100644 --- a/packages/plugin-lighthouse/src/lib/runner/details/details.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/runner/details/details.unit.test.ts @@ -5,7 +5,7 @@ import type { Result } from 'lighthouse/types/lhr/audit-result'; import { describe, expect, it } from 'vitest'; import { getLogMessages } from '@code-pushup/test-utils'; import { ui } from '@code-pushup/utils'; -import { logUnsupportedDetails, toAuditDetails } from './details'; +import { logUnsupportedDetails, toAuditDetails } from './details.js'; describe('logUnsupportedDetails', () => { it('should log unsupported entries', () => { diff --git a/packages/plugin-lighthouse/src/lib/runner/details/item-value.ts b/packages/plugin-lighthouse/src/lib/runner/details/item-value.ts index 49560850c..87de82abc 100644 --- a/packages/plugin-lighthouse/src/lib/runner/details/item-value.ts +++ b/packages/plugin-lighthouse/src/lib/runner/details/item-value.ts @@ -58,7 +58,7 @@ export function formatTableItemPropertyValue( const parsedItemValue = parseTableItemPropertyValue(itemValue); - /* eslint-disable no-magic-numbers */ + /* eslint-disable @typescript-eslint/no-magic-numbers */ switch (itemValueFormat) { case 'bytes': return formatBytes(Number(parsedItemValue)); @@ -94,7 +94,7 @@ export function formatTableItemPropertyValue( ui().logger.info(`Format type ${bold('thumbnail')} is not implemented`); return ''; } - /* eslint-enable no-magic-numbers */ + /* eslint-enable @typescript-eslint/no-magic-numbers */ return itemValue; } diff --git a/packages/plugin-lighthouse/src/lib/runner/details/item-value.unit.test.ts b/packages/plugin-lighthouse/src/lib/runner/details/item-value.unit.test.ts index 52bb71cd7..2e344b56f 100644 --- a/packages/plugin-lighthouse/src/lib/runner/details/item-value.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/runner/details/item-value.unit.test.ts @@ -9,7 +9,7 @@ import { parseNodeValue, parseSimpleItemValue, parseTableItemPropertyValue, -} from './item-value'; +} from './item-value.js'; describe('parseNodeValue', () => { it('should parse selector of node', () => { diff --git a/packages/plugin-lighthouse/src/lib/runner/details/opportunity.type.ts b/packages/plugin-lighthouse/src/lib/runner/details/opportunity.type.ts index a1bac410d..3a662d659 100644 --- a/packages/plugin-lighthouse/src/lib/runner/details/opportunity.type.ts +++ b/packages/plugin-lighthouse/src/lib/runner/details/opportunity.type.ts @@ -5,8 +5,8 @@ import { tableSchema, } from '@code-pushup/models'; import { formatBytes, formatDuration, html } from '@code-pushup/utils'; -import { parseTableColumns, parseTableEntry } from './table.type'; -import { LighthouseAuditDetailsParsingError } from './utils'; +import { parseTableColumns, parseTableEntry } from './table.type.js'; +import { LighthouseAuditDetailsParsingError } from './utils.js'; export function parseOpportunityToAuditDetailsTable( details: Details.Opportunity, diff --git a/packages/plugin-lighthouse/src/lib/runner/details/opportunity.type.unit.test.ts b/packages/plugin-lighthouse/src/lib/runner/details/opportunity.type.unit.test.ts index fc0e23321..f0dcf20ec 100644 --- a/packages/plugin-lighthouse/src/lib/runner/details/opportunity.type.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/runner/details/opportunity.type.unit.test.ts @@ -1,8 +1,8 @@ import type Details from 'lighthouse/types/lhr/audit-details'; import { describe, expect, it } from 'vitest'; import type { Table } from '@code-pushup/models'; -import { parseOpportunityToAuditDetailsTable } from './opportunity.type'; -import { LighthouseAuditDetailsParsingError } from './utils'; +import { parseOpportunityToAuditDetailsTable } from './opportunity.type.js'; +import { LighthouseAuditDetailsParsingError } from './utils.js'; describe('parseOpportunityDetails', () => { it('should omit empty opportunities', () => { diff --git a/packages/plugin-lighthouse/src/lib/runner/details/table.type.ts b/packages/plugin-lighthouse/src/lib/runner/details/table.type.ts index 705b166c7..9d5e60947 100644 --- a/packages/plugin-lighthouse/src/lib/runner/details/table.type.ts +++ b/packages/plugin-lighthouse/src/lib/runner/details/table.type.ts @@ -5,8 +5,8 @@ import { type TableRowObject, tableSchema, } from '@code-pushup/models'; -import { formatTableItemPropertyValue } from './item-value'; -import { LighthouseAuditDetailsParsingError } from './utils'; +import { formatTableItemPropertyValue } from './item-value.js'; +import { LighthouseAuditDetailsParsingError } from './utils.js'; export function parseTableToAuditDetailsTable( details: Details.Table, diff --git a/packages/plugin-lighthouse/src/lib/runner/details/table.type.unit.test.ts b/packages/plugin-lighthouse/src/lib/runner/details/table.type.unit.test.ts index 377cd229e..f9605a43b 100644 --- a/packages/plugin-lighthouse/src/lib/runner/details/table.type.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/runner/details/table.type.unit.test.ts @@ -6,8 +6,8 @@ import { parseTableEntry, parseTableRow, parseTableToAuditDetailsTable, -} from './table.type'; -import { LighthouseAuditDetailsParsingError } from './utils'; +} from './table.type.js'; +import { LighthouseAuditDetailsParsingError } from './utils.js'; describe('parseTableToAuditDetails', () => { it('should render complete details of type table', () => { diff --git a/packages/plugin-lighthouse/src/lib/runner/index.ts b/packages/plugin-lighthouse/src/lib/runner/index.ts deleted file mode 100644 index eb4831818..000000000 --- a/packages/plugin-lighthouse/src/lib/runner/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { createRunnerFunction } from './runner'; -export { - LIGHTHOUSE_REPORT_NAME, - LIGHTHOUSE_NAVIGATION_AUDITS, - LIGHTHOUSE_GROUPS, - DEFAULT_CLI_FLAGS, -} from './constants'; -export type { LighthouseCliFlags } from './types'; diff --git a/packages/plugin-lighthouse/src/lib/runner/runner.ts b/packages/plugin-lighthouse/src/lib/runner/runner.ts index b6a18e2c3..a750dd992 100644 --- a/packages/plugin-lighthouse/src/lib/runner/runner.ts +++ b/packages/plugin-lighthouse/src/lib/runner/runner.ts @@ -1,16 +1,16 @@ import type { RunnerResult } from 'lighthouse'; import { runLighthouse } from 'lighthouse/cli/run.js'; -import { dirname } from 'node:path'; +import path from 'node:path'; import type { AuditOutputs, RunnerFunction } from '@code-pushup/models'; import { ensureDirectoryExists } from '@code-pushup/utils'; -import { DEFAULT_CLI_FLAGS } from './constants'; -import type { LighthouseCliFlags } from './types'; +import { DEFAULT_CLI_FLAGS } from './constants.js'; +import type { LighthouseCliFlags } from './types.js'; import { determineAndSetLogLevel, getConfig, normalizeAuditOutputs, toAuditOutputs, -} from './utils'; +} from './utils.js'; export function createRunnerFunction( urlUnderTest: string, @@ -28,7 +28,7 @@ export function createRunnerFunction( const config = await getConfig({ configPath, preset }); if (outputPath) { - await ensureDirectoryExists(dirname(outputPath)); + await ensureDirectoryExists(path.dirname(outputPath)); } const enrichedFlags = { diff --git a/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts b/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts index 1698ce3b5..c0d2474bf 100644 --- a/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts @@ -2,10 +2,10 @@ import type { Config } from 'lighthouse'; import { runLighthouse } from 'lighthouse/cli/run.js'; import type { Result } from 'lighthouse/types/lhr/audit-result'; import { expect, vi } from 'vitest'; -import { DEFAULT_CLI_FLAGS } from './constants'; -import { createRunnerFunction } from './runner'; -import type { LighthouseCliFlags } from './types'; -import { determineAndSetLogLevel, getConfig } from './utils'; +import { DEFAULT_CLI_FLAGS } from './constants.js'; +import { createRunnerFunction } from './runner.js'; +import type { LighthouseCliFlags } from './types.js'; +import { determineAndSetLogLevel, getConfig } from './utils.js'; // used for createRunnerMocking vi.mock('./utils', async () => { @@ -39,7 +39,7 @@ vi.mock('lighthouse/cli/run.js', async () => { config, lhr: { audits: { - ['cumulative-layout-shift']: { + 'cumulative-layout-shift': { id: 'cumulative-layout-shift', title: 'Cumulative Layout Shift', description: diff --git a/packages/plugin-lighthouse/src/lib/runner/types.ts b/packages/plugin-lighthouse/src/lib/runner/types.ts index 5f1f18f18..2bec13f69 100644 --- a/packages/plugin-lighthouse/src/lib/runner/types.ts +++ b/packages/plugin-lighthouse/src/lib/runner/types.ts @@ -1,4 +1,4 @@ -import type { LighthouseOptions } from '../types'; +import type { LighthouseOptions } from '../types.js'; export type NormalizedFlags = { // normalized diff --git a/packages/plugin-lighthouse/src/lib/runner/utils.ts b/packages/plugin-lighthouse/src/lib/runner/utils.ts index 5d5b23d24..99bb3e40b 100644 --- a/packages/plugin-lighthouse/src/lib/runner/utils.ts +++ b/packages/plugin-lighthouse/src/lib/runner/utils.ts @@ -13,9 +13,9 @@ import { readJsonFile, ui, } from '@code-pushup/utils'; -import type { LighthouseOptions } from '../types'; -import { logUnsupportedDetails, toAuditDetails } from './details/details'; -import type { LighthouseCliFlags } from './types'; +import type { LighthouseOptions } from '../types.js'; +import { logUnsupportedDetails, toAuditDetails } from './details/details.js'; +import type { LighthouseCliFlags } from './types.js'; export function normalizeAuditOutputs( auditOutputs: AuditOutputs, diff --git a/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts b/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts index 2195f7048..8f2aff376 100644 --- a/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts @@ -4,7 +4,7 @@ import log from 'lighthouse-logger'; import type Details from 'lighthouse/types/lhr/audit-details'; import type { Result } from 'lighthouse/types/lhr/audit-result'; import { vol } from 'memfs'; -import { join } from 'node:path'; +import path from 'node:path'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { type AuditOutput, @@ -13,13 +13,13 @@ import { } from '@code-pushup/models'; import { MEMFS_VOLUME, getLogMessages } from '@code-pushup/test-utils'; import { ui } from '@code-pushup/utils'; -import { unsupportedDetailTypes } from './details/details'; +import { unsupportedDetailTypes } from './details/details.js'; import { determineAndSetLogLevel, getConfig, normalizeAuditOutputs, toAuditOutputs, -} from './utils'; +} from './utils.js'; // mock bundleRequire inside importEsmModule used for fetching config vi.mock('bundle-require', async () => { @@ -376,7 +376,7 @@ describe('getConfig', () => { it('should return undefined and log if configPath has wrong extension', async () => { await expect( - getConfig({ configPath: join('wrong.not') }), + getConfig({ configPath: path.join('wrong.not') }), ).resolves.toBeUndefined(); expect(getLogMessages(ui().logger).at(0)).toMatch( 'Format of file wrong.not not supported', @@ -386,6 +386,7 @@ describe('getConfig', () => { describe('determineAndSetLogLevel', () => { const debugLib = debug as { enabled: (flag: string) => boolean }; + beforeEach(() => { log.setLevel('info'); }); diff --git a/packages/plugin-lighthouse/src/lib/types.ts b/packages/plugin-lighthouse/src/lib/types.ts index c44312aae..30820c1cb 100644 --- a/packages/plugin-lighthouse/src/lib/types.ts +++ b/packages/plugin-lighthouse/src/lib/types.ts @@ -1,7 +1,7 @@ import type { CliFlags } from 'lighthouse'; -import type { ExcludeNullFromPropertyTypes } from '@code-pushup/utils'; +import type { ExcludeNullableProps } from '@code-pushup/utils'; -export type LighthouseOptions = ExcludeNullFromPropertyTypes< +export type LighthouseOptions = ExcludeNullableProps< Partial< Omit< CliFlags, diff --git a/packages/plugin-lighthouse/src/lib/utils.ts b/packages/plugin-lighthouse/src/lib/utils.ts index a9e17a28f..e889b617d 100644 --- a/packages/plugin-lighthouse/src/lib/utils.ts +++ b/packages/plugin-lighthouse/src/lib/utils.ts @@ -1,7 +1,7 @@ import type { Audit, CategoryRef, Group } from '@code-pushup/models'; import { filterItemRefsBy, toArray } from '@code-pushup/utils'; -import { LIGHTHOUSE_PLUGIN_SLUG } from './constants'; -import type { LighthouseCliFlags } from './runner'; +import { LIGHTHOUSE_PLUGIN_SLUG } from './constants.js'; +import type { LighthouseCliFlags } from './runner/types.js'; export type LighthouseGroupSlugs = | 'performance' diff --git a/packages/plugin-lighthouse/src/lib/utils.unit.test.ts b/packages/plugin-lighthouse/src/lib/utils.unit.test.ts index 41740b47f..61aa68a84 100644 --- a/packages/plugin-lighthouse/src/lib/utils.unit.test.ts +++ b/packages/plugin-lighthouse/src/lib/utils.unit.test.ts @@ -14,7 +14,7 @@ import { lighthouseGroupRef, validateAudits, validateOnlyCategories, -} from './utils'; +} from './utils.js'; describe('lighthouseAuditRef', () => { it('should return valid lighthouse group with weight 1 by default', () => { diff --git a/packages/plugin-lighthouse/vite.config.integration.ts b/packages/plugin-lighthouse/vite.config.integration.ts index daa22a6f0..87a7c4ede 100644 --- a/packages/plugin-lighthouse/vite.config.integration.ts +++ b/packages/plugin-lighthouse/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/plugin-lighthouse', diff --git a/packages/plugin-lighthouse/vite.config.unit.ts b/packages/plugin-lighthouse/vite.config.unit.ts index a691fac43..932dbde85 100644 --- a/packages/plugin-lighthouse/vite.config.unit.ts +++ b/packages/plugin-lighthouse/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/plugin-lighthouse', diff --git a/packages/utils/.eslintrc.json b/packages/utils/.eslintrc.json deleted file mode 100644 index 0033922df..000000000 --- a/packages/utils/.eslintrc.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "parserOptions": { - "project": ["packages/utils/tsconfig.*?.json"] - }, - "rules": {} - }, - { - "files": ["*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.json"], - "parser": "jsonc-eslint-parser", - "rules": { - "@nx/dependency-checks": [ - "error", - { - "ignoredDependencies": ["esbuild"] // esbuild is a peer dependency of bundle-require - } - ] - } - } - ] -} diff --git a/packages/utils/eslint.config.js b/packages/utils/eslint.config.js new file mode 100644 index 000000000..1ad01224a --- /dev/null +++ b/packages/utils/eslint.config.js @@ -0,0 +1,24 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config( + ...baseConfig, + { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': [ + 'error', + { ignoredDependencies: ['esbuild'] }, // esbuild is a peer dependency of bundle-require + ], + }, + }, +); diff --git a/packages/utils/mocks/fixtures/execute-progress.mock.mjs b/packages/utils/mocks/fixtures/execute-progress.mock.mjs index bfded37bc..728b0e88f 100644 --- a/packages/utils/mocks/fixtures/execute-progress.mock.mjs +++ b/packages/utils/mocks/fixtures/execute-progress.mock.mjs @@ -1,5 +1,5 @@ import { bold, gray } from 'ansis'; -import { getProgressBar } from '../../../../dist/packages/utils/index.js'; +import { getProgressBar } from '../../../../dist/packages/utils'; const _arg = (name, fallback = '') => process.argv diff --git a/packages/utils/package.json b/packages/utils/package.json index add91921f..c39dc1903 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@code-pushup/utils", - "version": "0.55.0", + "version": "0.57.0", "description": "Low-level utilities (helper functions, etc.) used by Code PushUp CLI", "license": "MIT", "homepage": "https://github.com/code-pushup/cli/tree/main/packages/utils#readme", @@ -23,10 +23,11 @@ "access": "public" }, "type": "module", - "main": "./index.js", - "types": "./src/index.d.ts", + "engines": { + "node": ">=17.0.0" + }, "dependencies": { - "@code-pushup/models": "0.55.0", + "@code-pushup/models": "0.57.0", "@isaacs/cliui": "^8.0.2", "@poppinss/cliui": "^6.4.0", "ansis": "^3.3.0", @@ -35,6 +36,7 @@ "esbuild": "^0.19.2", "multi-progress-bars": "^5.0.3", "semver": "^7.6.0", - "simple-git": "^3.20.0" + "simple-git": "^3.20.0", + "zod-validation-error": "^3.4.0" } } diff --git a/packages/utils/perf/crawl-file-system/fs-walk.ts b/packages/utils/perf/crawl-file-system/fs-walk.ts index 396970e18..8c57d12a2 100644 --- a/packages/utils/perf/crawl-file-system/fs-walk.ts +++ b/packages/utils/perf/crawl-file-system/fs-walk.ts @@ -1,5 +1,5 @@ import { type Entry, walkStream } from '@nodelib/fs.walk'; -import type { CrawlFileSystemOptions } from '../../src'; +import type { CrawlFileSystemOptions } from '../../src/index.js'; // from https://github.com/webpro/knip/pull/426 export function crawlFileSystemFsWalk( diff --git a/packages/utils/perf/crawl-file-system/index.ts b/packages/utils/perf/crawl-file-system/index.ts index 178477c4c..e158ab050 100644 --- a/packages/utils/perf/crawl-file-system/index.ts +++ b/packages/utils/perf/crawl-file-system/index.ts @@ -1,10 +1,10 @@ import * as Benchmark from 'benchmark'; -import { join } from 'node:path'; +import path from 'node:path'; import { type CrawlFileSystemOptions, crawlFileSystem, -} from '../../src/lib/file-system'; -import { crawlFileSystemFsWalk } from './fs-walk'; +} from '../../src/lib/file-system.js'; +import { crawlFileSystemFsWalk } from './fs-walk.js'; const PROCESS_ARGUMENT_TARGET_DIRECTORY = process.argv @@ -21,7 +21,7 @@ const suite = new Benchmark.Suite('report-scoring'); const TARGET_DIRECTORY = PROCESS_ARGUMENT_TARGET_DIRECTORY || - join(process.cwd(), '..', '..', '..', 'node_modules'); + path.join(process.cwd(), '..', '..', '..', 'node_modules'); const PATTERN = PROCESS_ARGUMENT_PATTERN || /.json$/; // ================== @@ -30,7 +30,7 @@ const start = performance.now(); // Add listener const listeners = { - cycle: function (event: Benchmark.Event) { + cycle(event: Benchmark.Event) { console.info(String(event.target)); }, complete: () => { @@ -87,7 +87,7 @@ function wrapWithDefer( ) { return { defer: true, // important for async functions - fn: function (deferred: { resolve: () => void }) { + fn(deferred: { resolve: () => void }) { return asyncFn(options) .catch(() => []) .then((result: unknown[]) => { diff --git a/packages/utils/perf/score-report/index.ts b/packages/utils/perf/score-report/index.ts index c98a42d05..3f477e915 100644 --- a/packages/utils/perf/score-report/index.ts +++ b/packages/utils/perf/score-report/index.ts @@ -1,10 +1,10 @@ import Benchmark from 'benchmark'; import type { Report } from '@code-pushup/models'; -import { scoreReport } from '../../src/lib/reports/scoring'; -import { scoreReportOptimized0 } from './optimized0'; -import { scoreReportOptimized1 } from './optimized1'; -import { scoreReportOptimized2 } from './optimized2'; -import { scoreReportOptimized3 } from './optimized3'; +import { scoreReport } from '../../src/lib/reports/scoring.js'; +import { scoreReportOptimized0 } from './optimized0.js'; +import { scoreReportOptimized1 } from './optimized1.js'; +import { scoreReportOptimized2 } from './optimized2.js'; +import { scoreReportOptimized3 } from './optimized3.js'; type MinimalReportOptions = { numAuditsP1?: number; @@ -34,7 +34,6 @@ const PROCESS_ARGUMENT_NUM_GROUPS_P2 = Number.parseInt( 10, ); -// eslint-disable-next-line import/no-named-as-default-member const suite = new Benchmark.Suite('report-scoring'); const AUDIT_PREFIX = 'a-'; @@ -53,7 +52,7 @@ const NUM_GROUPS_P2 = PROCESS_ARGUMENT_NUM_GROUPS_P2 || NUM_AUDITS_P2 / 2; // Add listener const listeners = { - cycle: function (event: Benchmark.Event) { + cycle(event: Benchmark.Event) { console.info(String(event.target)); }, complete: () => { @@ -139,7 +138,7 @@ function minimalReport(opt?: MinimalReportOptions): Report { packageName: 'perf-benchmark', version: '0', commit: { - date: date, + date, message: 'perf: benchmark score report', author: 'me', hash: 'mock_hash', diff --git a/packages/utils/perf/score-report/optimized0.ts b/packages/utils/perf/score-report/optimized0.ts index 2b391443f..0aa6e7044 100644 --- a/packages/utils/perf/score-report/optimized0.ts +++ b/packages/utils/perf/score-report/optimized0.ts @@ -4,7 +4,7 @@ import type { GroupRef, Report, } from '@code-pushup/models'; -import type { ScoredGroup, ScoredReport } from '../../src/lib/reports/types'; +import type { ScoredGroup, ScoredReport } from '../../src/lib/reports/types.js'; function groupRefToScore(audits: AuditReport[]) { return (ref: GroupRef) => { diff --git a/packages/utils/perf/score-report/optimized1.ts b/packages/utils/perf/score-report/optimized1.ts index 5265da0e2..cd2ec77eb 100644 --- a/packages/utils/perf/score-report/optimized1.ts +++ b/packages/utils/perf/score-report/optimized1.ts @@ -1,11 +1,10 @@ -/* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-assignment */ // Note: The plugins of the ScoredReport are not structured correctly, hence the ESLint disables. import type { Report } from '@code-pushup/models'; -import { GroupRefInvalidError } from '../../src/lib/reports/scoring'; +import { GroupRefInvalidError } from '../../src/lib/reports/scoring.js'; import type { ScoredCategoryConfig, ScoredReport, -} from '../../src/lib/reports/types'; +} from '../../src/lib/reports/types.js'; export function calculateScore( refs: T[], diff --git a/packages/utils/perf/score-report/optimized2.ts b/packages/utils/perf/score-report/optimized2.ts index eebdda043..e48a8fd39 100644 --- a/packages/utils/perf/score-report/optimized2.ts +++ b/packages/utils/perf/score-report/optimized2.ts @@ -1,11 +1,10 @@ -/* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-assignment */ // Note: The plugins of the ScoredReport are not structured correctly, hence the ESLint disables. import type { CategoryRef, GroupRef, Report } from '@code-pushup/models'; -import { GroupRefInvalidError } from '../../src/lib/reports/scoring'; +import { GroupRefInvalidError } from '../../src/lib/reports/scoring.js'; import type { ScoredCategoryConfig, ScoredReport, -} from '../../src/lib/reports/types'; +} from '../../src/lib/reports/types.js'; export function calculateScore( refs: T[], diff --git a/packages/utils/perf/score-report/optimized3.ts b/packages/utils/perf/score-report/optimized3.ts index b2774fb1a..7d8a7cda4 100644 --- a/packages/utils/perf/score-report/optimized3.ts +++ b/packages/utils/perf/score-report/optimized3.ts @@ -6,12 +6,12 @@ import type { GroupRef, Report, } from '@code-pushup/models'; -import type { ScoredReport } from '../../src'; -import { GroupRefInvalidError } from '../../src/lib/reports/scoring'; +import type { ScoredReport } from '../../src/index.js'; +import { GroupRefInvalidError } from '../../src/lib/reports/scoring.js'; import type { ScoredCategoryConfig, ScoredGroup, -} from '../../src/lib/reports/types'; +} from '../../src/lib/reports/types.js'; export function calculateScore( refs: T[], diff --git a/packages/utils/project.json b/packages/utils/project.json index 5b385f317..a4c623dab 100644 --- a/packages/utils/project.json +++ b/packages/utils/project.json @@ -5,14 +5,13 @@ "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/packages/utils", "main": "packages/utils/src/index.ts", "tsConfig": "packages/utils/tsconfig.lib.json", - "assets": ["packages/utils/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["packages/utils/*.md"] } }, "lint": { diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index b864605d1..58dd0dbe6 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,13 +1,13 @@ export { exists } from '@code-pushup/models'; -export { comparePairs, matchArrayItemsByKey, type Diff } from './lib/diff'; -export { stringifyError } from './lib/errors'; +export { comparePairs, matchArrayItemsByKey, type Diff } from './lib/diff.js'; +export { stringifyError } from './lib/errors.js'; export { ProcessError, executeProcess, type ProcessConfig, type ProcessObserver, type ProcessResult, -} from './lib/execute-process'; +} from './lib/execute-process.js'; export { crawlFileSystem, directoryExists, @@ -26,8 +26,8 @@ export { type CrawlFileSystemOptions, type FileResult, type MultipleFileResults, -} from './lib/file-system'; -export { filterItemRefsBy } from './lib/filter'; +} from './lib/file-system.js'; +export { filterItemRefsBy } from './lib/filter.js'; export { formatBytes, formatDuration, @@ -38,14 +38,7 @@ export { truncateIssueMessage, truncateText, truncateTitle, -} from './lib/formatting'; -export { - formatGitPath, - getGitRoot, - guardAgainstLocalChanges, - safeCheckout, - toGitPath, -} from './lib/git/git'; +} from './lib/formatting.js'; export { getCurrentBranchOrTag, getHashFromTag, @@ -53,48 +46,56 @@ export { getLatestCommit, getSemverTags, type LogResult, -} from './lib/git/git.commits-and-tags'; -export { groupByStatus } from './lib/group-by-status'; +} from './lib/git/git.commits-and-tags.js'; +export { + formatGitPath, + getGitRoot, + guardAgainstLocalChanges, + safeCheckout, + toGitPath, +} from './lib/git/git.js'; +export { groupByStatus } from './lib/group-by-status.js'; export { isPromiseFulfilledResult, isPromiseRejectedResult, -} from './lib/guards'; -export { logMultipleResults } from './lib/log-results'; -export { link, ui, type CliUi, type Column } from './lib/logging'; -export { mergeConfigs } from './lib/merge-configs'; -export { getProgressBar, type ProgressBar } from './lib/progress'; + hasNoNullableProps, +} from './lib/guards.js'; +export { logMultipleResults } from './lib/log-results.js'; +export { link, ui, type CliUi, type Column } from './lib/logging.js'; +export { mergeConfigs } from './lib/merge-configs.js'; +export { getProgressBar, type ProgressBar } from './lib/progress.js'; export { CODE_PUSHUP_DOMAIN, CODE_PUSHUP_UNICODE_LOGO, FOOTER_PREFIX, README_LINK, TERMINAL_WIDTH, -} from './lib/reports/constants'; +} from './lib/reports/constants.js'; export { listAuditsFromAllPlugins, listGroupsFromAllPlugins, -} from './lib/reports/flatten-plugins'; -export { generateMdReport } from './lib/reports/generate-md-report'; +} from './lib/reports/flatten-plugins.js'; +export { generateMdReport } from './lib/reports/generate-md-report.js'; export { generateMdReportsDiff, generateMdReportsDiffForMonorepo, -} from './lib/reports/generate-md-reports-diff'; -export { loadReport } from './lib/reports/load-report'; -export { logStdoutSummary } from './lib/reports/log-stdout-summary'; -export { scoreReport } from './lib/reports/scoring'; -export { sortReport } from './lib/reports/sorting'; +} from './lib/reports/generate-md-reports-diff.js'; +export { loadReport } from './lib/reports/load-report.js'; +export { logStdoutSummary } from './lib/reports/log-stdout-summary.js'; +export { scoreReport } from './lib/reports/scoring.js'; +export { sortReport } from './lib/reports/sorting.js'; export type { ScoredCategoryConfig, ScoredGroup, ScoredReport, -} from './lib/reports/types'; +} from './lib/reports/types.js'; export { calcDuration, compareIssueSeverity, formatReportScore, -} from './lib/reports/utils'; -export { isSemver, normalizeSemver, sortSemvers } from './lib/semver'; -export * from './lib/text-formats'; +} from './lib/reports/utils.js'; +export { isSemver, normalizeSemver, sortSemvers } from './lib/semver.js'; +export * from './lib/text-formats/index.js'; export { capitalize, countOccurrences, @@ -112,13 +113,14 @@ export { toUnixNewlines, toUnixPath, type CliArgsObject, -} from './lib/transform'; +} from './lib/transform.js'; export type { - ExcludeNullFromPropertyTypes, + ExcludeNullableProps, ExtractArray, ExtractArrays, ItemOrArray, Prettify, WithRequired, -} from './lib/types'; -export { verboseUtils } from './lib/verbose-utils'; +} from './lib/types.js'; +export { verboseUtils } from './lib/verbose-utils.js'; +export { zodErrorMessageBuilder } from './lib/zod-validation.js'; diff --git a/packages/utils/src/lib/diff.unit.test.ts b/packages/utils/src/lib/diff.unit.test.ts index b701527da..abafe0c82 100644 --- a/packages/utils/src/lib/diff.unit.test.ts +++ b/packages/utils/src/lib/diff.unit.test.ts @@ -1,4 +1,4 @@ -import { comparePairs, matchArrayItemsByKey } from './diff'; +import { comparePairs, matchArrayItemsByKey } from './diff.js'; describe('matchArrayItemsByKey', () => { it('should pair up items by key string', () => { diff --git a/packages/utils/src/lib/errors.unit.test.ts b/packages/utils/src/lib/errors.unit.test.ts index f6251e8bf..56c9f6271 100644 --- a/packages/utils/src/lib/errors.unit.test.ts +++ b/packages/utils/src/lib/errors.unit.test.ts @@ -1,4 +1,4 @@ -import { stringifyError } from './errors'; +import { stringifyError } from './errors.js'; describe('stringifyError', () => { it('should use only message from plain Error instance', () => { diff --git a/packages/utils/src/lib/execute-process.ts b/packages/utils/src/lib/execute-process.ts index fb069c04e..e561a18a0 100644 --- a/packages/utils/src/lib/execute-process.ts +++ b/packages/utils/src/lib/execute-process.ts @@ -6,7 +6,7 @@ import { spawn, } from 'node:child_process'; import type { Readable, Writable } from 'node:stream'; -import { calcDuration } from './reports/utils'; +import { calcDuration } from './reports/utils.js'; /** * Represents the process result. diff --git a/packages/utils/src/lib/execute-process.unit.test.ts b/packages/utils/src/lib/execute-process.unit.test.ts index 888845355..59728ccaf 100644 --- a/packages/utils/src/lib/execute-process.unit.test.ts +++ b/packages/utils/src/lib/execute-process.unit.test.ts @@ -1,7 +1,7 @@ import { ChildProcess } from 'node:child_process'; import { describe, expect, it, vi } from 'vitest'; import { getAsyncProcessRunnerConfig } from '@code-pushup/test-utils'; -import { type ProcessObserver, executeProcess } from './execute-process'; +import { type ProcessObserver, executeProcess } from './execute-process.js'; describe('executeProcess', () => { const spyObserver: ProcessObserver = { diff --git a/packages/utils/src/lib/file-system.integration.test.ts b/packages/utils/src/lib/file-system.integration.test.ts index 4530ab7f0..74e969225 100644 --- a/packages/utils/src/lib/file-system.integration.test.ts +++ b/packages/utils/src/lib/file-system.integration.test.ts @@ -1,14 +1,20 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { describe, expect, it } from 'vitest'; -import { importModule } from './file-system'; +import { importModule } from './file-system.js'; describe('importModule', () => { - const mockDir = join(process.cwd(), 'packages', 'utils', 'mocks', 'fixtures'); + const mockDir = path.join( + process.cwd(), + 'packages', + 'utils', + 'mocks', + 'fixtures', + ); it('should load a valid ES module', async () => { await expect( importModule({ - filepath: join(mockDir, 'valid-es-module-export.mjs'), + filepath: path.join(mockDir, 'valid-es-module-export.mjs'), }), ).resolves.toBe('valid-es-module-export'); }); @@ -16,7 +22,7 @@ describe('importModule', () => { it('should load a valid CommonJS module', async () => { await expect( importModule({ - filepath: join(mockDir, 'valid-cjs-module-export.cjs'), + filepath: path.join(mockDir, 'valid-cjs-module-export.cjs'), }), ).resolves.toBe('valid-cjs-module-export'); }); @@ -24,7 +30,7 @@ describe('importModule', () => { it('should load an ES module without default export', async () => { await expect( importModule({ - filepath: join(mockDir, 'no-default-export.mjs'), + filepath: path.join(mockDir, 'no-default-export.mjs'), }), ).resolves.toEqual( expect.objectContaining({ exportedVar: 'exported-variable' }), diff --git a/packages/utils/src/lib/file-system.ts b/packages/utils/src/lib/file-system.ts index e849e3caa..966dbc536 100644 --- a/packages/utils/src/lib/file-system.ts +++ b/packages/utils/src/lib/file-system.ts @@ -1,33 +1,33 @@ import { bold, gray } from 'ansis'; import { type Options, bundleRequire } from 'bundle-require'; import { mkdir, readFile, readdir, rm, stat } from 'node:fs/promises'; -import { dirname, join } from 'node:path'; -import { formatBytes } from './formatting'; -import { logMultipleResults } from './log-results'; -import { ui } from './logging'; +import path from 'node:path'; +import { formatBytes } from './formatting.js'; +import { logMultipleResults } from './log-results.js'; +import { ui } from './logging.js'; -export async function readTextFile(path: string): Promise { - const buffer = await readFile(path); +export async function readTextFile(filePath: string): Promise { + const buffer = await readFile(filePath); return buffer.toString(); } -export async function readJsonFile(path: string): Promise { - const text = await readTextFile(path); +export async function readJsonFile(filePath: string): Promise { + const text = await readTextFile(filePath); return JSON.parse(text) as T; } -export async function fileExists(path: string): Promise { +export async function fileExists(filePath: string): Promise { try { - const stats = await stat(path); + const stats = await stat(filePath); return stats.isFile(); } catch { return false; } } -export async function directoryExists(path: string): Promise { +export async function directoryExists(filePath: string): Promise { try { - const stats = await stat(path); + const stats = await stat(filePath); return stats.isDirectory(); } catch { return false; @@ -85,7 +85,7 @@ export async function importModule(options: Options): Promise { } export function pluginWorkDir(slug: string): string { - return join('node_modules', '.code-pushup', slug); + return path.join('node_modules', '.code-pushup', slug); } export type CrawlFileSystemOptions = { @@ -104,7 +104,7 @@ export async function crawlFileSystem( const files = await readdir(directory); const promises = files.map(async (file): Promise => { - const filePath = join(directory, file); + const filePath = path.join(directory, file); const stats = await stat(filePath); if (stats.isDirectory()) { @@ -128,13 +128,13 @@ export async function findNearestFile( for ( // eslint-disable-next-line functional/no-let let directory = cwd; - directory !== dirname(directory); - directory = dirname(directory) + directory !== path.dirname(directory); + directory = path.dirname(directory) ) { // eslint-disable-next-line functional/no-loop-statements for (const file of fileNames) { - if (await fileExists(join(directory, file))) { - return join(directory, file); + if (await fileExists(path.join(directory, file))) { + return path.join(directory, file); } } } @@ -151,9 +151,9 @@ export function findLineNumberInText( return lineNumber === 0 ? null : lineNumber; // If the package isn't found, return null } -export function filePathToCliArg(path: string): string { +export function filePathToCliArg(filePath: string): string { // needs to be escaped if spaces included - return `"${path}"`; + return `"${filePath}"`; } export function projectToFilename(project: string): string { diff --git a/packages/utils/src/lib/file-system.unit.test.ts b/packages/utils/src/lib/file-system.unit.test.ts index 1888fc5e6..dfb76ee06 100644 --- a/packages/utils/src/lib/file-system.unit.test.ts +++ b/packages/utils/src/lib/file-system.unit.test.ts @@ -1,6 +1,6 @@ import { vol } from 'memfs'; import { stat } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { MEMFS_VOLUME } from '@code-pushup/test-utils'; import { @@ -12,14 +12,14 @@ import { findNearestFile, logMultipleFileResults, projectToFilename, -} from './file-system'; -import * as logResults from './log-results'; +} from './file-system.js'; +import * as logResults from './log-results.js'; describe('ensureDirectoryExists', () => { it('should create a nested folder', async () => { vol.fromJSON({}, MEMFS_VOLUME); - const dir = join(MEMFS_VOLUME, 'sub', 'dir'); + const dir = path.join(MEMFS_VOLUME, 'sub', 'dir'); await ensureDirectoryExists(dir); await expect( @@ -73,8 +73,8 @@ describe('crawlFileSystem', () => { }), ).resolves.toEqual([ expect.stringContaining('README.md'), - expect.stringContaining(join('src', 'README.md')), - expect.stringContaining(join('src', 'index.ts')), + expect.stringContaining(path.join('src', 'README.md')), + expect.stringContaining(path.join('src', 'index.ts')), ]); }); @@ -86,7 +86,7 @@ describe('crawlFileSystem', () => { }), ).resolves.toEqual([ expect.stringContaining('README.md'), - expect.stringContaining(join('src', 'README.md')), + expect.stringContaining(path.join('src', 'README.md')), ]); }); @@ -120,7 +120,7 @@ describe('findNearestFile', () => { MEMFS_VOLUME, ); await expect(findNearestFile(['eslint.config.js'])).resolves.toBe( - join(MEMFS_VOLUME, 'eslint.config.js'), + path.join(MEMFS_VOLUME, 'eslint.config.js'), ); }); @@ -138,7 +138,7 @@ describe('findNearestFile', () => { 'eslint.config.cjs', 'eslint.config.mjs', ]), - ).resolves.toBe(join(MEMFS_VOLUME, 'eslint.config.cjs')); + ).resolves.toBe(path.join(MEMFS_VOLUME, 'eslint.config.cjs')); }); it('should resolve to undefined if file not found', async () => { @@ -163,9 +163,9 @@ describe('findNearestFile', () => { await expect( findNearestFile( ['eslint.config.js', 'eslint.config.cjs', 'eslint.config.mjs'], - join(MEMFS_VOLUME, 'e2e'), + path.join(MEMFS_VOLUME, 'e2e'), ), - ).resolves.toBe(join(MEMFS_VOLUME, 'eslint.config.js')); + ).resolves.toBe(path.join(MEMFS_VOLUME, 'eslint.config.js')); }); it('should find file in directory multiple levels up', async () => { @@ -179,9 +179,9 @@ describe('findNearestFile', () => { await expect( findNearestFile( ['eslint.config.js', 'eslint.config.cjs', 'eslint.config.mjs'], - join(MEMFS_VOLUME, 'packages/core'), + path.join(MEMFS_VOLUME, 'packages/core'), ), - ).resolves.toBe(join(MEMFS_VOLUME, 'eslint.config.cjs')); + ).resolves.toBe(path.join(MEMFS_VOLUME, 'eslint.config.cjs')); }); it("should find file that's nearest to current folder", async () => { @@ -196,9 +196,9 @@ describe('findNearestFile', () => { await expect( findNearestFile( ['eslint.config.js', 'eslint.config.cjs', 'eslint.config.mjs'], - join(MEMFS_VOLUME, 'packages/core'), + path.join(MEMFS_VOLUME, 'packages/core'), ), - ).resolves.toBe(join(MEMFS_VOLUME, 'packages/core/eslint.config.js')); + ).resolves.toBe(path.join(MEMFS_VOLUME, 'packages/core/eslint.config.js')); }); it('should not find file in sub-folders of current folder', async () => { diff --git a/packages/utils/src/lib/filter.unit.test.ts b/packages/utils/src/lib/filter.unit.test.ts index edd914b10..5824bea14 100644 --- a/packages/utils/src/lib/filter.unit.test.ts +++ b/packages/utils/src/lib/filter.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { filterItemRefsBy } from './filter'; +import { filterItemRefsBy } from './filter.js'; describe('filterItemsWithRefBy', () => { it('should return the filtered list based on the given filterFn', () => { diff --git a/packages/utils/src/lib/formatting.ts b/packages/utils/src/lib/formatting.ts index efe7bef44..86bc91301 100644 --- a/packages/utils/src/lib/formatting.ts +++ b/packages/utils/src/lib/formatting.ts @@ -35,7 +35,7 @@ export function formatBytes(bytes: number, decimals = 2) { } const k = 1024; - const dm = decimals < 0 ? 0 : decimals; + const dm = Math.max(decimals, 0); const sizes = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; const i = Math.floor(Math.log(positiveBytes) / Math.log(k)); diff --git a/packages/utils/src/lib/formatting.unit.test.ts b/packages/utils/src/lib/formatting.unit.test.ts index 7c46753a5..db564b826 100644 --- a/packages/utils/src/lib/formatting.unit.test.ts +++ b/packages/utils/src/lib/formatting.unit.test.ts @@ -7,7 +7,7 @@ import { pluralizeToken, slugify, truncateText, -} from './formatting'; +} from './formatting.js'; describe('slugify', () => { it.each([ diff --git a/packages/utils/src/lib/git/git.commits-and-tags.integration.test.ts b/packages/utils/src/lib/git/git.commits-and-tags.integration.test.ts index 76f48922e..1c30292e0 100644 --- a/packages/utils/src/lib/git/git.commits-and-tags.integration.test.ts +++ b/packages/utils/src/lib/git/git.commits-and-tags.integration.test.ts @@ -1,5 +1,5 @@ import { mkdir, rm } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { type SimpleGit, simpleGit } from 'simple-git'; import { afterAll, beforeAll, describe, expect } from 'vitest'; import { commitFile, initGitRepo } from '@code-pushup/test-utils'; @@ -8,7 +8,7 @@ import { getHashes, getLatestCommit, getSemverTags, -} from './git.commits-and-tags'; +} from './git.commits-and-tags.js'; async function getAllCommits(git: SimpleGit) { return (await git.log()).all.map(({ hash, message }) => ({ @@ -18,7 +18,7 @@ async function getAllCommits(git: SimpleGit) { } describe('getCurrentBranchOrTag', () => { - const baseDir = join(process.cwd(), 'tmp', 'git-tests'); + const baseDir = path.join(process.cwd(), 'tmp', 'git-tests'); let currentBranchOrTagGitMock: SimpleGit; beforeAll(async () => { @@ -59,7 +59,7 @@ describe('getCurrentBranchOrTag', () => { }); describe('getLatestCommit', () => { - const baseDir = join(process.cwd(), 'tmp', 'git', 'latest-commit'); + const baseDir = path.join(process.cwd(), 'tmp', 'git', 'latest-commit'); let emptyGit: SimpleGit; beforeAll(async () => { @@ -92,7 +92,7 @@ describe('getLatestCommit', () => { }); describe('getHashes', () => { - const baseDir = join(process.cwd(), 'tmp', 'utils-git-get-hashes'); + const baseDir = path.join(process.cwd(), 'tmp', 'utils-git-get-hashes'); let gitMock: SimpleGit; beforeAll(async () => { @@ -113,6 +113,7 @@ describe('getHashes', () => { describe('with a branch and commits clean', () => { let commits: { hash: string; message: string }[]; + beforeAll(async () => { await commitFile(gitMock, { baseDir, commitMsg: 'Create README' }); await commitFile(gitMock, { baseDir, commitMsg: 'Update README 1' }); @@ -173,7 +174,7 @@ describe('getHashes', () => { }); describe('getSemverTags', () => { - const baseDir = join(process.cwd(), 'tmp', 'git', 'get-semver-tags'); + const baseDir = path.join(process.cwd(), 'tmp', 'git', 'get-semver-tags'); let gitSemverTagsMock: SimpleGit; beforeAll(async () => { diff --git a/packages/utils/src/lib/git/git.commits-and-tags.ts b/packages/utils/src/lib/git/git.commits-and-tags.ts index 2c9ed6ae2..42099f8f5 100644 --- a/packages/utils/src/lib/git/git.commits-and-tags.ts +++ b/packages/utils/src/lib/git/git.commits-and-tags.ts @@ -1,6 +1,6 @@ import { type LogOptions as SimpleGitLogOptions, simpleGit } from 'simple-git'; import { type Commit, commitSchema } from '@code-pushup/models'; -import { isSemver } from '../semver'; +import { isSemver } from '../semver.js'; export async function getLatestCommit( git = simpleGit(), @@ -51,7 +51,7 @@ export function filterLogs( const { from, to, maxCount } = opt; const finIndex = (tagName?: string, fallback?: T) => { const idx = allTags.indexOf(tagName ?? ''); - if (idx > -1) { + if (idx !== -1) { return idx; } return fallback; diff --git a/packages/utils/src/lib/git/git.commits-and-tags.unit.test.ts b/packages/utils/src/lib/git/git.commits-and-tags.unit.test.ts index 0a8e2bebb..03e9b2874 100644 --- a/packages/utils/src/lib/git/git.commits-and-tags.unit.test.ts +++ b/packages/utils/src/lib/git/git.commits-and-tags.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, vi } from 'vitest'; -import { filterLogs, getSemverTags } from './git.commits-and-tags'; +import { filterLogs, getSemverTags } from './git.commits-and-tags.js'; vi.mock('simple-git', async () => { const actual = await vi.importActual('simple-git'); diff --git a/packages/utils/src/lib/git/git.integration.test.ts b/packages/utils/src/lib/git/git.integration.test.ts index c9c260fa5..0851b01b7 100644 --- a/packages/utils/src/lib/git/git.integration.test.ts +++ b/packages/utils/src/lib/git/git.integration.test.ts @@ -1,17 +1,17 @@ import { mkdir, rm, stat, writeFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { type SimpleGit, simpleGit } from 'simple-git'; import { afterAll, beforeAll, beforeEach, describe, expect } from 'vitest'; -import { toUnixPath } from '../transform'; +import { toUnixPath } from '../transform.js'; import { getGitRoot, guardAgainstLocalChanges, safeCheckout, toGitPath, -} from './git'; +} from './git.js'; describe('git utils in a git repo', () => { - const baseDir = join(process.cwd(), 'tmp', 'git-tests'); + const baseDir = path.join(process.cwd(), 'tmp', 'git-tests'); let emptyGit: SimpleGit; beforeAll(async () => { @@ -34,7 +34,7 @@ describe('git utils in a git repo', () => { describe('with a branch and commits clean', () => { beforeAll(async () => { - await writeFile(join(baseDir, 'README.md'), '# hello-world\n'); + await writeFile(path.join(baseDir, 'README.md'), '# hello-world\n'); await emptyGit.add('README.md'); await emptyGit.commit('Create README'); @@ -53,13 +53,13 @@ describe('git utils in a git repo', () => { it('should convert absolute path to relative Git path', async () => { await expect( - toGitPath(join(baseDir, 'src', 'utils.ts'), emptyGit), + toGitPath(path.join(baseDir, 'src', 'utils.ts'), emptyGit), ).resolves.toBe('src/utils.ts'); }); it('should convert relative Windows path to relative Git path', async () => { await expect( - toGitPath('Backend\\API\\Startup.cs', emptyGit), + toGitPath(String.raw`Backend\API\Startup.cs`, emptyGit), ).resolves.toBe('../../Backend/API/Startup.cs'); }); @@ -92,10 +92,10 @@ describe('git utils in a git repo', () => { }); describe('with a branch and commits dirty', () => { - const newFilePath = join(baseDir, 'new-file.md'); + const newFilePath = path.join(baseDir, 'new-file.md'); beforeAll(async () => { - await writeFile(join(baseDir, 'README.md'), '# hello-world\n'); + await writeFile(path.join(baseDir, 'README.md'), '# hello-world\n'); await emptyGit.add('README.md'); await emptyGit.commit('Create README'); diff --git a/packages/utils/src/lib/git/git.ts b/packages/utils/src/lib/git/git.ts index 6bfd2d74d..f706129f0 100644 --- a/packages/utils/src/lib/git/git.ts +++ b/packages/utils/src/lib/git/git.ts @@ -1,24 +1,26 @@ -import { isAbsolute, join, relative } from 'node:path'; +import path from 'node:path'; import { type StatusResult, simpleGit } from 'simple-git'; -import { ui } from '../logging'; -import { toUnixPath } from '../transform'; +import { ui } from '../logging.js'; +import { toUnixPath } from '../transform.js'; export function getGitRoot(git = simpleGit()): Promise { return git.revparse('--show-toplevel'); } -export function formatGitPath(path: string, gitRoot: string): string { - const absolutePath = isAbsolute(path) ? path : join(process.cwd(), path); - const relativePath = relative(gitRoot, absolutePath); +export function formatGitPath(filePath: string, gitRoot: string): string { + const absolutePath = path.isAbsolute(filePath) + ? filePath + : path.join(process.cwd(), filePath); + const relativePath = path.relative(gitRoot, absolutePath); return toUnixPath(relativePath); } export async function toGitPath( - path: string, + filePath: string, git = simpleGit(), ): Promise { const gitRoot = await getGitRoot(git); - return formatGitPath(path, gitRoot); + return formatGitPath(filePath, gitRoot); } export class GitStatusError extends Error { diff --git a/packages/utils/src/lib/git/git.unit.test.ts b/packages/utils/src/lib/git/git.unit.test.ts index 7f0498a70..c38563939 100644 --- a/packages/utils/src/lib/git/git.unit.test.ts +++ b/packages/utils/src/lib/git/git.unit.test.ts @@ -1,6 +1,10 @@ import type { SimpleGit, StatusResult } from 'simple-git'; import { describe, expect } from 'vitest'; -import { GitStatusError, formatGitPath, guardAgainstLocalChanges } from './git'; +import { + GitStatusError, + formatGitPath, + guardAgainstLocalChanges, +} from './git.js'; describe('guardAgainstLocalChanges', () => { it('should throw if no files are present', async () => { diff --git a/packages/utils/src/lib/group-by-status.unit.test.ts b/packages/utils/src/lib/group-by-status.unit.test.ts index bcfb4f978..1c6ae74b0 100644 --- a/packages/utils/src/lib/group-by-status.unit.test.ts +++ b/packages/utils/src/lib/group-by-status.unit.test.ts @@ -1,5 +1,5 @@ import { describe } from 'vitest'; -import { groupByStatus } from './group-by-status'; +import { groupByStatus } from './group-by-status.js'; describe('groupByStatus', () => { it('should group results by status', () => { diff --git a/packages/utils/src/lib/guards.ts b/packages/utils/src/lib/guards.ts index ad79d21e9..aca4ceef0 100644 --- a/packages/utils/src/lib/guards.ts +++ b/packages/utils/src/lib/guards.ts @@ -1,3 +1,5 @@ +import type { ExcludeNullableProps } from './types.js'; + export function isPromiseFulfilledResult( result: PromiseSettledResult, ): result is PromiseFulfilledResult { @@ -9,3 +11,9 @@ export function isPromiseRejectedResult( ): result is PromiseRejectedResult { return result.status === 'rejected'; } + +export function hasNoNullableProps( + obj: T, +): obj is ExcludeNullableProps { + return Object.values(obj).every(value => value != null); +} diff --git a/packages/utils/src/lib/guards.unit.test.ts b/packages/utils/src/lib/guards.unit.test.ts index 80d0eac5f..f4138c8b7 100644 --- a/packages/utils/src/lib/guards.unit.test.ts +++ b/packages/utils/src/lib/guards.unit.test.ts @@ -1,5 +1,9 @@ import { describe } from 'vitest'; -import { isPromiseFulfilledResult, isPromiseRejectedResult } from './guards'; +import { + hasNoNullableProps, + isPromiseFulfilledResult, + isPromiseRejectedResult, +} from './guards.js'; describe('promise-result', () => { it('should get fulfilled result', () => { @@ -20,3 +24,21 @@ describe('promise-result', () => { expect(isPromiseRejectedResult(result)).toBe(true); }); }); + +describe('hasNoNullableProps', () => { + it('should return true if object prop values are neither null nor undefined', () => { + expect(hasNoNullableProps({ a: 42, b: 'foo', c: {}, d: [] })).toBe(true); + }); + + it('should return false if some prop is null', () => { + expect(hasNoNullableProps({ x: 42, y: null })).toBe(false); + }); + + it('should return false if some prop is set to undefined', () => { + expect(hasNoNullableProps({ x: undefined })).toBe(false); + }); + + it('should return true for empty object', () => { + expect(hasNoNullableProps({})).toBe(true); + }); +}); diff --git a/packages/utils/src/lib/log-results.ts b/packages/utils/src/lib/log-results.ts index e848114ef..254072460 100644 --- a/packages/utils/src/lib/log-results.ts +++ b/packages/utils/src/lib/log-results.ts @@ -1,5 +1,5 @@ -import { isPromiseFulfilledResult, isPromiseRejectedResult } from './guards'; -import { ui } from './logging'; +import { isPromiseFulfilledResult, isPromiseRejectedResult } from './guards.js'; +import { ui } from './logging.js'; export function logMultipleResults( results: PromiseSettledResult[], diff --git a/packages/utils/src/lib/log-results.unit.test.ts b/packages/utils/src/lib/log-results.unit.test.ts index 0688012c4..b0549733b 100644 --- a/packages/utils/src/lib/log-results.unit.test.ts +++ b/packages/utils/src/lib/log-results.unit.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it, vi } from 'vitest'; import { getLogMessages } from '@code-pushup/test-utils'; -import type { FileResult } from './file-system'; -import { logMultipleResults, logPromiseResults } from './log-results'; -import { ui } from './logging'; +import type { FileResult } from './file-system.js'; +import { logMultipleResults, logPromiseResults } from './log-results.js'; +import { ui } from './logging.js'; describe('logMultipleResults', () => { const succeededCallbackMock = vi.fn(); diff --git a/packages/utils/src/lib/logging.ts b/packages/utils/src/lib/logging.ts index f8e0690b3..24d290632 100644 --- a/packages/utils/src/lib/logging.ts +++ b/packages/utils/src/lib/logging.ts @@ -1,7 +1,7 @@ import isaacs_cliui from '@isaacs/cliui'; import { cliui } from '@poppinss/cliui'; import { underline } from 'ansis'; -import { TERMINAL_WIDTH } from './reports/constants'; +import { TERMINAL_WIDTH } from './reports/constants.js'; // eslint-disable-next-line @typescript-eslint/no-explicit-any type ArgumentsType = T extends (...args: infer U) => any ? U : never; diff --git a/packages/utils/src/lib/merge-configs.unit.test.ts b/packages/utils/src/lib/merge-configs.unit.test.ts index dce4234db..6a02e65d6 100644 --- a/packages/utils/src/lib/merge-configs.unit.test.ts +++ b/packages/utils/src/lib/merge-configs.unit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import type { CoreConfig, PluginConfig } from '@code-pushup/models'; -import { mergeConfigs } from './merge-configs'; +import { mergeConfigs } from './merge-configs.js'; const MOCK_CONFIG_PERSIST = { persist: { diff --git a/packages/utils/src/lib/progress.integration.test.ts b/packages/utils/src/lib/progress.integration.test.ts index 28412110b..a9aaff054 100644 --- a/packages/utils/src/lib/progress.integration.test.ts +++ b/packages/utils/src/lib/progress.integration.test.ts @@ -3,7 +3,7 @@ import { barStyles, getProgressBar, getSingletonProgressBars, -} from './progress'; +} from './progress.js'; /** * ANSI escape codes in terminal stdout: diff --git a/packages/utils/src/lib/progress.ts b/packages/utils/src/lib/progress.ts index 7634f3134..a7d33276f 100644 --- a/packages/utils/src/lib/progress.ts +++ b/packages/utils/src/lib/progress.ts @@ -1,6 +1,6 @@ import { black, bold, gray, green } from 'ansis'; import { type CtorOptions, MultiProgressBars } from 'multi-progress-bars'; -import { TERMINAL_WIDTH } from './reports/constants'; +import { TERMINAL_WIDTH } from './reports/constants.js'; type BarStyles = 'active' | 'done' | 'idle'; type StatusStyles = Record string>; @@ -29,7 +29,6 @@ let mpb: MultiProgressBars; export function getSingletonProgressBars( options?: Partial, ): MultiProgressBars { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!mpb) { mpb = new MultiProgressBars({ progressWidth: TERMINAL_WIDTH, diff --git a/packages/utils/src/lib/reports/constants.ts b/packages/utils/src/lib/reports/constants.ts index c8aaf5b4d..07801403e 100644 --- a/packages/utils/src/lib/reports/constants.ts +++ b/packages/utils/src/lib/reports/constants.ts @@ -1,12 +1,12 @@ // https://stackoverflow.com/questions/4651012/why-is-the-default-terminal-width-80-characters/4651037#4651037 export const TERMINAL_WIDTH = 80; -/* eslint-disable no-magic-numbers */ export const SCORE_COLOR_RANGE = { + /* eslint-disable @typescript-eslint/no-magic-numbers */ GREEN_MIN: 0.9, YELLOW_MIN: 0.5, + /* eslint-enable @typescript-eslint/no-magic-numbers */ }; -/* eslint-enable no-magic-numbers */ export const FOOTER_PREFIX = 'Made with ❤ by'; // replace ❤️ with ❤, because ❤️ has output issues in terminal export const CODE_PUSHUP_DOMAIN = 'code-pushup.dev'; diff --git a/packages/utils/src/lib/reports/environment-type.ts b/packages/utils/src/lib/reports/environment-type.ts index 9b5becc6a..9abae5a83 100644 --- a/packages/utils/src/lib/reports/environment-type.ts +++ b/packages/utils/src/lib/reports/environment-type.ts @@ -1,4 +1,4 @@ -import { type EnvironmentType, SUPPORTED_ENVIRONMENTS } from './types'; +import { type EnvironmentType, SUPPORTED_ENVIRONMENTS } from './types.js'; const environmentChecks: Record boolean> = { vscode: () => process.env['TERM_PROGRAM'] === 'vscode', diff --git a/packages/utils/src/lib/reports/environment-type.unit.test.ts b/packages/utils/src/lib/reports/environment-type.unit.test.ts index 44e44277a..72e1348f8 100644 --- a/packages/utils/src/lib/reports/environment-type.unit.test.ts +++ b/packages/utils/src/lib/reports/environment-type.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { getEnvironmentType } from './environment-type'; +import { getEnvironmentType } from './environment-type.js'; describe('getEnvironmentType', () => { it.each([ diff --git a/packages/utils/src/lib/reports/flatten-plugins.unit.test.ts b/packages/utils/src/lib/reports/flatten-plugins.unit.test.ts index a25f3a7fa..9fe156725 100644 --- a/packages/utils/src/lib/reports/flatten-plugins.unit.test.ts +++ b/packages/utils/src/lib/reports/flatten-plugins.unit.test.ts @@ -2,7 +2,7 @@ import type { Report } from '@code-pushup/models'; import { listAuditsFromAllPlugins, listGroupsFromAllPlugins, -} from './flatten-plugins'; +} from './flatten-plugins.js'; describe('listGroupsFromAllPlugins', () => { it("should flatten plugins' groups", () => { diff --git a/packages/utils/src/lib/reports/formatting.ts b/packages/utils/src/lib/reports/formatting.ts index a2b114b0b..08e90a8b3 100644 --- a/packages/utils/src/lib/reports/formatting.ts +++ b/packages/utils/src/lib/reports/formatting.ts @@ -4,24 +4,24 @@ import { MarkdownDocument, md, } from 'build-md'; -import { posix as pathPosix } from 'node:path'; +import path from 'node:path'; import type { AuditReport, SourceFileLocation, Table, } from '@code-pushup/models'; -import { HIERARCHY } from '../text-formats'; +import { HIERARCHY } from '../text-formats/index.js'; import { columnsToStringArray, getColumnAlignments, rowToStringArray, -} from '../text-formats/table'; +} from '../text-formats/table.js'; import { getEnvironmentType, getGitHubBaseUrl, getGitLabBaseUrl, -} from './environment-type'; -import type { MdReportOptions } from './types'; +} from './environment-type.js'; +import type { MdReportOptions } from './types.js'; export function tableSection( tableData: Table, @@ -143,7 +143,7 @@ export function formatFileLink( position: SourceFileLocation['position'], outputDir: string, ): string { - const relativePath = pathPosix.relative(outputDir, file); + const relativePath = path.posix.relative(outputDir, file); const env = getEnvironmentType(); switch (env) { diff --git a/packages/utils/src/lib/reports/formatting.unit.test.ts b/packages/utils/src/lib/reports/formatting.unit.test.ts index ae4775371..c814d2cd6 100644 --- a/packages/utils/src/lib/reports/formatting.unit.test.ts +++ b/packages/utils/src/lib/reports/formatting.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { toUnixPath } from '../transform'; +import { toUnixPath } from '../transform.js'; import { formatFileLink, formatGitHubLink, @@ -8,7 +8,7 @@ import { linkToLocalSourceForIde, metaDescription, tableSection, -} from './formatting'; +} from './formatting.js'; describe('tableSection', () => { it('should accept a title', () => { diff --git a/packages/utils/src/lib/reports/generate-md-report-category-section.unit.test.ts b/packages/utils/src/lib/reports/generate-md-report-category-section.unit.test.ts index a855f6c16..6afaca2f2 100644 --- a/packages/utils/src/lib/reports/generate-md-report-category-section.unit.test.ts +++ b/packages/utils/src/lib/reports/generate-md-report-category-section.unit.test.ts @@ -6,8 +6,8 @@ import { categoriesOverviewSection, categoryGroupItem, categoryRef, -} from './generate-md-report-categoy-section'; -import type { ScoredGroup, ScoredReport } from './types'; +} from './generate-md-report-categoy-section.js'; +import type { ScoredGroup, ScoredReport } from './types.js'; // === Categories Overview Section diff --git a/packages/utils/src/lib/reports/generate-md-report-categoy-section.ts b/packages/utils/src/lib/reports/generate-md-report-categoy-section.ts index 3f7fdada0..063bc30e3 100644 --- a/packages/utils/src/lib/reports/generate-md-report-categoy-section.ts +++ b/packages/utils/src/lib/reports/generate-md-report-categoy-section.ts @@ -1,17 +1,17 @@ import { type InlineText, MarkdownDocument, md } from 'build-md'; import type { AuditReport } from '@code-pushup/models'; -import { slugify } from '../formatting'; -import { HIERARCHY } from '../text-formats'; -import { metaDescription } from './formatting'; -import { getSortableAuditByRef, getSortableGroupByRef } from './sorting'; -import type { ScoredGroup, ScoredReport } from './types'; +import { slugify } from '../formatting.js'; +import { HIERARCHY } from '../text-formats/index.js'; +import { metaDescription } from './formatting.js'; +import { getSortableAuditByRef, getSortableGroupByRef } from './sorting.js'; +import type { ScoredGroup, ScoredReport } from './types.js'; import { countCategoryAudits, formatReportScore, getPluginNameFromSlug, scoreMarker, targetScoreIcon, -} from './utils'; +} from './utils.js'; export function categoriesOverviewSection( report: Required>, diff --git a/packages/utils/src/lib/reports/generate-md-report.integration.test.ts b/packages/utils/src/lib/reports/generate-md-report.integration.test.ts index 24c02cb59..26a16f870 100644 --- a/packages/utils/src/lib/reports/generate-md-report.integration.test.ts +++ b/packages/utils/src/lib/reports/generate-md-report.integration.test.ts @@ -1,8 +1,8 @@ import { describe } from 'vitest'; import { reportMock } from '@code-pushup/test-utils'; -import { generateMdReport } from './generate-md-report'; -import { scoreReport } from './scoring'; -import { sortReport } from './sorting'; +import { generateMdReport } from './generate-md-report.js'; +import { scoreReport } from './scoring.js'; +import { sortReport } from './sorting.js'; describe('generateMdReport', () => { beforeEach(() => { diff --git a/packages/utils/src/lib/reports/generate-md-report.ts b/packages/utils/src/lib/reports/generate-md-report.ts index 13a0e71f6..3ae8b1c7d 100644 --- a/packages/utils/src/lib/reports/generate-md-report.ts +++ b/packages/utils/src/lib/reports/generate-md-report.ts @@ -1,20 +1,24 @@ import { type InlineText, MarkdownDocument, md } from 'build-md'; import type { AuditReport, Issue, Report } from '@code-pushup/models'; -import { formatDate, formatDuration } from '../formatting'; -import { HIERARCHY } from '../text-formats'; -import { FOOTER_PREFIX, README_LINK, REPORT_HEADLINE_TEXT } from './constants'; +import { formatDate, formatDuration } from '../formatting.js'; +import { HIERARCHY } from '../text-formats/index.js'; +import { + FOOTER_PREFIX, + README_LINK, + REPORT_HEADLINE_TEXT, +} from './constants.js'; import { formatSourceLine, linkToLocalSourceForIde, metaDescription, tableSection, -} from './formatting'; +} from './formatting.js'; import { categoriesDetailsSection, categoriesOverviewSection, -} from './generate-md-report-categoy-section'; -import type { MdReportOptions, ScoredReport } from './types'; -import { formatReportScore, scoreMarker, severityMarker } from './utils'; +} from './generate-md-report-categoy-section.js'; +import type { MdReportOptions, ScoredReport } from './types.js'; +import { formatReportScore, scoreMarker, severityMarker } from './utils.js'; export function auditDetailsAuditValue({ score, diff --git a/packages/utils/src/lib/reports/generate-md-report.unit.test.ts b/packages/utils/src/lib/reports/generate-md-report.unit.test.ts index 0b69f08ab..7b7d3f7e9 100644 --- a/packages/utils/src/lib/reports/generate-md-report.unit.test.ts +++ b/packages/utils/src/lib/reports/generate-md-report.unit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import type { AuditReport, Issue, Table } from '@code-pushup/models'; -import { tableSection } from './formatting'; +import { tableSection } from './formatting.js'; import { aboutSection, auditDetails, @@ -8,8 +8,8 @@ import { auditDetailsIssues, auditsSection, generateMdReport, -} from './generate-md-report'; -import type { ScoredReport } from './types'; +} from './generate-md-report.js'; +import type { ScoredReport } from './types.js'; const baseScoredReport = { date: '2025.01.01', diff --git a/packages/utils/src/lib/reports/generate-md-reports-diff-utils.ts b/packages/utils/src/lib/reports/generate-md-reports-diff-utils.ts index 6633d2a03..9ecfbbfdb 100644 --- a/packages/utils/src/lib/reports/generate-md-reports-diff-utils.ts +++ b/packages/utils/src/lib/reports/generate-md-reports-diff-utils.ts @@ -1,8 +1,8 @@ import { type InlineText, MarkdownDocument, md } from 'build-md'; import type { ReportsDiff } from '@code-pushup/models'; -import { pluralize, pluralizeToken } from '../formatting'; -import { objectToEntries } from '../transform'; -import type { DiffOutcome } from './types'; +import { pluralize, pluralizeToken } from '../formatting.js'; +import { objectToEntries } from '../transform.js'; +import type { DiffOutcome } from './types.js'; // to prevent exceeding Markdown comment character limit const MAX_ROWS = 100; diff --git a/packages/utils/src/lib/reports/generate-md-reports-diff-utils.unit.test.ts b/packages/utils/src/lib/reports/generate-md-reports-diff-utils.unit.test.ts index af6e65086..2c5c26bcd 100644 --- a/packages/utils/src/lib/reports/generate-md-reports-diff-utils.unit.test.ts +++ b/packages/utils/src/lib/reports/generate-md-reports-diff-utils.unit.test.ts @@ -8,8 +8,8 @@ import { sortChanges, summarizeDiffOutcomes, summarizeUnchanged, -} from './generate-md-reports-diff-utils'; -import type { DiffOutcome } from './types'; +} from './generate-md-reports-diff-utils.js'; +import type { DiffOutcome } from './types.js'; describe('summarizeUnchanged', () => { it('should print unchanged array length with pluralized token and verb', () => { diff --git a/packages/utils/src/lib/reports/generate-md-reports-diff.integration.test.ts b/packages/utils/src/lib/reports/generate-md-reports-diff.integration.test.ts index 3cbd48c10..29a6d73d1 100644 --- a/packages/utils/src/lib/reports/generate-md-reports-diff.integration.test.ts +++ b/packages/utils/src/lib/reports/generate-md-reports-diff.integration.test.ts @@ -10,7 +10,7 @@ import { import { generateMdReportsDiff, generateMdReportsDiffForMonorepo, -} from './generate-md-reports-diff'; +} from './generate-md-reports-diff.js'; describe('generateMdReportsDiff', () => { it('should format Markdown comment for improved reports diff', async () => { diff --git a/packages/utils/src/lib/reports/generate-md-reports-diff.ts b/packages/utils/src/lib/reports/generate-md-reports-diff.ts index 7e40218d8..8ac158566 100644 --- a/packages/utils/src/lib/reports/generate-md-reports-diff.ts +++ b/packages/utils/src/lib/reports/generate-md-reports-diff.ts @@ -6,9 +6,9 @@ import { md, } from 'build-md'; import type { ReportsDiff } from '@code-pushup/models'; -import { HIERARCHY } from '../text-formats'; -import { toArray } from '../transform'; -import type { WithRequired } from '../types'; +import { HIERARCHY } from '../text-formats/index.js'; +import { toArray } from '../transform.js'; +import type { WithRequired } from '../types.js'; import { changesToDiffOutcomes, compareDiffsBy, @@ -21,14 +21,14 @@ import { sortChanges, summarizeDiffOutcomes, summarizeUnchanged, -} from './generate-md-reports-diff-utils'; -import type { DiffOutcome } from './types'; +} from './generate-md-reports-diff-utils.js'; +import type { DiffOutcome } from './types.js'; import { formatScoreChange, formatScoreWithColor, formatValueChange, scoreMarker, -} from './utils'; +} from './utils.js'; export function generateMdReportsDiff(diff: ReportsDiff): string { return new MarkdownDocument() @@ -127,7 +127,7 @@ function createDiffCategoriesSection( return new MarkdownDocument() .heading(HIERARCHY.level_2, !skipHeading && '🏷️ Categories') .table(columns, rows) - .paragraph(added.length > 0 && md.italic('(\\*) New category.')) + .paragraph(added.length > 0 && md.italic(String.raw`(\*) New category.`)) .paragraph( skipUnchanged && unchanged.length > 0 && @@ -153,9 +153,9 @@ function createCategoriesTable( ]), ...added.map(category => [ formatTitle(category), - md.italic('n/a (\\*)'), + md.italic(String.raw`n/a (\*)`), formatScoreWithColor(category.score), - md.italic('n/a (\\*)'), + md.italic(String.raw`n/a (\*)`), ]), ...(skipUnchanged ? [] diff --git a/packages/utils/src/lib/reports/load-report.ts b/packages/utils/src/lib/reports/load-report.ts index e8cc0763c..0f94d2b4f 100644 --- a/packages/utils/src/lib/reports/load-report.ts +++ b/packages/utils/src/lib/reports/load-report.ts @@ -1,4 +1,4 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { type Format, type PersistConfig, @@ -9,7 +9,7 @@ import { ensureDirectoryExists, readJsonFile, readTextFile, -} from '../file-system'; +} from '../file-system.js'; type LoadedReportFormat = T extends 'json' ? Report : string; @@ -20,7 +20,7 @@ export async function loadReport( ): Promise> { const { outputDir, filename, format } = options; await ensureDirectoryExists(outputDir); - const filePath = join(outputDir, `${filename}.${format}`); + const filePath = path.join(outputDir, `${filename}.${format}`); if (format === 'json') { const content = await readJsonFile(filePath); diff --git a/packages/utils/src/lib/reports/load-report.unit.test.ts b/packages/utils/src/lib/reports/load-report.unit.test.ts index 4dbd880a7..67d43a492 100644 --- a/packages/utils/src/lib/reports/load-report.unit.test.ts +++ b/packages/utils/src/lib/reports/load-report.unit.test.ts @@ -1,7 +1,7 @@ import { vol } from 'memfs'; import type { Report } from '@code-pushup/models'; import { MEMFS_VOLUME, REPORT_MOCK, reportMock } from '@code-pushup/test-utils'; -import { loadReport } from './load-report'; +import { loadReport } from './load-report.js'; describe('loadReport', () => { it('should load a valid JSON report', async () => { diff --git a/packages/utils/src/lib/reports/log-stdout-summary.integration.test.ts b/packages/utils/src/lib/reports/log-stdout-summary.integration.test.ts index 2b3a3b4a8..7035c4ed9 100644 --- a/packages/utils/src/lib/reports/log-stdout-summary.integration.test.ts +++ b/packages/utils/src/lib/reports/log-stdout-summary.integration.test.ts @@ -1,9 +1,9 @@ import { beforeAll, describe, expect, vi } from 'vitest'; import { removeColorCodes, reportMock } from '@code-pushup/test-utils'; -import { ui } from '../logging'; -import { logStdoutSummary } from './log-stdout-summary'; -import { scoreReport } from './scoring'; -import { sortReport } from './sorting'; +import { ui } from '../logging.js'; +import { logStdoutSummary } from './log-stdout-summary.js'; +import { scoreReport } from './scoring.js'; +import { sortReport } from './sorting.js'; describe('logStdoutSummary', () => { let logs: string[]; diff --git a/packages/utils/src/lib/reports/log-stdout-summary.ts b/packages/utils/src/lib/reports/log-stdout-summary.ts index 59a8c5716..93d71f149 100644 --- a/packages/utils/src/lib/reports/log-stdout-summary.ts +++ b/packages/utils/src/lib/reports/log-stdout-summary.ts @@ -1,15 +1,19 @@ import { bold, cyan, cyanBright, green, red } from 'ansis'; import type { AuditReport } from '@code-pushup/models'; -import { ui } from '../logging'; +import { ui } from '../logging.js'; import { CODE_PUSHUP_DOMAIN, FOOTER_PREFIX, REPORT_HEADLINE_TEXT, REPORT_RAW_OVERVIEW_TABLE_HEADERS, TERMINAL_WIDTH, -} from './constants'; -import type { ScoredReport } from './types'; -import { applyScoreColor, countCategoryAudits, targetScoreIcon } from './utils'; +} from './constants.js'; +import type { ScoredReport } from './types.js'; +import { + applyScoreColor, + countCategoryAudits, + targetScoreIcon, +} from './utils.js'; function log(msg = ''): void { ui().logger.log(msg); @@ -77,14 +81,14 @@ function logRow(score: number, title: string, value?: string): void { }, { text: title, - // eslint-disable-next-line no-magic-numbers + // eslint-disable-next-line @typescript-eslint/no-magic-numbers padding: [0, 3, 0, 0], }, ...(value ? [ { text: cyanBright(value), - // eslint-disable-next-line no-magic-numbers + // eslint-disable-next-line @typescript-eslint/no-magic-numbers width: 20, padding: [0, 0, 0, 0], }, @@ -105,7 +109,7 @@ export function logCategories({ countCategoryAudits(refs, plugins), ]); const table = ui().table(); - // eslint-disable-next-line no-magic-numbers + // eslint-disable-next-line @typescript-eslint/no-magic-numbers table.columnWidths([TERMINAL_WIDTH - 9 - 10 - 4, 9, 10]); table.head( REPORT_RAW_OVERVIEW_TABLE_HEADERS.map((heading, idx) => ({ diff --git a/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts b/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts index 0bd287b01..1697bea04 100644 --- a/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts +++ b/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts @@ -1,12 +1,12 @@ import { beforeAll, describe, expect, vi } from 'vitest'; import { removeColorCodes } from '@code-pushup/test-utils'; -import { ui } from '../logging'; +import { ui } from '../logging.js'; import { binaryIconPrefix, logCategories, logPlugins, -} from './log-stdout-summary'; -import type { ScoredReport } from './types'; +} from './log-stdout-summary.js'; +import type { ScoredReport } from './types.js'; describe('logCategories', () => { let logs: string[]; diff --git a/packages/utils/src/lib/reports/scoring.ts b/packages/utils/src/lib/reports/scoring.ts index 0bdea95d1..7f22fd92b 100644 --- a/packages/utils/src/lib/reports/scoring.ts +++ b/packages/utils/src/lib/reports/scoring.ts @@ -4,8 +4,8 @@ import type { GroupRef, Report, } from '@code-pushup/models'; -import { deepClone } from '../transform'; -import type { ScoredGroup, ScoredReport } from './types'; +import { deepClone } from '../transform.js'; +import type { ScoredGroup, ScoredReport } from './types.js'; export class GroupRefInvalidError extends Error { constructor(auditSlug: string, pluginSlug: string) { diff --git a/packages/utils/src/lib/reports/scoring.unit.test.ts b/packages/utils/src/lib/reports/scoring.unit.test.ts index cb0ab3294..e273eee8a 100644 --- a/packages/utils/src/lib/reports/scoring.unit.test.ts +++ b/packages/utils/src/lib/reports/scoring.unit.test.ts @@ -1,6 +1,6 @@ import { describe, expect } from 'vitest'; import { REPORT_MOCK } from '@code-pushup/test-utils'; -import { calculateScore, scoreReport } from './scoring'; +import { calculateScore, scoreReport } from './scoring.js'; describe('calculateScore', () => { it('should calculate the same score for one reference', () => { diff --git a/packages/utils/src/lib/reports/sorting.integration.test.ts b/packages/utils/src/lib/reports/sorting.integration.test.ts index 4f22f7f4d..57212b3e0 100644 --- a/packages/utils/src/lib/reports/sorting.integration.test.ts +++ b/packages/utils/src/lib/reports/sorting.integration.test.ts @@ -1,6 +1,6 @@ import { REPORT_MOCK } from '@code-pushup/test-utils'; -import { scoreReport } from './scoring'; -import { sortReport } from './sorting'; +import { scoreReport } from './scoring.js'; +import { sortReport } from './sorting.js'; describe('sortReport', () => { it('should sort the audits and audit groups in categories, plugin audits and audit issues', () => { diff --git a/packages/utils/src/lib/reports/sorting.ts b/packages/utils/src/lib/reports/sorting.ts index e922e10fa..be0c79198 100644 --- a/packages/utils/src/lib/reports/sorting.ts +++ b/packages/utils/src/lib/reports/sorting.ts @@ -9,13 +9,13 @@ import type { ScoredReport, SortableAuditReport, SortableGroup, -} from './types'; +} from './types.js'; import { compareAudits, compareCategoryAuditsAndGroups, compareIssues, throwIsNotPresentError, -} from './utils'; +} from './utils.js'; export function getSortableAuditByRef( { slug, weight, plugin }: CategoryRef, diff --git a/packages/utils/src/lib/reports/sorting.unit.test.ts b/packages/utils/src/lib/reports/sorting.unit.test.ts index 87b603984..ceb348938 100644 --- a/packages/utils/src/lib/reports/sorting.unit.test.ts +++ b/packages/utils/src/lib/reports/sorting.unit.test.ts @@ -3,8 +3,8 @@ import { getSortableAuditByRef, getSortableGroupByRef, getSortedGroupAudits, -} from './sorting'; -import type { SortableAuditReport, SortableGroup } from './types'; +} from './sorting.js'; +import type { SortableAuditReport, SortableGroup } from './types.js'; describe('getSortableAuditByRef', () => { it('should return a sortable audit', () => { diff --git a/packages/utils/src/lib/reports/utils.ts b/packages/utils/src/lib/reports/utils.ts index fca80013d..7dfaba833 100644 --- a/packages/utils/src/lib/reports/utils.ts +++ b/packages/utils/src/lib/reports/utils.ts @@ -8,8 +8,12 @@ import type { Group, Issue, } from '@code-pushup/models'; -import { SCORE_COLOR_RANGE } from './constants'; -import type { ScoredReport, SortableAuditReport, SortableGroup } from './types'; +import { SCORE_COLOR_RANGE } from './constants.js'; +import type { + ScoredReport, + SortableAuditReport, + SortableGroup, +} from './types.js'; export function formatReportScore(score: number): string { const scaledScore = score * 100; @@ -233,34 +237,31 @@ export function compareIssues(a: Issue, b: Issue): number { if (a.severity !== b.severity) { return -compareIssueSeverity(a.severity, b.severity); } - if (!a.source && b.source) { return -1; } - if (a.source && !b.source) { return 1; } - if (a.source?.file !== b.source?.file) { return a.source?.file.localeCompare(b.source?.file || '') ?? 0; } + return compareSourceFilePosition(a.source?.position, b.source?.position); +} - if (!a.source?.position && b.source?.position) { +function compareSourceFilePosition( + a: NonNullable['position'], + b: NonNullable['position'], +): number { + if (!a && b) { return -1; } - - if (a.source?.position && !b.source?.position) { + if (a && !b) { return 1; } - - if (a.source?.position?.startLine !== b.source?.position?.startLine) { - return ( - (a.source?.position?.startLine ?? 0) - - (b.source?.position?.startLine ?? 0) - ); + if (a?.startLine !== b?.startLine) { + return (a?.startLine ?? 0) - (b?.startLine ?? 0); } - return 0; } diff --git a/packages/utils/src/lib/reports/utils.unit.test.ts b/packages/utils/src/lib/reports/utils.unit.test.ts index 55468ddba..965807a35 100644 --- a/packages/utils/src/lib/reports/utils.unit.test.ts +++ b/packages/utils/src/lib/reports/utils.unit.test.ts @@ -1,8 +1,12 @@ import type { Ansis } from 'ansis'; import { type Mock, describe, expect, it } from 'vitest'; import type { AuditReport, Issue, IssueSeverity } from '@code-pushup/models'; -import { SCORE_COLOR_RANGE } from './constants'; -import type { ScoredReport, SortableAuditReport, SortableGroup } from './types'; +import { SCORE_COLOR_RANGE } from './constants.js'; +import type { + ScoredReport, + SortableAuditReport, + SortableGroup, +} from './types.js'; import { MARKERS, type MarkerShape, @@ -25,7 +29,7 @@ import { scoreMarker, severityMarker, targetScoreIcon, -} from './utils'; +} from './utils.js'; describe('formatReportScore', () => { it.each([ @@ -484,9 +488,11 @@ describe('targetScoreIcon', () => { it('should return target score icon "✅" for passed score', () => { expect(targetScoreIcon(0.42, 0.4)).toBe('✅'); }); + it('should return target score icon "❌" for failed score', () => { expect(targetScoreIcon(0.42, 0.5)).toBe('❌'); }); + it('should return prefixed target score icon if prefix is provided', () => { expect( targetScoreIcon(0.42, 0.1, { @@ -494,6 +500,7 @@ describe('targetScoreIcon', () => { }), ).toBe('<✅'); }); + it('should return prefixed target score icon if postfix is provided', () => { expect( targetScoreIcon(0.42, 0.1, { @@ -501,6 +508,7 @@ describe('targetScoreIcon', () => { }), ).toBe('✅>'); }); + it('should return pre and postfixed target score icon if both are provided', () => { expect( targetScoreIcon(0.42, 0.1, { @@ -509,6 +517,7 @@ describe('targetScoreIcon', () => { }), ).toBe('<✅>'); }); + it('should return no target score icon if no targetScore is provided', () => { expect(targetScoreIcon(0.42)).toBe(''); }); @@ -689,7 +698,7 @@ describe('countCategoryAudits', () => { weight: 1, }, ], - [{ slug: 'coverage', groups: groups }] as ScoredReport['plugins'], + [{ slug: 'coverage', groups }] as ScoredReport['plugins'], ), ).toBe(0); }, diff --git a/packages/utils/src/lib/semver.unit.test.ts b/packages/utils/src/lib/semver.unit.test.ts index b96696570..9648b9710 100644 --- a/packages/utils/src/lib/semver.unit.test.ts +++ b/packages/utils/src/lib/semver.unit.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { isSemver, normalizeSemver, sortSemvers } from './semver'; +import { isSemver, normalizeSemver, sortSemvers } from './semver.js'; describe('isSemver', () => { it.each([ diff --git a/packages/utils/src/lib/text-formats/constants.ts b/packages/utils/src/lib/text-formats/constants.ts index 78ff1971d..70ea49db7 100644 --- a/packages/utils/src/lib/text-formats/constants.ts +++ b/packages/utils/src/lib/text-formats/constants.ts @@ -2,13 +2,13 @@ export const NEW_LINE = '\n'; export const TAB = ' '; export const SPACE = ' '; -/* eslint-disable no-magic-numbers */ export const HIERARCHY = { + /* eslint-disable @typescript-eslint/no-magic-numbers */ level_1: 1, level_2: 2, level_3: 3, level_4: 4, level_5: 5, level_6: 6, + /* eslint-enable @typescript-eslint/no-magic-numbers */ } as const; -/* eslint-enable no-magic-numbers */ diff --git a/packages/utils/src/lib/text-formats/html/details.ts b/packages/utils/src/lib/text-formats/html/details.ts index 353115d41..e4a01637e 100644 --- a/packages/utils/src/lib/text-formats/html/details.ts +++ b/packages/utils/src/lib/text-formats/html/details.ts @@ -1,4 +1,4 @@ -import { NEW_LINE } from '../constants'; +import { NEW_LINE } from '../constants.js'; /** *
diff --git a/packages/utils/src/lib/text-formats/html/font-style.unit.test.ts b/packages/utils/src/lib/text-formats/html/font-style.unit.test.ts index 2393c6d62..1795bb1c1 100644 --- a/packages/utils/src/lib/text-formats/html/font-style.unit.test.ts +++ b/packages/utils/src/lib/text-formats/html/font-style.unit.test.ts @@ -1,4 +1,4 @@ -import { bold, code, italic } from './font-style'; +import { bold, code, italic } from './font-style.js'; describe('bold', () => { it('should return bold text', () => { diff --git a/packages/utils/src/lib/text-formats/html/table.ts b/packages/utils/src/lib/text-formats/html/table.ts index 22c3420ae..e50fbc009 100644 --- a/packages/utils/src/lib/text-formats/html/table.ts +++ b/packages/utils/src/lib/text-formats/html/table.ts @@ -1,6 +1,6 @@ import type { Table } from '@code-pushup/models'; -import { NEW_LINE } from '../constants'; -import { columnsToStringArray, rowToStringArray } from '../table'; +import { NEW_LINE } from '../constants.js'; +import { columnsToStringArray, rowToStringArray } from '../table.js'; function wrap(elem: string, content: string): string { return `<${elem}>${content}${NEW_LINE}`; diff --git a/packages/utils/src/lib/text-formats/html/table.unit.test.ts b/packages/utils/src/lib/text-formats/html/table.unit.test.ts index eb8f2022a..06f29b989 100644 --- a/packages/utils/src/lib/text-formats/html/table.unit.test.ts +++ b/packages/utils/src/lib/text-formats/html/table.unit.test.ts @@ -1,5 +1,5 @@ import type { Table } from '@code-pushup/models'; -import { table } from './table'; +import { table } from './table.js'; describe('tableHtml', () => { it('should create a complete table', () => { diff --git a/packages/utils/src/lib/text-formats/index.ts b/packages/utils/src/lib/text-formats/index.ts index e3a8268be..fb5f84fe9 100644 --- a/packages/utils/src/lib/text-formats/index.ts +++ b/packages/utils/src/lib/text-formats/index.ts @@ -1,9 +1,9 @@ -import { details } from './html/details'; -import { bold, code, italic } from './html/font-style'; -import { link } from './html/link'; -import { table } from './html/table'; +import { details } from './html/details.js'; +import { bold, code, italic } from './html/font-style.js'; +import { link } from './html/link.js'; +import { table } from './html/table.js'; -export { NEW_LINE, SPACE, TAB, HIERARCHY } from './constants'; +export { NEW_LINE, SPACE, TAB, HIERARCHY } from './constants.js'; export const html = { bold, diff --git a/packages/utils/src/lib/text-formats/table.ts b/packages/utils/src/lib/text-formats/table.ts index d62880f10..6cfb4842c 100644 --- a/packages/utils/src/lib/text-formats/table.ts +++ b/packages/utils/src/lib/text-formats/table.ts @@ -5,7 +5,7 @@ import type { TableColumnObject, TableColumnPrimitive, } from '@code-pushup/models'; -import { capitalize } from '../transform'; +import { capitalize } from '../transform.js'; export function rowToStringArray({ rows, columns = [] }: Table): string[][] { if (Array.isArray(rows.at(0)) && typeof columns.at(0) === 'object') { diff --git a/packages/utils/src/lib/text-formats/table.unit.test.ts b/packages/utils/src/lib/text-formats/table.unit.test.ts index 43be3ca74..fad26fe45 100644 --- a/packages/utils/src/lib/text-formats/table.unit.test.ts +++ b/packages/utils/src/lib/text-formats/table.unit.test.ts @@ -6,7 +6,7 @@ import { getColumnAlignmentForKeyAndIndex, getColumnAlignments, rowToStringArray, -} from './table'; +} from './table.js'; describe('rowToStringArray', () => { it('should throw if data shape is incorrect', () => { diff --git a/packages/utils/src/lib/transform.ts b/packages/utils/src/lib/transform.ts index 4a94d4033..d3943a0c4 100644 --- a/packages/utils/src/lib/transform.ts +++ b/packages/utils/src/lib/transform.ts @@ -47,8 +47,7 @@ export function factorOf(items: T[], filterFn: (i: T) => boolean): number { type ArgumentValue = number | string | boolean | string[]; export type CliArgsObject> = T extends never - ? // eslint-disable-next-line @typescript-eslint/naming-convention - Record | { _: string } + ? Record | { _: string } : T; /** @@ -61,7 +60,6 @@ export type CliArgsObject> = * formats: ['json', 'md'] // --format=json --format=md * }); */ -// eslint-disable-next-line sonarjs/cognitive-complexity export function objectToCliArgs< T extends object = Record, >(params?: CliArgsObject): string[] { @@ -69,11 +67,9 @@ export function objectToCliArgs< return []; } - // eslint-disable-next-line @typescript-eslint/no-unsafe-return return Object.entries(params).flatMap(([key, value]) => { // process/file/script if (key === '_') { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return return Array.isArray(value) ? value : [`${value}`]; } const prefix = key.length === 1 ? '-' : '--'; @@ -144,8 +140,8 @@ export function toNumberPrecision( ); } -/* eslint-disable no-magic-numbers */ export function toOrdinal(value: number): string { + /* eslint-disable @typescript-eslint/no-magic-numbers */ if (value % 10 === 1 && value % 100 !== 11) { return `${value}st`; } @@ -157,8 +153,7 @@ export function toOrdinal(value: number): string { if (value % 10 === 3 && value % 100 !== 13) { return `${value}rd`; } + /* eslint-enable @typescript-eslint/no-magic-numbers */ return `${value}th`; } - -/* eslint-enable no-magic-numbers */ diff --git a/packages/utils/src/lib/transform.unit.test.ts b/packages/utils/src/lib/transform.unit.test.ts index f3eb28c7c..1478f8d0d 100644 --- a/packages/utils/src/lib/transform.unit.test.ts +++ b/packages/utils/src/lib/transform.unit.test.ts @@ -15,7 +15,7 @@ import { toNumberPrecision, toOrdinal, toUnixPath, -} from './transform'; +} from './transform.js'; describe('toArray', () => { it('should transform non-array value into array with single value', () => { @@ -238,7 +238,7 @@ describe('toUnixPath', () => { ['src/main.ts', 'src/main.ts'], ['../../relative/unix/path/index.ts', '../../relative/unix/path/index.ts'], [ - '..\\..\\relative\\windows\\path\\index.ts', + String.raw`..\..\relative\windows\path\index.ts`, '../../relative/windows/path/index.ts', ], ])('should transform "%s" to valid slug "%s"', (path, unixPath) => { diff --git a/packages/utils/src/lib/types.ts b/packages/utils/src/lib/types.ts index 620e33ee7..03b53ea77 100644 --- a/packages/utils/src/lib/types.ts +++ b/packages/utils/src/lib/types.ts @@ -1,10 +1,10 @@ -export type ExcludeNullFromPropertyTypes = { - [P in keyof T]: Exclude; +export type ExcludeNullableProps = { + [P in keyof T]: NonNullable; }; export type ItemOrArray = T | T[]; -export type ExtractArray = T extends Array ? T : never; +export type ExtractArray = T extends unknown[] ? T : never; export type ExtractArrays> = { [K in keyof T]: ExtractArray; diff --git a/packages/utils/src/lib/verbose-utils.ts b/packages/utils/src/lib/verbose-utils.ts index a0b42fbc3..9daf7d8e2 100644 --- a/packages/utils/src/lib/verbose-utils.ts +++ b/packages/utils/src/lib/verbose-utils.ts @@ -1,4 +1,4 @@ -import { ui } from './logging'; +import { ui } from './logging.js'; function getLogVerbose(verbose = false) { return (msg: string) => { diff --git a/packages/utils/src/lib/verbose-utils.unit.test.ts b/packages/utils/src/lib/verbose-utils.unit.test.ts index 2326f70ec..339131cf7 100644 --- a/packages/utils/src/lib/verbose-utils.unit.test.ts +++ b/packages/utils/src/lib/verbose-utils.unit.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest'; import { getLogMessages } from '@code-pushup/test-utils'; -import { ui } from './logging'; -import { verboseUtils } from './verbose-utils'; +import { ui } from './logging.js'; +import { verboseUtils } from './verbose-utils.js'; describe('verbose-utils', () => { it('exec should be off by default', () => { diff --git a/packages/utils/src/lib/zod-validation.ts b/packages/utils/src/lib/zod-validation.ts new file mode 100644 index 000000000..ae7813634 --- /dev/null +++ b/packages/utils/src/lib/zod-validation.ts @@ -0,0 +1,25 @@ +import { bold, red } from 'ansis'; +import type { MessageBuilder } from 'zod-validation-error'; + +export function formatErrorPath(errorPath: (string | number)[]): string { + return errorPath + .map((key, index) => { + if (typeof key === 'number') { + return `[${key}]`; + } + return index > 0 ? `.${key}` : key; + }) + .join(''); +} + +export const zodErrorMessageBuilder: MessageBuilder = issues => + issues + .map(issue => { + const formattedMessage = red(`${bold(issue.code)}: ${issue.message}`); + const formattedPath = formatErrorPath(issue.path); + if (formattedPath) { + return `Validation error at ${bold(formattedPath)}\n${formattedMessage}\n`; + } + return `${formattedMessage}\n`; + }) + .join('\n'); diff --git a/packages/utils/src/lib/zod-validation.unit.test.ts b/packages/utils/src/lib/zod-validation.unit.test.ts new file mode 100644 index 000000000..2c9725a4d --- /dev/null +++ b/packages/utils/src/lib/zod-validation.unit.test.ts @@ -0,0 +1,14 @@ +import { formatErrorPath } from './zod-validation.js'; + +describe('formatErrorPath', () => { + it.each([ + [['categories', 1, 'slug'], 'categories[1].slug'], + [['plugins', 2, 'groups', 0, 'refs'], 'plugins[2].groups[0].refs'], + [['refs', 0, 'slug'], 'refs[0].slug'], + [['categories'], 'categories'], + [[], ''], + [['path', 5], 'path[5]'], + ])('should format error path %j as %j', (input, expected) => { + expect(formatErrorPath(input)).toBe(expected); + }); +}); diff --git a/packages/utils/vite.config.integration.ts b/packages/utils/vite.config.integration.ts index 40e9b96e3..2a5523111 100644 --- a/packages/utils/vite.config.integration.ts +++ b/packages/utils/vite.config.integration.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/utils', diff --git a/packages/utils/vite.config.unit.ts b/packages/utils/vite.config.unit.ts index 50d728e5c..66d9e7717 100644 --- a/packages/utils/vite.config.unit.ts +++ b/packages/utils/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../../node_modules/.vite/utils', diff --git a/project.json b/project.json index 93f3644ef..8745d84e2 100644 --- a/project.json +++ b/project.json @@ -3,21 +3,14 @@ "$schema": "node_modules/nx/schemas/project-schema.json", "targets": { "code-pushup": { - "command": "npx dist/packages/cli", - "dependsOn": [ - { - "projects": [ - "cli", - "plugin-eslint", - "plugin-coverage", - "plugin-js-packages", - "plugin-lighthouse", - "examples-plugins", - "react-todos-app" - ], - "target": "build" + "executor": "nx:run-commands", + "options": { + "command": "node packages/cli/src/index.ts", + "env": { + "NODE_OPTIONS": "--import tsx", + "TSX_TSCONFIG_PATH": "tsconfig.base.json" } - ] + } } } } diff --git a/testing/test-nx-utils/.eslintrc.json b/testing/test-nx-utils/.eslintrc.json deleted file mode 100644 index eea2c7f3e..000000000 --- a/testing/test-nx-utils/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "parserOptions": { - "project": ["testing/test-nx-utils/tsconfig.*?.json"] - } - } - ] -} diff --git a/testing/test-nx-utils/eslint.config.js b/testing/test-nx-utils/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/testing/test-nx-utils/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/testing/test-nx-utils/project.json b/testing/test-nx-utils/project.json index 72d84d1c7..09bce6cdf 100644 --- a/testing/test-nx-utils/project.json +++ b/testing/test-nx-utils/project.json @@ -1,18 +1,17 @@ { "name": "test-nx-utils", - "$schema": "../node_modules/nx/schemas/project-schema.json", + "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "testing/test-nx-utils/src", "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/testing/test-nx-utils", "main": "testing/test-nx-utils/src/index.ts", "tsConfig": "testing/test-nx-utils/tsconfig.lib.json", - "assets": ["testing/test-nx-utils/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["testing/test-nx-utils/*.md"] } }, "lint": { diff --git a/testing/test-nx-utils/src/index.ts b/testing/test-nx-utils/src/index.ts index 74a844499..5713fae83 100644 --- a/testing/test-nx-utils/src/index.ts +++ b/testing/test-nx-utils/src/index.ts @@ -1,4 +1,4 @@ -export * from './lib/utils/environment'; -export * from './lib/utils/nx'; -export * from './lib/utils/nx-plugin'; -export * from './lib/utils/tree'; +export * from './lib/utils/environment.js'; +export * from './lib/utils/nx.js'; +export * from './lib/utils/nx-plugin.js'; +export * from './lib/utils/tree.js'; diff --git a/testing/test-nx-utils/src/lib/utils/nx-plugin.ts b/testing/test-nx-utils/src/lib/utils/nx-plugin.ts index e7a48a998..000cdecc9 100644 --- a/testing/test-nx-utils/src/lib/utils/nx-plugin.ts +++ b/testing/test-nx-utils/src/lib/utils/nx-plugin.ts @@ -1,8 +1,8 @@ import type { CreateNodesContext } from '@nx/devkit'; export function createNodesContext( - options?: Partial, -): CreateNodesContext { + options?: Partial, +): CreateNodesContextV2 { const { workspaceRoot = process.cwd(), nxJsonConfiguration = {} } = options ?? {}; return { diff --git a/testing/test-nx-utils/src/lib/utils/nx-plugin.unit.test.ts b/testing/test-nx-utils/src/lib/utils/nx-plugin.unit.test.ts index 24a670677..d1f533304 100644 --- a/testing/test-nx-utils/src/lib/utils/nx-plugin.unit.test.ts +++ b/testing/test-nx-utils/src/lib/utils/nx-plugin.unit.test.ts @@ -1,6 +1,10 @@ import * as process from 'node:process'; import { describe, expect } from 'vitest'; import { createNodesContext } from './nx-plugin'; +import { + createNodesContext, + invokeCreateNodesOnVirtualFiles, +} from './nx-plugin.js'; describe('createNodesContext', () => { it('should return a context with the provided options', () => { diff --git a/testing/test-nx-utils/src/lib/utils/nx.ts b/testing/test-nx-utils/src/lib/utils/nx.ts index f05e4713a..b38229f7f 100644 --- a/testing/test-nx-utils/src/lib/utils/nx.ts +++ b/testing/test-nx-utils/src/lib/utils/nx.ts @@ -2,21 +2,23 @@ import { type ExecutorContext, type NxJsonConfiguration, type PluginConfiguration, - type ProjectConfiguration, readJson, + type ProjectConfiguration, type Tree, + readJson, updateJson, } from '@nx/devkit'; -import {libraryGenerator} from '@nx/js'; -import type {LibraryGeneratorSchema} from '@nx/js/src/utils/schema'; -import {createTreeWithEmptyWorkspace} from 'nx/src/generators/testing-utils/create-tree-with-empty-workspace'; -import {executeProcess} from '@code-pushup/utils'; -import {readFile, writeFile} from "node:fs/promises"; +import { libraryGenerator } from '@nx/js'; +import type { LibraryGeneratorSchema } from '@nx/js/src/utils/schema'; +import { readFile, writeFile } from 'node:fs/promises'; +import path from 'node:path'; +import { createTreeWithEmptyWorkspace } from 'nx/src/generators/testing-utils/create-tree-with-empty-workspace'; +import { executeProcess } from '@code-pushup/utils'; export function executorContext< T extends { projectName: string; cwd?: string }, >(nameOrOpt: string | T): ExecutorContext { - const {projectName, cwd = process.cwd()} = - typeof nameOrOpt === 'string' ? {projectName: nameOrOpt} : nameOrOpt; + const { projectName, cwd = process.cwd() } = + typeof nameOrOpt === 'string' ? { projectName: nameOrOpt } : nameOrOpt; return { cwd, isVerbose: false, @@ -38,22 +40,22 @@ export async function generateWorkspaceAndProject( options: | string | (Omit, 'name'> & { - name: string; - }), + name: string; + }), ) { - const tree = createTreeWithEmptyWorkspace({layout: 'apps-libs'}); - const {name, ...normalizedOptions} = - typeof options === 'string' ? {name: options} : options; + const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); + const { name, ...normalizedOptions } = + typeof options === 'string' ? { name: options } : options; await libraryGenerator(tree, { name, - directory: 'libs', + directory: path.join('libs', name), tags: 'scope:plugin', linter: 'none', unitTestRunner: 'none', testEnvironment: 'node', buildable: false, publishable: false, - projectNameAndRootFormat: 'derived', + projectNameAndRootFormat: 'as-provided', ...normalizedOptions, }); @@ -67,8 +69,8 @@ export function registerPluginInWorkspace( const normalizedPluginConfiguration = typeof configuration === 'string' ? { - plugin: configuration, - } + plugin: configuration, + } : configuration; updateJson(tree, 'nx.json', (json: NxJsonConfiguration) => ({ ...json, @@ -83,25 +85,30 @@ export async function registerPluginInNxJson( const normalizedPluginConfiguration = typeof configuration === 'string' ? { - plugin: configuration, - } + plugin: configuration, + } : configuration; - const json = JSON.parse((await readFile(nxJsonPath)).toString()) as NxJsonConfiguration; - await writeFile(nxJsonPath, JSON.stringify({ - ...json, - plugins: [...(json.plugins ?? []), normalizedPluginConfiguration], - })); + const json = JSON.parse( + (await readFile(nxJsonPath)).toString(), + ) as NxJsonConfiguration; + await writeFile( + nxJsonPath, + JSON.stringify({ + ...json, + plugins: [...(json.plugins ?? []), normalizedPluginConfiguration], + }), + ); } export async function nxShowProjectJson( cwd: string, project: string, ) { - const {code, stderr, stdout} = await executeProcess({ + const { code, stderr, stdout } = await executeProcess({ command: 'npx', args: ['nx', 'show', `project --json ${project}`], cwd, }); - return {code, stderr, projectJson: JSON.parse(stdout) as T}; + return { code, stderr, projectJson: JSON.parse(stdout) as T }; } diff --git a/testing/test-nx-utils/src/lib/utils/nx.unit.test.ts b/testing/test-nx-utils/src/lib/utils/nx.unit.test.ts index e9894ff0e..b2cf6697b 100644 --- a/testing/test-nx-utils/src/lib/utils/nx.unit.test.ts +++ b/testing/test-nx-utils/src/lib/utils/nx.unit.test.ts @@ -1,7 +1,7 @@ import * as process from 'node:process'; import { createTreeWithEmptyWorkspace } from 'nx/src/generators/testing-utils/create-tree-with-empty-workspace'; import { describe, expect } from 'vitest'; -import { executorContext, registerPluginInWorkspace } from './nx'; +import { executorContext, registerPluginInWorkspace } from './nx.js'; describe('executorContext', () => { it('should create context for given project name', () => { diff --git a/testing/test-nx-utils/src/lib/utils/tree.integration.test.ts b/testing/test-nx-utils/src/lib/utils/tree.integration.test.ts index d0e7cf660..0e06aabf6 100644 --- a/testing/test-nx-utils/src/lib/utils/tree.integration.test.ts +++ b/testing/test-nx-utils/src/lib/utils/tree.integration.test.ts @@ -1,21 +1,21 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { createTreeWithEmptyWorkspace } from 'nx/src/generators/testing-utils/create-tree-with-empty-workspace'; import { describe, expect, it } from 'vitest'; import { readJsonFile } from '@code-pushup/utils'; -import { materializeTree } from './tree'; +import { materializeTree } from './tree.js'; describe('materializeTree', () => { - const baseDir = join('tmp', 'materialize-tree'); + const baseDir = path.join('tmp', 'materialize-tree'); it('should create files from tree', async () => { - const root = join(baseDir, 'materialize'); + const root = path.join(baseDir, 'materialize'); const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' }); expect(tree.exists('nx.json')).toBe(true); await materializeTree(tree, root); - await expect(readJsonFile(join(root, 'nx.json'))).resolves.toEqual({ + await expect(readJsonFile(path.join(root, 'nx.json'))).resolves.toEqual({ affected: { defaultBase: 'main', }, diff --git a/testing/test-nx-utils/src/lib/utils/tree.ts b/testing/test-nx-utils/src/lib/utils/tree.ts index 488d7423b..cb2dfc0dd 100644 --- a/testing/test-nx-utils/src/lib/utils/tree.ts +++ b/testing/test-nx-utils/src/lib/utils/tree.ts @@ -1,17 +1,17 @@ import type { Tree } from '@nx/devkit'; import { writeFile } from 'node:fs/promises'; -import { dirname, join } from 'node:path'; +import path from 'node:path'; import { ensureDirectoryExists } from '@code-pushup/test-utils'; export async function materializeTree(tree: Tree, targetFolder: string) { const changes = tree.listChanges(); await Promise.all( changes.map(async change => { - const filePath = join(targetFolder, change.path); + const filePath = path.join(targetFolder, change.path); if (change.type === 'CREATE' || change.type === 'UPDATE') { try { - await ensureDirectoryExists(dirname(filePath)); + await ensureDirectoryExists(path.dirname(filePath)); await writeFile(filePath, change.content?.toString() ?? ''); } catch (error) { console.error(`Failed to process file ${filePath}:`, error); diff --git a/testing/test-nx-utils/vite.config.unit.ts b/testing/test-nx-utils/vite.config.unit.ts index 066bbc269..b5a305cc1 100644 --- a/testing/test-nx-utils/vite.config.unit.ts +++ b/testing/test-nx-utils/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../node_modules/.vite/test-nx-utils', diff --git a/testing/test-setup/.eslintrc.json b/testing/test-setup/.eslintrc.json deleted file mode 100644 index 0881a0fab..000000000 --- a/testing/test-setup/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "parserOptions": { - "project": ["testing/test-setup/tsconfig.*?.json"] - } - } - ] -} diff --git a/testing/test-setup/eslint.config.js b/testing/test-setup/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/testing/test-setup/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/testing/test-setup/project.json b/testing/test-setup/project.json index 60f5cbd40..3db218fb8 100644 --- a/testing/test-setup/project.json +++ b/testing/test-setup/project.json @@ -1,18 +1,17 @@ { "name": "test-setup", - "$schema": "../node_modules/nx/schemas/project-schema.json", + "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "testing/test-setup/src", "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/testing/test-setup", "main": "testing/test-setup/src/index.ts", "tsConfig": "testing/test-setup/tsconfig.lib.json", - "assets": ["testing/test-setup/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["testing/test-setup/*.md"] } }, "lint": { diff --git a/testing/test-setup/src/index.ts b/testing/test-setup/src/index.ts index 9c67964a4..e15bd396e 100644 --- a/testing/test-setup/src/index.ts +++ b/testing/test-setup/src/index.ts @@ -1 +1 @@ -export * from './lib/test-folder.setup'; +export * from './lib/test-folder.setup.js'; diff --git a/testing/test-utils/.eslintrc.json b/testing/test-utils/.eslintrc.json deleted file mode 100644 index 0211b31d1..000000000 --- a/testing/test-utils/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": ["../../.eslintrc.json"], - "ignorePatterns": ["!**/*", "src/lib/fixtures/configs"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "parserOptions": { - "project": ["testing/test-utils/tsconfig.*?.json"] - } - } - ] -} diff --git a/testing/test-utils/eslint.config.js b/testing/test-utils/eslint.config.js new file mode 100644 index 000000000..2656b27cb --- /dev/null +++ b/testing/test-utils/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, +}); diff --git a/testing/test-utils/package.json b/testing/test-utils/package.json new file mode 100644 index 000000000..e3ca7107f --- /dev/null +++ b/testing/test-utils/package.json @@ -0,0 +1,4 @@ +{ + "name": "@code-pushup/test-utils", + "type": "module" +} diff --git a/testing/test-utils/project.json b/testing/test-utils/project.json index 93271a696..24d01139e 100644 --- a/testing/test-utils/project.json +++ b/testing/test-utils/project.json @@ -1,18 +1,17 @@ { "name": "test-utils", - "$schema": "../node_modules/nx/schemas/project-schema.json", + "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "testing/test-utils/src", "projectType": "library", "targets": { "build": { - "executor": "@nx/esbuild:esbuild", + "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/testing/test-utils", "main": "testing/test-utils/src/index.ts", "tsConfig": "testing/test-utils/tsconfig.lib.json", - "assets": ["testing/test-utils/*.md"], - "esbuildConfig": "esbuild.config.js" + "assets": ["testing/test-utils/*.md"] } }, "lint": { diff --git a/testing/test-utils/src/index.ts b/testing/test-utils/src/index.ts index 4ada76af9..2adbfb7b9 100644 --- a/testing/test-utils/src/index.ts +++ b/testing/test-utils/src/index.ts @@ -1,32 +1,31 @@ -export * from './lib/constants'; -export * from './lib/utils/execute-process-helper.mock'; -export * from './lib/utils/os-agnostic-paths'; -export * from './lib/utils/logging'; -export * from './lib/utils/env'; -export * from './lib/utils/git'; -export * from './lib/utils/string'; -export * from './lib/utils/file-system'; -export * from './lib/utils/create-npm-workshpace'; -export * from './lib/utils/omit-report-data'; -export * from './lib/utils/project-graph'; +export * from './lib/constants.js'; +export * from './lib/utils/execute-process-helper.mock.js'; +export * from './lib/utils/os-agnostic-paths.js'; +export * from './lib/utils/logging.js'; +export * from './lib/utils/env.js'; +export * from './lib/utils/git.js'; +export * from './lib/utils/string.js'; +export * from './lib/utils/file-system.js'; +export * from './lib/utils/create-npm-workshpace.js'; +export * from './lib/utils/omit-report-data.js'; +export * from './lib/utils/project-graph.js'; // static mocks -export * from './lib/utils/commit.mock'; -export * from './lib/utils/core-config.mock'; -export * from './lib/utils/minimal-config.mock'; -export * from './lib/utils/report.mock'; -export * from './lib/fixtures/configs/custom-plugin'; +export * from './lib/utils/commit.mock.js'; +export * from './lib/utils/core-config.mock.js'; +export * from './lib/utils/minimal-config.mock.js'; +export * from './lib/utils/report.mock.js'; // dynamic mocks -export * from './lib/utils/dynamic-mocks/categories.mock'; -export * from './lib/utils/dynamic-mocks/config.mock'; -export * from './lib/utils/dynamic-mocks/eslint-audits.mock'; -export * from './lib/utils/dynamic-mocks/eslint-plugin.mock'; -export * from './lib/utils/dynamic-mocks/lighthouse-audits.mock'; -export * from './lib/utils/dynamic-mocks/lighthouse-plugin.mock'; -export * from './lib/utils/dynamic-mocks/persist-config.mock'; -export * from './lib/utils/dynamic-mocks/plugin-config.mock'; -export * from './lib/utils/dynamic-mocks/report-diff.mock'; -export * from './lib/utils/dynamic-mocks/report.mock'; -export * from './lib/utils/dynamic-mocks/runner-config.mock'; -export * from './lib/utils/dynamic-mocks/upload-config.mock'; +export * from './lib/utils/dynamic-mocks/categories.mock.js'; +export * from './lib/utils/dynamic-mocks/config.mock.js'; +export * from './lib/utils/dynamic-mocks/eslint-audits.mock.js'; +export * from './lib/utils/dynamic-mocks/eslint-plugin.mock.js'; +export * from './lib/utils/dynamic-mocks/lighthouse-audits.mock.js'; +export * from './lib/utils/dynamic-mocks/lighthouse-plugin.mock.js'; +export * from './lib/utils/dynamic-mocks/persist-config.mock.js'; +export * from './lib/utils/dynamic-mocks/plugin-config.mock.js'; +export * from './lib/utils/dynamic-mocks/report-diff.mock.js'; +export * from './lib/utils/dynamic-mocks/report.mock.js'; +export * from './lib/utils/dynamic-mocks/runner-config.mock.js'; +export * from './lib/utils/dynamic-mocks/upload-config.mock.js'; diff --git a/testing/test-utils/src/lib/fixtures/configs/code-pushup.invalid.config.ts b/testing/test-utils/src/lib/fixtures/configs/code-pushup.invalid.config.ts index 77380331b..7396948b9 100644 --- a/testing/test-utils/src/lib/fixtures/configs/code-pushup.invalid.config.ts +++ b/testing/test-utils/src/lib/fixtures/configs/code-pushup.invalid.config.ts @@ -1,4 +1,4 @@ -import { type CoreConfig } from '@code-pushup/models'; +import type { CoreConfig } from '@code-pushup/models'; export default { persist: { outputDir: 'tmp' }, diff --git a/testing/test-utils/src/lib/fixtures/configs/code-pushup.needs-tsconfig.config.ts b/testing/test-utils/src/lib/fixtures/configs/code-pushup.needs-tsconfig.config.ts index 376cc48cb..44b4d0a2d 100644 --- a/testing/test-utils/src/lib/fixtures/configs/code-pushup.needs-tsconfig.config.ts +++ b/testing/test-utils/src/lib/fixtures/configs/code-pushup.needs-tsconfig.config.ts @@ -1,5 +1,6 @@ // the point is to test runtime import which relies on alias defined in tsconfig.json "paths" // non-type import from '@example/custom-plugin' wouldn't work without --tsconfig +// eslint-disable-next-line import/no-unresolved import customPlugin from '@example/custom-plugin'; const config = { diff --git a/testing/test-utils/src/lib/fixtures/configs/progress-bar.config.mock.ts b/testing/test-utils/src/lib/fixtures/configs/progress-bar.config.mock.ts index c3a812435..ee22a3d7d 100644 --- a/testing/test-utils/src/lib/fixtures/configs/progress-bar.config.mock.ts +++ b/testing/test-utils/src/lib/fixtures/configs/progress-bar.config.mock.ts @@ -4,7 +4,7 @@ * Usage: * npx ./dist/packages/cli collect --config=./testing/test-utils/src/lib/fixtures/configs/progress-bar.config.mock.ts */ -import { dirname, join } from 'path'; +import path from 'node:path'; import { fileURLToPath } from 'url'; // Small hack to control the number of plugins while debugging @@ -16,8 +16,8 @@ const numPlugins = parseInt( ); const outputDir = './tmp'; -const pluginProcess = join( - fileURLToPath(dirname(import.meta.url)), +const pluginProcess = path.join( + fileURLToPath(path.dirname(import.meta.url)), '..', '..', 'utils', @@ -30,7 +30,7 @@ const pluginTitle = (end: string): string => 'Async Plugin ' + end; const auditTitle = (end: string): string => 'Async Audit ' + end; const asyncPlugin = (pId: string, duration = 1000) => { const aId = '0'; - const outputFile = join(outputDir, `${pluginSlug(pId)}-output.json`); + const outputFile = path.join(outputDir, `${pluginSlug(pId)}-output.json`); return { slug: pluginSlug(pId), title: pluginTitle(pId), diff --git a/testing/test-utils/src/lib/utils/create-npm-workshpace.ts b/testing/test-utils/src/lib/utils/create-npm-workshpace.ts index 741c90e4a..cd9d87637 100644 --- a/testing/test-utils/src/lib/utils/create-npm-workshpace.ts +++ b/testing/test-utils/src/lib/utils/create-npm-workshpace.ts @@ -1,10 +1,10 @@ import { mkdir, writeFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; export async function createNpmWorkspace(cwd: string) { await mkdir(cwd, { recursive: true }); await writeFile( - join(cwd, 'package.json'), + path.join(cwd, 'package.json'), JSON.stringify( { name: 'create-npm-workspace', diff --git a/testing/test-utils/src/lib/utils/dynamic-mocks/categories.mock.ts b/testing/test-utils/src/lib/utils/dynamic-mocks/categories.mock.ts index da03d9962..e35b9ee47 100644 --- a/testing/test-utils/src/lib/utils/dynamic-mocks/categories.mock.ts +++ b/testing/test-utils/src/lib/utils/dynamic-mocks/categories.mock.ts @@ -1,5 +1,5 @@ import type { CategoryConfig } from '@code-pushup/models'; -import { eslintAuditRefMock } from './eslint-plugin.mock'; +import { eslintAuditRefMock } from './eslint-plugin.mock.js'; export const CATEGORIES_MAP = { performance: { diff --git a/testing/test-utils/src/lib/utils/dynamic-mocks/config.mock.ts b/testing/test-utils/src/lib/utils/dynamic-mocks/config.mock.ts index ad9fbb74f..5a9d2fc53 100644 --- a/testing/test-utils/src/lib/utils/dynamic-mocks/config.mock.ts +++ b/testing/test-utils/src/lib/utils/dynamic-mocks/config.mock.ts @@ -1,9 +1,9 @@ import { type CoreConfig, coreConfigSchema } from '@code-pushup/models'; -import { categoryConfigsMock } from './categories.mock'; -import { eslintPluginConfigMock } from './eslint-plugin.mock'; -import { lighthousePluginConfigMock } from './lighthouse-plugin.mock'; -import { persistConfigMock } from './persist-config.mock'; -import { auditReportMock, pluginConfigMock } from './plugin-config.mock'; +import { categoryConfigsMock } from './categories.mock.js'; +import { eslintPluginConfigMock } from './eslint-plugin.mock.js'; +import { lighthousePluginConfigMock } from './lighthouse-plugin.mock.js'; +import { persistConfigMock } from './persist-config.mock.js'; +import { auditReportMock, pluginConfigMock } from './plugin-config.mock.js'; export function configMock(outputDir = 'tmp'): CoreConfig { return coreConfigSchema.parse({ diff --git a/testing/test-utils/src/lib/utils/dynamic-mocks/eslint-plugin.mock.ts b/testing/test-utils/src/lib/utils/dynamic-mocks/eslint-plugin.mock.ts index 773e9348d..672f32fec 100644 --- a/testing/test-utils/src/lib/utils/dynamic-mocks/eslint-plugin.mock.ts +++ b/testing/test-utils/src/lib/utils/dynamic-mocks/eslint-plugin.mock.ts @@ -1,4 +1,4 @@ -import { join } from 'node:path'; +import path from 'node:path'; import type { Audit, AuditReport, @@ -11,8 +11,8 @@ import { ESLINT_AUDITS_FIXED_SLUGS, ESLINT_AUDITS_MAP, ESLINT_AUDIT_SLUGS, -} from './eslint-audits.mock'; -import { echoRunnerConfigMock } from './runner-config.mock'; +} from './eslint-audits.mock.js'; +import { echoRunnerConfigMock } from './runner-config.mock.js'; export const ESLINT_PLUGIN_GROUP_MAX_LINES: Group = { slug: 'max-line-limitation', @@ -53,7 +53,7 @@ export function eslintPluginConfigMock(outputDir = 'tmp'): PluginConfig { ...ESLINT_PLUGIN_META, runner: echoRunnerConfigMock( Object.values(ESLINT_AUDITS_MAP), - join(outputDir, 'eslint-out.json'), + path.join(outputDir, 'eslint-out.json'), ), audits, }; diff --git a/testing/test-utils/src/lib/utils/dynamic-mocks/lighthouse-plugin.mock.ts b/testing/test-utils/src/lib/utils/dynamic-mocks/lighthouse-plugin.mock.ts index cea351aab..ea3b43edd 100644 --- a/testing/test-utils/src/lib/utils/dynamic-mocks/lighthouse-plugin.mock.ts +++ b/testing/test-utils/src/lib/utils/dynamic-mocks/lighthouse-plugin.mock.ts @@ -1,4 +1,4 @@ -import { join } from 'node:path'; +import path from 'node:path'; import type { Audit, AuditReport, @@ -10,8 +10,8 @@ import { LIGHTHOUSE_AUDITS_CHANGES, LIGHTHOUSE_AUDITS_MAP, LIGHTHOUSE_AUDIT_SLUGS, -} from './lighthouse-audits.mock'; -import { echoRunnerConfigMock } from './runner-config.mock'; +} from './lighthouse-audits.mock.js'; +import { echoRunnerConfigMock } from './runner-config.mock.js'; export const LH_PLUGIN_GROUP_PERFORMANCE: Group = { slug: 'performance', @@ -61,7 +61,7 @@ export function lighthousePluginConfigMock(outputDir = 'tmp'): PluginConfig { ...LH_PLUGIN_META, runner: echoRunnerConfigMock( Object.values(LIGHTHOUSE_AUDITS_MAP), - join(outputDir, 'lighthouse-out.json'), + path.join(outputDir, 'lighthouse-out.json'), ), audits, groups: [LH_PLUGIN_GROUP_PERFORMANCE], diff --git a/testing/test-utils/src/lib/utils/dynamic-mocks/plugin-config.mock.ts b/testing/test-utils/src/lib/utils/dynamic-mocks/plugin-config.mock.ts index 983d79d07..da9cf94fa 100644 --- a/testing/test-utils/src/lib/utils/dynamic-mocks/plugin-config.mock.ts +++ b/testing/test-utils/src/lib/utils/dynamic-mocks/plugin-config.mock.ts @@ -1,4 +1,4 @@ -import { join } from 'node:path'; +import path from 'node:path'; import { type Audit, type AuditReport, @@ -7,14 +7,14 @@ import { auditSchema, pluginConfigSchema, } from '@code-pushup/models'; -import { echoRunnerConfigMock } from './runner-config.mock'; +import { echoRunnerConfigMock } from './runner-config.mock.js'; export function pluginConfigMock( auditOutputs: AuditReport[], opt?: Partial & { outputDir?: string; outputFile?: string }, ): PluginConfig { const { outputDir, outputFile } = opt || {}; - const pluginOutputFile = join( + const pluginOutputFile = path.join( outputDir || 'tmp', outputFile || `out.${Date.now()}.json`, ); diff --git a/testing/test-utils/src/lib/utils/dynamic-mocks/report-diff.mock.ts b/testing/test-utils/src/lib/utils/dynamic-mocks/report-diff.mock.ts index c043756b9..9bd8fb100 100644 --- a/testing/test-utils/src/lib/utils/dynamic-mocks/report-diff.mock.ts +++ b/testing/test-utils/src/lib/utils/dynamic-mocks/report-diff.mock.ts @@ -4,31 +4,31 @@ import type { CategoryDiff, ReportsDiff, } from '@code-pushup/models'; -import { COMMIT_ALT_MOCK, COMMIT_MOCK } from '../commit.mock'; +import { COMMIT_ALT_MOCK, COMMIT_MOCK } from '../commit.mock.js'; import { CATEGORIES_MAP, CATEGORY_SLUGS, type CategorySlug, -} from './categories.mock'; +} from './categories.mock.js'; import { ESLINT_AUDITS_FIXED_SLUGS, ESLINT_AUDITS_MAP, ESLINT_AUDIT_SLUGS, -} from './eslint-audits.mock'; +} from './eslint-audits.mock.js'; import { ESLINT_PLUGIN_GROUP_MAX_LINES, ESLINT_PLUGIN_META, type ESLintAuditSlug, -} from './eslint-plugin.mock'; +} from './eslint-plugin.mock.js'; import { LIGHTHOUSE_AUDITS_CHANGES, LIGHTHOUSE_AUDITS_MAP, LIGHTHOUSE_AUDIT_SLUGS, -} from './lighthouse-audits.mock'; +} from './lighthouse-audits.mock.js'; import { LH_PLUGIN_GROUP_PERFORMANCE, LH_PLUGIN_META, -} from './lighthouse-plugin.mock'; +} from './lighthouse-plugin.mock.js'; export function reportsDiffMock(): ReportsDiff { return { diff --git a/testing/test-utils/src/lib/utils/dynamic-mocks/report.mock.ts b/testing/test-utils/src/lib/utils/dynamic-mocks/report.mock.ts index 6b993f0c5..69895386c 100644 --- a/testing/test-utils/src/lib/utils/dynamic-mocks/report.mock.ts +++ b/testing/test-utils/src/lib/utils/dynamic-mocks/report.mock.ts @@ -1,14 +1,14 @@ import type { Report } from '@code-pushup/models'; -import { COMMIT_ALT_MOCK, COMMIT_MOCK } from '../commit.mock'; -import { categoryConfigsMock } from './categories.mock'; +import { COMMIT_ALT_MOCK, COMMIT_MOCK } from '../commit.mock.js'; +import { categoryConfigsMock } from './categories.mock.js'; import { eslintPluginReportAltMock, eslintPluginReportMock, -} from './eslint-plugin.mock'; +} from './eslint-plugin.mock.js'; import { lighthousePluginReportAltMock, lighthousePluginReportMock, -} from './lighthouse-plugin.mock'; +} from './lighthouse-plugin.mock.js'; export function reportMock(): Report { return { diff --git a/testing/test-utils/src/lib/utils/execute-process-helper.mock.ts b/testing/test-utils/src/lib/utils/execute-process-helper.mock.ts index 1995c7526..0f9290acb 100644 --- a/testing/test-utils/src/lib/utils/execute-process-helper.mock.ts +++ b/testing/test-utils/src/lib/utils/execute-process-helper.mock.ts @@ -1,6 +1,6 @@ -import { join } from 'path'; +import path from 'node:path'; -const asyncProcessPath = join(__dirname, './execute-process.mock.mjs'); +const asyncProcessPath = path.join(__dirname, './execute-process.mock.mjs'); /** * Helps to get an async process runner config for testing. diff --git a/testing/test-utils/src/lib/utils/file-system.unit.test.ts b/testing/test-utils/src/lib/utils/file-system.unit.test.ts index 5fdf5047e..68dc4671c 100644 --- a/testing/test-utils/src/lib/utils/file-system.unit.test.ts +++ b/testing/test-utils/src/lib/utils/file-system.unit.test.ts @@ -1,6 +1,6 @@ import { vol } from 'memfs'; import { stat } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import { type MockInstance, afterEach, @@ -10,8 +10,8 @@ import { it, vi, } from 'vitest'; -import { MEMFS_VOLUME } from '../constants'; -import { ensureDirectoryExists } from './file-system'; +import { MEMFS_VOLUME } from '../constants.js'; +import { ensureDirectoryExists } from './file-system.js'; vi.mock('fs', async () => { const memfs: typeof import('memfs') = await vi.importActual('memfs'); @@ -36,7 +36,7 @@ describe('ensureDirectoryExists', () => { it('should create a nested folder', async () => { vol.fromJSON({}, MEMFS_VOLUME); - const dir = join(MEMFS_VOLUME, 'sub', 'dir'); + const dir = path.join(MEMFS_VOLUME, 'sub', 'dir'); await ensureDirectoryExists(dir); await expect( @@ -52,7 +52,7 @@ describe('ensureDirectoryExists', () => { MEMFS_VOLUME, ); - const dir = join(MEMFS_VOLUME, 'sub'); + const dir = path.join(MEMFS_VOLUME, 'sub'); await ensureDirectoryExists(dir); await expect( diff --git a/testing/test-utils/src/lib/utils/git.ts b/testing/test-utils/src/lib/utils/git.ts index 99c48a8e4..785b92cfe 100644 --- a/testing/test-utils/src/lib/utils/git.ts +++ b/testing/test-utils/src/lib/utils/git.ts @@ -1,6 +1,12 @@ import { mkdir, writeFile } from 'node:fs/promises'; -import { join } from 'node:path'; -import type { SimpleGit, SimpleGitFactory } from 'simple-git'; +import path from 'node:path'; +import type { + FetchResult, + Response, + SimpleGit, + SimpleGitFactory, +} from 'simple-git'; +import { vi } from 'vitest'; export type GitConfig = { name: string; email: string }; @@ -36,7 +42,7 @@ export async function commitFile( } = opt ?? {}; const { name = 'README.md', content = `# hello-world-${Math.random()}\n` } = file ?? {}; - await writeFile(join(baseDir, name), content); + await writeFile(path.join(baseDir, name), content); await git.add(name); if (tagName) { await git.tag([tagName]); @@ -46,3 +52,28 @@ export async function commitFile( } return git; } + +export async function simulateGitFetch(git: SimpleGit) { + let fetchHead: string = await git.branchLocal().then(resp => resp.current); + + vi.spyOn(git, 'fetch').mockImplementation((...args) => { + fetchHead = (args as unknown as [string, string, string[]])[1]; + return Promise.resolve({}) as Response; + }); + + const originalDiffSummary = git.diffSummary.bind(git); + const originalDiff = git.diff.bind(git); + + vi.spyOn(git, 'diffSummary').mockImplementation(args => + originalDiffSummary( + (args as unknown as string[]).map(arg => + arg === 'FETCH_HEAD' ? fetchHead : arg, + ), + ), + ); + vi.spyOn(git, 'diff').mockImplementation(args => + originalDiff( + (args as string[]).map(arg => (arg === 'FETCH_HEAD' ? fetchHead : arg)), + ), + ); +} diff --git a/testing/test-utils/src/lib/utils/omit-report-data.ts b/testing/test-utils/src/lib/utils/omit-report-data.ts index 832bc87dd..70c21c7ea 100644 --- a/testing/test-utils/src/lib/utils/omit-report-data.ts +++ b/testing/test-utils/src/lib/utils/omit-report-data.ts @@ -28,7 +28,6 @@ export function omitVariablePluginData( }, ) { const { omitAuditData } = options ?? {}; - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions return { ...pluginReport, audits: audits.map(plugin => diff --git a/testing/test-utils/src/lib/utils/os-agnostic-paths.unit.test.ts b/testing/test-utils/src/lib/utils/os-agnostic-paths.unit.test.ts index 3c7482fcd..4925084fd 100644 --- a/testing/test-utils/src/lib/utils/os-agnostic-paths.unit.test.ts +++ b/testing/test-utils/src/lib/utils/os-agnostic-paths.unit.test.ts @@ -7,7 +7,7 @@ import { it, vi, } from 'vitest'; -import { osAgnosticPath } from './os-agnostic-paths'; +import { osAgnosticPath } from './os-agnostic-paths.js'; describe('osAgnosticPath', () => { const cwdSpy: MockInstance<[], string> = vi.spyOn(process, 'cwd'); @@ -22,6 +22,7 @@ describe('osAgnosticPath', () => { beforeEach(() => { cwdSpy.mockReturnValue(unixCwd); }); + afterEach(() => { cwdSpy.mockReset(); }); @@ -70,11 +71,12 @@ describe('osAgnosticPath', () => { }); describe('Windows', () => { - const windowsCWD = 'D:\\users\\jerry'; + const windowsCWD = String.raw`D:\users\jerry`; beforeEach(() => { cwdSpy.mockReturnValue(windowsCWD); }); + afterEach(() => { cwdSpy.mockReset(); }); @@ -94,26 +96,27 @@ describe('osAgnosticPath', () => { }); it('should handle absolute paths correctly on Windows', () => { - expect(osAgnosticPath('\\.code-pushup\\.code-pushup.config.ts')).toBe( - '/.code-pushup/.code-pushup.config.ts', - ); + expect( + osAgnosticPath(String.raw`\.code-pushup\.code-pushup.config.ts`), + ).toBe('/.code-pushup/.code-pushup.config.ts'); }); it('should handle paths with CWD shorthand "." correctly on Windows', () => { - expect(osAgnosticPath('.\\.code-pushup\\.code-pushup.config.ts')).toBe( - './.code-pushup/.code-pushup.config.ts', - ); + expect( + osAgnosticPath(String.raw`.\.code-pushup\.code-pushup.config.ts`), + ).toBe('./.code-pushup/.code-pushup.config.ts'); }); it('should handle relative paths correctly on Windows', () => { expect( - osAgnosticPath('..\\..\\.code-pushup\\.code-pushup.config.ts'), + osAgnosticPath(String.raw`..\..\.code-pushup\.code-pushup.config.ts`), ).toBe('../../.code-pushup/.code-pushup.config.ts'); }); + it('should handle path segments correctly on Windows', () => { - expect(osAgnosticPath('.code-pushup\\.code-pushup.config.ts')).toBe( - '.code-pushup/.code-pushup.config.ts', - ); + expect( + osAgnosticPath(String.raw`.code-pushup\.code-pushup.config.ts`), + ).toBe('.code-pushup/.code-pushup.config.ts'); }); }); }); diff --git a/testing/test-utils/src/lib/utils/progress-bar-process.mock.mjs b/testing/test-utils/src/lib/utils/progress-bar-process.mock.mjs index 9f2a069ed..37894cfb8 100644 --- a/testing/test-utils/src/lib/utils/progress-bar-process.mock.mjs +++ b/testing/test-utils/src/lib/utils/progress-bar-process.mock.mjs @@ -1,5 +1,5 @@ import { existsSync, mkdirSync, writeFileSync } from 'fs'; -import { join } from 'path'; +import path from 'node:path'; /** * Custom runner implementation that simulates asynchronous situations. @@ -52,7 +52,7 @@ let auditPostfix = const pluginSlug = 'progress-mock-plugin-' + pluginPostfix; const auditSlug = pluginSlug + '-a' + auditPostfix; const auditTitle = 'Async Audit ' + auditPostfix; -const outputFile = './' + join(outputDir, `${pluginSlug}-output.json`); +const outputFile = './' + path.join(outputDir, `${pluginSlug}-output.json`); (async () => { if (verbose) { diff --git a/testing/test-utils/src/lib/utils/report.mock.ts b/testing/test-utils/src/lib/utils/report.mock.ts index bad186816..3b2020ee6 100644 --- a/testing/test-utils/src/lib/utils/report.mock.ts +++ b/testing/test-utils/src/lib/utils/report.mock.ts @@ -1,9 +1,9 @@ import type { PluginConfig, PluginReport, Report } from '@code-pushup/models'; -import { COMMIT_MOCK } from './commit.mock'; +import { COMMIT_MOCK } from './commit.mock.js'; import { auditReportMock, pluginConfigMock, -} from './dynamic-mocks/plugin-config.mock'; +} from './dynamic-mocks/plugin-config.mock.js'; export const MINIMAL_REPORT_MOCK: Report = { packageName: '@code-pushup/core', diff --git a/testing/test-utils/vite.config.unit.ts b/testing/test-utils/vite.config.unit.ts index 33123b7a0..8d5f0328f 100644 --- a/testing/test-utils/vite.config.unit.ts +++ b/testing/test-utils/vite.config.unit.ts @@ -1,6 +1,6 @@ /// import { defineConfig } from 'vite'; -import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases'; +import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js'; export default defineConfig({ cacheDir: '../node_modules/.vite/test-utils', diff --git a/tools/.eslintrc.json b/tools/.eslintrc.json deleted file mode 100644 index 9ff670eba..000000000 --- a/tools/.eslintrc.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../.eslintrc.json", - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": "*.ts", - "parserOptions": { - "project": ["tools/tsconfig.tools.json"] - }, - "rules": { - "@nx/enforce-module-boundaries": "off" - } - } - ] -} diff --git a/tools/eslint.config.js b/tools/eslint.config.js new file mode 100644 index 000000000..2ac01fcbb --- /dev/null +++ b/tools/eslint.config.js @@ -0,0 +1,12 @@ +import tseslint from 'typescript-eslint'; +import baseConfig from '../eslint.config.js'; + +export default tseslint.config(...baseConfig, { + files: ['**/*.ts'], + parserOptions: { + project: ['tools/tsconfig.tools.json'], + }, + rules: { + '@nx/enforce-module-boundaries': 'off', + }, +}); diff --git a/tools/src/debug/bin/clean-npmrc.ts b/tools/src/debug/bin/clean-npmrc.ts index 1f9d9f30f..476c42818 100644 --- a/tools/src/debug/bin/clean-npmrc.ts +++ b/tools/src/debug/bin/clean-npmrc.ts @@ -1,7 +1,7 @@ import yargs, { type Options } from 'yargs'; import { hideBin } from 'yargs/helpers'; -import { cleanNpmrc } from '../utils'; -import type { CleanNpmrcBinOptions } from './types'; +import { cleanNpmrc } from '../utils.js'; +import type { CleanNpmrcBinOptions } from './types.js'; const argv = yargs(hideBin(process.argv)) .version(false) diff --git a/tools/src/debug/bin/kill-process.ts b/tools/src/debug/bin/kill-process.ts index 51a9f5b9b..8884e0dd5 100644 --- a/tools/src/debug/bin/kill-process.ts +++ b/tools/src/debug/bin/kill-process.ts @@ -1,7 +1,7 @@ import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; -import { type PID, killProcesses } from '../utils'; -import type { KillProcessesBinOptions } from './types'; +import { type PID, killProcesses } from '../utils.js'; +import type { KillProcessesBinOptions } from './types.js'; const { commandMatch, pid, verbose, force } = yargs(hideBin(process.argv)) .version(false) diff --git a/tools/src/debug/bin/list-process.ts b/tools/src/debug/bin/list-process.ts index b2c7a8c62..e54895d46 100644 --- a/tools/src/debug/bin/list-process.ts +++ b/tools/src/debug/bin/list-process.ts @@ -1,7 +1,7 @@ import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; -import { type PID, listProcess } from '../utils'; -import type { ListProcessesBinOptions } from './types'; +import { type PID, listProcess } from '../utils.js'; +import type { ListProcessesBinOptions } from './types.js'; const { commandMatch, pid, verbose, slice } = yargs(hideBin(process.argv)) .version(false) diff --git a/tools/src/debug/bin/types.ts b/tools/src/debug/bin/types.ts index cd8964eb3..a0fa9a131 100644 --- a/tools/src/debug/bin/types.ts +++ b/tools/src/debug/bin/types.ts @@ -1,5 +1,5 @@ // options for `bin/list-processes` -import type { CleanNpmrcOptions, ProcessListOption } from '../utils'; +import type { CleanNpmrcOptions, ProcessListOption } from '../utils.js'; export type ListProcessesBinOptions = ProcessListOption & { slice?: number; diff --git a/tools/src/debug/debug.plugin.ts b/tools/src/debug/debug.plugin.ts index 34c302aac..f1a6f307b 100644 --- a/tools/src/debug/debug.plugin.ts +++ b/tools/src/debug/debug.plugin.ts @@ -1,8 +1,8 @@ import type { CreateNodes, CreateNodesContext } from '@nx/devkit'; import { dirname } from 'node:path'; -import { objectToCliArgs } from '../../../packages/nx-plugin/src/executors/internal/cli'; -import { TOOLS_TSCONFIG_PATH } from '../constants'; -import { KILL_PROCESS_BIN, LIST_PROCESS_BIN } from './constants'; +import { objectToCliArgs } from '../../../packages/nx-plugin/src/executors/internal/cli.js'; +import { TOOLS_TSCONFIG_PATH } from '../constants.js'; +import { KILL_PROCESS_BIN, LIST_PROCESS_BIN } from './constants.js'; type CreateNodesOptions = { tsconfig?: string; diff --git a/tools/src/debug/utils.ts b/tools/src/debug/utils.ts index 37d637d78..9e258024d 100644 --- a/tools/src/debug/utils.ts +++ b/tools/src/debug/utils.ts @@ -1,6 +1,6 @@ import { execSync } from 'node:child_process'; import { readFile, writeFile } from 'node:fs/promises'; -import { join } from 'node:path'; +import path from 'node:path'; import * as os from 'os'; export type PID = string | number; @@ -77,7 +77,7 @@ export function listProcess({ pid, commandMatch }: ProcessListOption = {}): { pid, command: command .replace(process.cwd(), '.') - .replace(`node ./${join('node_modules', '.bin')}/`, ''), + .replace(`node ./${path.join('node_modules', '.bin')}/`, ''), })) .filter(({ pid, command }) => { if (pids.length === 0 && commands.length === 0) { diff --git a/tsconfig.base.json b/tsconfig.base.json index 43abca772..d088eca5a 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -9,7 +9,7 @@ "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, - "importHelpers": true, + "importHelpers": false, "target": "es2022", "module": "esnext", "lib": ["es2023", "dom"],