From 894f155af687f54447eb78066bbcc71cc0d5a695 Mon Sep 17 00:00:00 2001 From: mysteryven Date: Sun, 1 Jan 2023 22:37:50 +0800 Subject: [PATCH 01/17] fix(cli): allow overrides reporter via cli option (#2573) Co-authored-by: Vladimir fix https://github.com/vitest-dev/vitest/issues/2537 --- packages/vitest/src/node/config.ts | 8 +++----- test/reporters/tests/custom-reporter.spec.ts | 6 ++++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index cc57f4153a37..882299efd112 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -198,11 +198,9 @@ export function resolveConfig( resolved.related = toArray(options.related).map(file => resolve(resolved.root, file)) if (mode !== 'benchmark') { - resolved.reporters = Array.from(new Set([ - ...toArray(resolved.reporters), - // @ts-expect-error from CLI - ...toArray(resolved.reporter), - ])).filter(Boolean) + // @ts-expect-error from CLI + const reporters = resolved.reporter ?? resolved.reporters + resolved.reporters = Array.from(new Set(toArray(reporters))).filter(Boolean) } if (!resolved.reporters.length) diff --git a/test/reporters/tests/custom-reporter.spec.ts b/test/reporters/tests/custom-reporter.spec.ts index 9524bf911726..e3598aa361b5 100644 --- a/test/reporters/tests/custom-reporter.spec.ts +++ b/test/reporters/tests/custom-reporter.spec.ts @@ -71,4 +71,10 @@ describe.concurrent('custom reporters', () => { const stdout = await runWithRetry('--config', 'without-custom-reporter.vitest.config.ts', '--reporter', customJSReporterPath) expect(stdout).includes('hello from custom reporter') }, TIMEOUT) + + test('overrides reporters by given a CLI argument --reporter works', async () => { + const stdout = await runWithRetry('--config', 'deps-reporter.vitest.config.ts', '--reporter', customJSReporterPath) + expect(stdout).not.includes('hello from package reporter') + expect(stdout).includes('hello from custom reporter') + }, TIMEOUT) }) From e641a110d0ed82d707a82fd215d9598b0f8afaba Mon Sep 17 00:00:00 2001 From: Vladimir Date: Sun, 1 Jan 2023 16:10:17 +0100 Subject: [PATCH 02/17] feat!: deprecate "error" on result, store errors in "errors" (#2586) --- .../ui/client/components/views/ViewEditor.vue | 57 +++++----- .../client/components/views/ViewReport.cy.tsx | 21 ++-- .../ui/client/components/views/ViewReport.vue | 101 +++++++----------- .../components/views/ViewReportError.vue | 56 ++++++++++ packages/vitest/src/api/setup.ts | 4 + packages/vitest/src/node/reporters/base.ts | 19 ++-- packages/vitest/src/node/reporters/json.ts | 8 +- packages/vitest/src/node/reporters/junit.ts | 23 ++-- packages/vitest/src/node/reporters/tap.ts | 31 +++--- packages/vitest/src/node/reporters/verbose.ts | 7 +- packages/vitest/src/runtime/collect.ts | 4 +- packages/vitest/src/runtime/run.ts | 30 ++++-- packages/vitest/src/types/tasks.ts | 4 + packages/vitest/src/utils/tasks.ts | 3 +- test/reporters/src/data-for-junit.ts | 1 + test/reporters/src/data.ts | 1 + .../tests/__snapshots__/html.test.ts.snap | 16 +++ test/reporters/tests/html.test.ts | 3 + 18 files changed, 242 insertions(+), 147 deletions(-) create mode 100644 packages/ui/client/components/views/ViewReportError.vue diff --git a/packages/ui/client/components/views/ViewEditor.vue b/packages/ui/client/components/views/ViewEditor.vue index 963d00c865ad..369393ec22f8 100644 --- a/packages/ui/client/components/views/ViewEditor.vue +++ b/packages/ui/client/components/views/ViewEditor.vue @@ -4,7 +4,7 @@ import type CodeMirror from 'codemirror' import { createTooltip, destroyTooltip } from 'floating-vue' import { openInEditor } from '../../composables/error' import { client } from '~/composables/client' -import type { File } from '#types' +import type { ErrorWithDiff, File, ParsedStack } from '#types' const props = defineProps<{ file?: File @@ -60,6 +60,34 @@ watch(draft, (d) => { emit('draft', d) }, { immediate: true }) +function createErrorElement(e: ErrorWithDiff) { + const stacks = (e?.stacks || []).filter(i => i.file && i.file === props.file?.filepath) + const stack = stacks?.[0] + if (!stack) + return + const div = document.createElement('div') + div.className = 'op80 flex gap-x-2 items-center' + const pre = document.createElement('pre') + pre.className = 'c-red-600 dark:c-red-400' + pre.textContent = `${' '.repeat(stack.column)}^ ${e?.nameStr}: ${e?.message}` + div.appendChild(pre) + const span = document.createElement('span') + span.className = 'i-carbon-launch c-red-600 dark:c-red-400 hover:cursor-pointer min-w-1em min-h-1em' + span.tabIndex = 0 + span.ariaLabel = 'Open in Editor' + const tooltip = createTooltip(span, { + content: 'Open in Editor', + placement: 'bottom', + }, false) + const el: EventListener = async () => { + await openInEditor(stack.file, stack.line, stack.column) + } + div.appendChild(span) + listeners.push([span, el, () => destroyTooltip(span)]) + handles.push(cm.value!.addLineClass(stack.line - 1, 'wrap', 'bg-red-500/10')) + widgets.push(cm.value!.addLineWidget(stack.line - 1, div)) +} + watch([cm, failed], ([cmValue]) => { if (!cmValue) { clearListeners() @@ -76,32 +104,7 @@ watch([cm, failed], ([cmValue]) => { cmValue.on('changes', codemirrorChanges) failed.value.forEach((i) => { - const e = i.result?.error - const stacks = (e?.stacks || []).filter(i => i.file && i.file === props.file?.filepath) - if (stacks.length) { - const stack = stacks[0] - const div = document.createElement('div') - div.className = 'op80 flex gap-x-2 items-center' - const pre = document.createElement('pre') - pre.className = 'c-red-600 dark:c-red-400' - pre.textContent = `${' '.repeat(stack.column)}^ ${e?.nameStr}: ${e?.message}` - div.appendChild(pre) - const span = document.createElement('span') - span.className = 'i-carbon-launch c-red-600 dark:c-red-400 hover:cursor-pointer min-w-1em min-h-1em' - span.tabIndex = 0 - span.ariaLabel = 'Open in Editor' - const tooltip = createTooltip(span, { - content: 'Open in Editor', - placement: 'bottom', - }, false) - const el: EventListener = async () => { - await openInEditor(stacks[0].file, stack.line, stack.column) - } - div.appendChild(span) - listeners.push([span, el, () => destroyTooltip(span)]) - handles.push(cm.value!.addLineClass(stack.line - 1, 'wrap', 'bg-red-500/10')) - widgets.push(cm.value!.addLineWidget(stack.line - 1, div)) - } + i.result?.errors?.forEach(createErrorElement) }) if (!hasBeenEdited.value) cmValue.clearHistory() // Prevent getting access to initial state diff --git a/packages/ui/client/components/views/ViewReport.cy.tsx b/packages/ui/client/components/views/ViewReport.cy.tsx index 7e87687ea8e5..25c967c5c2af 100644 --- a/packages/ui/client/components/views/ViewReport.cy.tsx +++ b/packages/ui/client/components/views/ViewReport.cy.tsx @@ -17,6 +17,12 @@ const makeTextStack = () => ({ // 5 Stacks const textStacks = Array.from(new Array(5)).map(makeTextStack) +const error = { + name: 'Do some test', + stacks: textStacks, + message: 'Error: Transform failed with 1 error:', +} + const fileWithTextStacks = { id: 'f-1', name: 'test/plain-stack-trace.ts', @@ -25,11 +31,8 @@ const fileWithTextStacks = { filepath: 'test/plain-stack-trace.ts', result: { state: 'fail', - error: { - name: 'Do some test', - stacks: textStacks, - message: 'Error: Transform failed with 1 error:', - }, + error, + errors: [error], }, tasks: [], } @@ -67,11 +70,11 @@ describe('ViewReport', () => { filepath: 'test/plain-stack-trace.ts', result: { state: 'fail', - error: { + errors: [{ name: 'Do some test', stack: '\x1B[33mtest/plain-stack-trace.ts\x1B[0m', message: 'Error: Transform failed with 1 error:', - }, + }], }, tasks: [], } @@ -104,11 +107,11 @@ describe('ViewReport', () => { filepath: 'test/plain-stack-trace.ts', result: { state: 'fail', - error: { + errors: [{ name: 'Do some test', stack: '\x1B[33mtest/plain-stack-trace.ts\x1B[0m', message: '\x1B[44mError: Transform failed with 1 error:\x1B[0m', - }, + }], }, tasks: [], } diff --git a/packages/ui/client/components/views/ViewReport.vue b/packages/ui/client/components/views/ViewReport.vue index f7169ed37fc1..ebd8a97cc470 100644 --- a/packages/ui/client/components/views/ViewReport.vue +++ b/packages/ui/client/components/views/ViewReport.vue @@ -1,10 +1,10 @@ diff --git a/packages/ui/client/components/views/ViewReportError.vue b/packages/ui/client/components/views/ViewReportError.vue new file mode 100644 index 000000000000..9ba393572392 --- /dev/null +++ b/packages/ui/client/components/views/ViewReportError.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/packages/vitest/src/api/setup.ts b/packages/vitest/src/api/setup.ts index a385164b6ce2..aed3de53b9ed 100644 --- a/packages/vitest/src/api/setup.ts +++ b/packages/vitest/src/api/setup.ts @@ -124,8 +124,12 @@ class WebSocketReporter implements Reporter { return packs.forEach(([, result]) => { + // TODO remove after "error" deprecation is removed if (result?.error) result.error.stacks = parseStacktrace(result.error) + result?.errors?.forEach((error) => { + error.stacks = parseStacktrace(error) + }) }) this.clients.forEach((client) => { diff --git a/packages/vitest/src/node/reporters/base.ts b/packages/vitest/src/node/reporters/base.ts index dc0147da89d6..b951de4c2b62 100644 --- a/packages/vitest/src/node/reporters/base.ts +++ b/packages/vitest/src/node/reporters/base.ts @@ -85,7 +85,9 @@ export abstract class BaseReporter implements Reporter { // print short errors, full errors will be at the end in summary for (const test of failed) { logger.log(c.red(` ${pointer} ${getFullName(test)}`)) - logger.log(c.red(` ${F_RIGHT} ${(test.result!.error as any)?.message}`)) + test.result?.errors?.forEach((e) => { + logger.log(c.red(` ${F_RIGHT} ${(e as any)?.message}`)) + }) } } } @@ -258,7 +260,7 @@ export abstract class BaseReporter implements Reporter { const suites = getSuites(files) const tests = getTests(files) - const failedSuites = suites.filter(i => i.result?.error) + const failedSuites = suites.filter(i => i.result?.errors) const failedTests = tests.filter(i => i.result?.state === 'fail') const failedTotal = failedSuites.length + failedTests.length @@ -310,12 +312,13 @@ export abstract class BaseReporter implements Reporter { const errorsQueue: [error: ErrorWithDiff | undefined, tests: Task[]][] = [] for (const task of tasks) { // merge identical errors - const error = task.result?.error - const errorItem = error?.stackStr && errorsQueue.find(i => i[0]?.stackStr === error.stackStr) - if (errorItem) - errorItem[1].push(task) - else - errorsQueue.push([error, [task]]) + task.result?.errors?.forEach((error) => { + const errorItem = error?.stackStr && errorsQueue.find(i => i[0]?.stackStr === error.stackStr) + if (errorItem) + errorItem[1].push(task) + else + errorsQueue.push([error, [task]]) + }) } for (const [error, tasks] of errorsQueue) { for (const task of tasks) { diff --git a/packages/vitest/src/node/reporters/json.ts b/packages/vitest/src/node/reporters/json.ts index 98e9b50f155f..31aa979f37db 100644 --- a/packages/vitest/src/node/reporters/json.ts +++ b/packages/vitest/src/node/reporters/json.ts @@ -76,7 +76,7 @@ export class JsonReporter implements Reporter { const numTotalTestSuites = suites.length const tests = getTests(files) const numTotalTests = tests.length - const numFailedTestSuites = suites.filter(s => s.result?.error).length + const numFailedTestSuites = suites.filter(s => s.result?.errors).length const numPassedTestSuites = numTotalTestSuites - numFailedTestSuites const numPendingTestSuites = suites.filter(s => s.result?.state === 'run').length const numFailedTests = tests.filter(t => t.result?.state === 'fail').length @@ -109,7 +109,7 @@ export class JsonReporter implements Reporter { status: StatusMap[t.result?.state || t.mode] || 'skipped', title: t.name, duration: t.result?.duration, - failureMessages: t.result?.error?.message == null ? [] : [t.result.error.message], + failureMessages: t.result?.errors?.map(e => e.message) || [], location: await this.getFailureLocation(t), } as FormattedAssertionResult })) @@ -128,7 +128,7 @@ export class JsonReporter implements Reporter { t.result?.state === 'fail') ? 'failed' : 'passed', - message: file.result?.error?.message ?? '', + message: file.result?.errors?.[0]?.message ?? '', name: file.filepath, }) } @@ -179,7 +179,7 @@ export class JsonReporter implements Reporter { } protected async getFailureLocation(test: Task): Promise { - const error = test.result?.error + const error = test.result?.errors?.[0] if (!error) return diff --git a/packages/vitest/src/node/reporters/junit.ts b/packages/vitest/src/node/reporters/junit.ts index e66a7625dcc8..79649db18b54 100644 --- a/packages/vitest/src/node/reporters/junit.ts +++ b/packages/vitest/src/node/reporters/junit.ts @@ -167,17 +167,18 @@ export class JUnitReporter implements Reporter { await this.logger.log('') if (task.result?.state === 'fail') { - const error = task.result.error - - await this.writeElement('failure', { - message: error?.message, - type: error?.name ?? error?.nameStr, - }, async () => { - if (!error) - return - - await this.writeErrorDetails(error) - }) + const promises = task.result.errors?.map(async (error) => { + await this.writeElement('failure', { + message: error?.message, + type: error?.name ?? error?.nameStr, + }, async () => { + if (!error) + return + + await this.writeErrorDetails(error) + }) + }) || [] + await Promise.all(promises) } }) } diff --git a/packages/vitest/src/node/reporters/tap.ts b/packages/vitest/src/node/reporters/tap.ts index ea0c27d2bc95..8bf12cdd0ac9 100644 --- a/packages/vitest/src/node/reporters/tap.ts +++ b/packages/vitest/src/node/reporters/tap.ts @@ -66,27 +66,28 @@ export class TapReporter implements Reporter { else { this.logger.log(`${ok} ${id} - ${tapString(task.name)}${comment}`) - if (task.result?.state === 'fail' && task.result.error) { + if (task.result?.state === 'fail' && task.result.errors) { this.logger.indent() - const error = task.result.error - const stacks = parseStacktrace(error) - const stack = stacks[0] + task.result.errors.forEach((error) => { + const stacks = parseStacktrace(error) + const stack = stacks[0] - this.logger.log('---') - this.logger.log('error:') + this.logger.log('---') + this.logger.log('error:') - this.logger.indent() - this.logErrorDetails(error) - this.logger.unindent() + this.logger.indent() + this.logErrorDetails(error) + this.logger.unindent() - if (stack) - this.logger.log(`at: ${yamlString(`${stack.file}:${stack.line}:${stack.column}`)}`) + if (stack) + this.logger.log(`at: ${yamlString(`${stack.file}:${stack.line}:${stack.column}`)}`) - if (error.showDiff) { - this.logger.log(`actual: ${yamlString(error.actual)}`) - this.logger.log(`expected: ${yamlString(error.expected)}`) - } + if (error.showDiff) { + this.logger.log(`actual: ${yamlString(error.actual)}`) + this.logger.log(`expected: ${yamlString(error.expected)}`) + } + }) this.logger.log('...') this.logger.unindent() diff --git a/packages/vitest/src/node/reporters/verbose.ts b/packages/vitest/src/node/reporters/verbose.ts index cd89aefe53ba..4fbd637ea7c4 100644 --- a/packages/vitest/src/node/reporters/verbose.ts +++ b/packages/vitest/src/node/reporters/verbose.ts @@ -21,8 +21,11 @@ export class VerboseReporter extends DefaultReporter { if (this.ctx.config.logHeapUsage && task.result.heap != null) title += c.magenta(` ${Math.floor(task.result.heap / 1024 / 1024)} MB heap used`) this.ctx.logger.log(title) - if (task.result.state === 'fail') - this.ctx.logger.log(c.red(` ${F_RIGHT} ${(task.result.error as any)?.message}`)) + if (task.result.state === 'fail') { + task.result.errors?.forEach((error) => { + this.ctx.logger.log(c.red(` ${F_RIGHT} ${error?.message}`)) + }) + } } } } diff --git a/packages/vitest/src/runtime/collect.ts b/packages/vitest/src/runtime/collect.ts index 1170c898ccd2..c1930e468fb9 100644 --- a/packages/vitest/src/runtime/collect.ts +++ b/packages/vitest/src/runtime/collect.ts @@ -82,9 +82,11 @@ export async function collectTests(paths: string[], config: ResolvedConfig): Pro file.collectDuration = now() - collectStart } catch (e) { + const error = processError(e) file.result = { state: 'fail', - error: processError(e), + error, + errors: [error], } if (config.browser) console.error(e) diff --git a/packages/vitest/src/runtime/run.ts b/packages/vitest/src/runtime/run.ts index abe8d47c6d98..18490bb19a99 100644 --- a/packages/vitest/src/runtime/run.ts +++ b/packages/vitest/src/runtime/run.ts @@ -181,8 +181,10 @@ export async function runTest(test: Test) { test.result.state = 'pass' } catch (e) { + const error = processError(e) test.result.state = 'fail' - test.result.error = processError(e) + test.result.error = error + test.result.errors = [error] } try { @@ -190,8 +192,10 @@ export async function runTest(test: Test) { await callCleanupHooks(beforeEachCleanups) } catch (e) { + const error = processError(e) test.result.state = 'fail' - test.result.error = processError(e) + test.result.error = error + test.result.errors = [error] } if (test.result.state === 'pass') @@ -207,12 +211,15 @@ export async function runTest(test: Test) { // if test is marked to be failed, flip the result if (test.fails) { if (test.result.state === 'pass') { + const error = processError(new Error('Expect test to fail')) test.result.state = 'fail' - test.result.error = processError(new Error('Expect test to fail')) + test.result.error = error + test.result.errors = [error] } else { test.result.state = 'pass' test.result.error = undefined + test.result.errors = undefined } } @@ -302,8 +309,10 @@ export async function runSuite(suite: Suite) { await callCleanupHooks(beforeAllCleanups) } catch (e) { + const error = processError(e) suite.result.state = 'fail' - suite.result.error = processError(e) + suite.result.error = error + suite.result.errors = [error] } } suite.result.duration = now() - start @@ -314,8 +323,11 @@ export async function runSuite(suite: Suite) { if (suite.mode === 'run') { if (!hasTests(suite)) { suite.result.state = 'fail' - if (!suite.result.error) - suite.result.error = new Error(`No test found in suite ${suite.name}`) + if (!suite.result.error) { + const error = processError(new Error(`No test found in suite ${suite.name}`)) + suite.result.error = error + suite.result.errors = [error] + } } else if (hasFailed(suite)) { suite.result.state = 'fail' @@ -446,10 +458,12 @@ async function runSuites(suites: Suite[]) { export async function runFiles(files: File[], config: ResolvedConfig) { for (const file of files) { if (!file.tasks.length && !config.passWithNoTests) { - if (!file.result?.error) { + if (!file.result?.errors?.length) { + const error = processError(new Error(`No test suite found in file ${file.filepath}`)) file.result = { state: 'fail', - error: new Error(`No test suite found in file ${file.filepath}`), + error, + errors: [error], } } } diff --git a/packages/vitest/src/types/tasks.ts b/packages/vitest/src/types/tasks.ts index 15eba941d8f9..18918866565a 100644 --- a/packages/vitest/src/types/tasks.ts +++ b/packages/vitest/src/types/tasks.ts @@ -23,7 +23,11 @@ export interface TaskResult { duration?: number startTime?: number heap?: number + /** + * @deprecated Use "errors" instead + */ error?: ErrorWithDiff + errors?: ErrorWithDiff[] htmlError?: string hooks?: Partial> benchmark?: BenchmarkResult diff --git a/packages/vitest/src/utils/tasks.ts b/packages/vitest/src/utils/tasks.ts index 7384f65acb41..efc1b892caa0 100644 --- a/packages/vitest/src/utils/tasks.ts +++ b/packages/vitest/src/utils/tasks.ts @@ -44,8 +44,7 @@ export function hasFailed(suite: Arrayable): boolean { export function hasFailedSnapshot(suite: Arrayable): boolean { return getTests(suite).some((s) => { - const message = s.result?.error?.message - return message?.match(/Snapshot .* mismatched/) + return s.result?.errors?.some(e => e.message.match(/Snapshot .* mismatched/)) }) } diff --git a/test/reporters/src/data-for-junit.ts b/test/reporters/src/data-for-junit.ts index 2de698824f14..0d6e667c8839 100644 --- a/test/reporters/src/data-for-junit.ts +++ b/test/reporters/src/data-for-junit.ts @@ -42,6 +42,7 @@ function createSuiteHavingFailedTestWithXmlInError(): File[] { result: { state: 'fail', error: errorWithXml, + errors: [errorWithXml], duration: 2.123123123, }, context: null as any, diff --git a/test/reporters/src/data.ts b/test/reporters/src/data.ts index 25210a66a455..fcde6ed4cd05 100644 --- a/test/reporters/src/data.ts +++ b/test/reporters/src/data.ts @@ -63,6 +63,7 @@ const innerTasks: Task[] = [ result: { state: 'fail', error, + errors: [error], duration: 1.4422860145568848, }, context: null as any, diff --git a/test/reporters/tests/__snapshots__/html.test.ts.snap b/test/reporters/tests/__snapshots__/html.test.ts.snap index b243bdff112b..e5772658ef16 100644 --- a/test/reporters/tests/__snapshots__/html.test.ts.snap +++ b/test/reporters/tests/__snapshots__/html.test.ts.snap @@ -52,6 +52,22 @@ exports[`html reporter > resolves to "failing" status for test file "json-fail" "toJSON": "Function", "toString": "Function", }, + "errors": [ + { + "actual": "2", + "constructor": "Function", + "expected": "1", + "message": "expected 2 to deeply equal 1", + "name": "AssertionError", + "nameStr": "AssertionError", + "operator": "strictEqual", + "showDiff": true, + "stack": "AssertionError: expected 2 to deeply equal 1", + "stackStr": "AssertionError: expected 2 to deeply equal 1", + "toJSON": "Function", + "toString": "Function", + }, + ], "hooks": { "afterEach": "pass", "beforeEach": "pass", diff --git a/test/reporters/tests/html.test.ts b/test/reporters/tests/html.test.ts index dbc98ccaa115..bab25eb8f1c0 100644 --- a/test/reporters/tests/html.test.ts +++ b/test/reporters/tests/html.test.ts @@ -67,8 +67,11 @@ describe.skipIf(skip)('html reporter', async () => { task.result.duration = 0 task.result.startTime = 0 expect(task.result.error).toBeDefined() + expect(task.result.errors).toBeDefined() task.result.error.stack = task.result.error.stack.split('\n')[0] + task.result.errors[0].stack = task.result.errors[0].stack.split('\n')[0] task.result.error.stackStr = task.result.error.stackStr.split('\n')[0] + task.result.errors[0].stackStr = task.result.errors[0].stackStr.split('\n')[0] expect(task.logs).toBeDefined() expect(task.logs).toHaveLength(1) task.logs[0].taskId = 0 From c8e6fb69308d1356bc5ef27aad83c3005a5696e4 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 2 Jan 2023 10:37:37 +0100 Subject: [PATCH 03/17] feat!: split vitest into separate packages (#2575) --- packages/expect/README.md | 17 + packages/expect/package.json | 37 +++ packages/expect/rollup.config.js | 51 +++ .../chai => expect/src}/constants.ts | 2 +- packages/expect/src/index.ts | 7 + .../src}/jest-asymmetric-matchers.ts | 4 +- .../chai => expect/src}/jest-expect.ts | 61 +--- .../chai => expect/src}/jest-extend.ts | 6 +- .../chai => expect/src}/jest-matcher-utils.ts | 62 +--- .../chai => expect/src}/jest-utils.ts | 5 +- packages/expect/src/state.ts | 30 ++ packages/expect/src/types.ts | 95 ++++++ packages/spy/README.md | 3 + packages/spy/package.json | 34 ++ packages/spy/rollup.config.js | 51 +++ packages/spy/src/index.ts | 295 +++++++++++++++++ packages/utils/package.json | 48 +++ packages/utils/rollup.config.js | 64 ++++ packages/utils/src/diff.ts | 128 ++++++++ packages/utils/src/helpers.ts | 10 + packages/utils/src/index.ts | 4 + packages/utils/src/stringify.ts | 49 +++ packages/utils/src/types.ts | 25 ++ packages/vitest/LICENSE.md | 4 +- packages/vitest/package.json | 3 + packages/vitest/rollup.config.js | 1 + .../vitest/src/integrations/chai/index.ts | 18 +- .../vitest/src/integrations/chai/setup.ts | 4 +- .../vitest/src/integrations/snapshot/chai.ts | 8 +- .../src/integrations/snapshot/client.ts | 2 +- packages/vitest/src/integrations/spy.ts | 296 +----------------- packages/vitest/src/node/error.ts | 2 +- packages/vitest/src/runtime/error.ts | 2 +- packages/vitest/src/runtime/run.ts | 8 +- packages/vitest/src/types/chai.ts | 59 +--- packages/vitest/src/types/global.ts | 3 +- pnpm-lock.yaml | 52 ++- test/core/test/diff.test.ts | 2 +- test/core/test/file-path.test.ts | 2 +- test/core/test/imports.test.ts | 2 +- test/core/test/jest-expect.test.ts | 2 +- test/core/test/local-context.test.ts | 9 +- test/core/vitest.config.ts | 3 +- tsconfig.json | 4 + 44 files changed, 1065 insertions(+), 509 deletions(-) create mode 100644 packages/expect/README.md create mode 100644 packages/expect/package.json create mode 100644 packages/expect/rollup.config.js rename packages/{vitest/src/integrations/chai => expect/src}/constants.ts (100%) create mode 100644 packages/expect/src/index.ts rename packages/{vitest/src/integrations/chai => expect/src}/jest-asymmetric-matchers.ts (98%) rename packages/{vitest/src/integrations/chai => expect/src}/jest-expect.ts (92%) rename packages/{vitest/src/integrations/chai => expect/src}/jest-extend.ts (95%) rename packages/{vitest/src/integrations/chai => expect/src}/jest-matcher-utils.ts (65%) rename packages/{vitest/src/integrations/chai => expect/src}/jest-utils.ts (99%) create mode 100644 packages/expect/src/state.ts create mode 100644 packages/expect/src/types.ts create mode 100644 packages/spy/README.md create mode 100644 packages/spy/package.json create mode 100644 packages/spy/rollup.config.js create mode 100644 packages/spy/src/index.ts create mode 100644 packages/utils/package.json create mode 100644 packages/utils/rollup.config.js create mode 100644 packages/utils/src/diff.ts create mode 100644 packages/utils/src/helpers.ts create mode 100644 packages/utils/src/index.ts create mode 100644 packages/utils/src/stringify.ts create mode 100644 packages/utils/src/types.ts diff --git a/packages/expect/README.md b/packages/expect/README.md new file mode 100644 index 000000000000..da5d16d8cd42 --- /dev/null +++ b/packages/expect/README.md @@ -0,0 +1,17 @@ +# @vitest/expect + +Jest's expect matchers as a Chai plugin. + +## Usage + +```js +import * as chai from 'chai' +import { JestAsymmetricMatchers, JestChaiExpect, JestExtend } from '@vitest/expect' + +// allows using expect.extend instead of chai.use to extend plugins +chai.use(JestExtend) +// adds all jest matchers to expect +chai.use(JestChaiExpect) +// adds asymmetric matchers like stringContaining, objectContaining +chai.use(JestAsymmetricMatchers) +``` diff --git a/packages/expect/package.json b/packages/expect/package.json new file mode 100644 index 000000000000..9e28a90d4cea --- /dev/null +++ b/packages/expect/package.json @@ -0,0 +1,37 @@ +{ + "name": "@vitest/expect", + "type": "module", + "version": "0.26.2", + "description": "Jest's expect matchers as a Chai plugin", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/vitest-dev/vitest.git", + "directory": "packages/expect" + }, + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./*": "./*" + }, + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "rimraf dist && rollup -c", + "dev": "rollup -c --watch", + "prepublishOnly": "pnpm build" + }, + "dependencies": { + "@vitest/spy": "workspace:*", + "@vitest/utils": "workspace:*", + "chai": "^4.3.7", + "picocolors": "^1.0.0" + } +} diff --git a/packages/expect/rollup.config.js b/packages/expect/rollup.config.js new file mode 100644 index 000000000000..fddfda5974ce --- /dev/null +++ b/packages/expect/rollup.config.js @@ -0,0 +1,51 @@ +import { builtinModules } from 'module' +import esbuild from 'rollup-plugin-esbuild' +import dts from 'rollup-plugin-dts' +import { defineConfig } from 'rollup' +import pkg from './package.json' + +const external = [ + ...builtinModules, + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.peerDependencies || {}), +] + +const plugins = [ + esbuild({ + target: 'node14', + }), +] + +export default defineConfig([ + { + input: 'src/index.ts', + output: { + dir: 'dist', + format: 'esm', + entryFileNames: '[name].js', + chunkFileNames: 'chunk-[name].js', + }, + external, + plugins, + onwarn, + }, + { + input: 'src/index.ts', + output: { + dir: 'dist', + entryFileNames: '[name].d.ts', + format: 'esm', + }, + external, + plugins: [ + dts({ respectExternal: true }), + ], + onwarn, + }, +]) + +function onwarn(message) { + if (['EMPTY_BUNDLE', 'CIRCULAR_DEPENDENCY'].includes(message.code)) + return + console.error(message) +} diff --git a/packages/vitest/src/integrations/chai/constants.ts b/packages/expect/src/constants.ts similarity index 100% rename from packages/vitest/src/integrations/chai/constants.ts rename to packages/expect/src/constants.ts index 24fa9ad16e06..97a47089fd1a 100644 --- a/packages/vitest/src/integrations/chai/constants.ts +++ b/packages/expect/src/constants.ts @@ -1,3 +1,3 @@ -export const GLOBAL_EXPECT = Symbol.for('expect-global') export const MATCHERS_OBJECT = Symbol.for('matchers-object') export const JEST_MATCHERS_OBJECT = Symbol.for('$$jest-matchers-object') +export const GLOBAL_EXPECT = Symbol.for('expect-global') diff --git a/packages/expect/src/index.ts b/packages/expect/src/index.ts new file mode 100644 index 000000000000..e472669a1e1e --- /dev/null +++ b/packages/expect/src/index.ts @@ -0,0 +1,7 @@ +export * from './jest-asymmetric-matchers' +export * from './jest-utils' +export * from './constants' +export * from './types' +export { getState, setState } from './state' +export { JestChaiExpect } from './jest-expect' +export { JestExtend } from './jest-extend' diff --git a/packages/vitest/src/integrations/chai/jest-asymmetric-matchers.ts b/packages/expect/src/jest-asymmetric-matchers.ts similarity index 98% rename from packages/vitest/src/integrations/chai/jest-asymmetric-matchers.ts rename to packages/expect/src/jest-asymmetric-matchers.ts index a4a895e0c45f..8f8f2cf32104 100644 --- a/packages/vitest/src/integrations/chai/jest-asymmetric-matchers.ts +++ b/packages/expect/src/jest-asymmetric-matchers.ts @@ -1,6 +1,6 @@ -import type { ChaiPlugin, MatcherState } from '../../types/chai' +import type { ChaiPlugin, MatcherState } from './types' import { GLOBAL_EXPECT } from './constants' -import { getState } from './jest-expect' +import { getState } from './state' import * as matcherUtils from './jest-matcher-utils' import { equals, isA } from './jest-utils' diff --git a/packages/vitest/src/integrations/chai/jest-expect.ts b/packages/expect/src/jest-expect.ts similarity index 92% rename from packages/vitest/src/integrations/chai/jest-expect.ts rename to packages/expect/src/jest-expect.ts index 3c703654755e..ed6f0af3d2fe 100644 --- a/packages/vitest/src/integrations/chai/jest-expect.ts +++ b/packages/expect/src/jest-expect.ts @@ -1,44 +1,14 @@ import c from 'picocolors' import { AssertionError } from 'chai' -import type { EnhancedSpy } from '../spy' -import { isMockFunction } from '../spy' -import { addSerializer } from '../snapshot/port/plugins' -import type { Constructable, Test } from '../../types' -import { assertTypes } from '../../utils' -import { unifiedDiff } from '../../utils/diff' -import type { ChaiPlugin, MatcherState } from '../../types/chai' +import { assertTypes, unifiedDiff } from '@vitest/utils' +import type { Constructable } from '@vitest/utils' +import type { EnhancedSpy } from '@vitest/spy' +import { isMockFunction } from '@vitest/spy' +import type { ChaiPlugin } from './types' import { arrayBufferEquality, generateToBeMessage, iterableEquality, equals as jestEquals, sparseArrayEquality, subsetEquality, typeEquality } from './jest-utils' import type { AsymmetricMatcher } from './jest-asymmetric-matchers' import { stringify } from './jest-matcher-utils' -import { GLOBAL_EXPECT, JEST_MATCHERS_OBJECT, MATCHERS_OBJECT } from './constants' - -if (!Object.prototype.hasOwnProperty.call(globalThis, MATCHERS_OBJECT)) { - const globalState = new WeakMap() - const matchers = Object.create(null) - Object.defineProperty(globalThis, MATCHERS_OBJECT, { - get: () => globalState, - }) - Object.defineProperty(globalThis, JEST_MATCHERS_OBJECT, { - configurable: true, - get: () => ({ - state: globalState.get((globalThis as any)[GLOBAL_EXPECT]), - matchers, - }), - }) -} - -export const getState = (expect: Vi.ExpectStatic): State => - (globalThis as any)[MATCHERS_OBJECT].get(expect) - -export const setState = ( - state: Partial, - expect: Vi.ExpectStatic, -): void => { - const map = (globalThis as any)[MATCHERS_OBJECT] - const current = map.get(expect) || {} - Object.assign(current, state) - map.set(expect, current) -} +import { JEST_MATCHERS_OBJECT } from './constants' // Jest Expect Compact export const JestChaiExpect: ChaiPlugin = (chai, utils) => { @@ -681,7 +651,7 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { return result.call(this, ...args) }, (err: any) => { - throw new Error(`promise rejected "${toString(err)}" instead of resolving`) + throw new Error(`promise rejected "${String(err)}" instead of resolving`) }, ) } @@ -710,7 +680,7 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { return async (...args: any[]) => { return wrapper.then( (value: any) => { - throw new Error(`promise resolved "${toString(value)}" instead of rejecting`) + throw new Error(`promise resolved "${String(value)}" instead of rejecting`) }, (err: any) => { utils.flag(this, 'object', err) @@ -723,19 +693,4 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { return proxy }) - - utils.addMethod( - chai.expect, - 'addSnapshotSerializer', - addSerializer, - ) -} - -function toString(value: any) { - try { - return `${value}` - } - catch (_error) { - return 'unknown' - } } diff --git a/packages/vitest/src/integrations/chai/jest-extend.ts b/packages/expect/src/jest-extend.ts similarity index 95% rename from packages/vitest/src/integrations/chai/jest-extend.ts rename to packages/expect/src/jest-extend.ts index bbe0b0eafd85..0c2e2608c733 100644 --- a/packages/vitest/src/integrations/chai/jest-extend.ts +++ b/packages/expect/src/jest-extend.ts @@ -4,11 +4,10 @@ import type { MatcherState, MatchersObject, SyncExpectationResult, -} from '../../types/chai' -import { getSnapshotClient } from '../snapshot/chai' +} from './types' import { JEST_MATCHERS_OBJECT } from './constants' import { AsymmetricMatcher } from './jest-asymmetric-matchers' -import { getState } from './jest-expect' +import { getState } from './state' import * as matcherUtils from './jest-matcher-utils' @@ -39,7 +38,6 @@ const getMatcherState = (assertion: Chai.AssertionStatic & Chai.Assertion, expec equals, // needed for built-in jest-snapshots, but we don't use it suppressedErrors: [], - snapshotState: getSnapshotClient().snapshotState!, } return { diff --git a/packages/vitest/src/integrations/chai/jest-matcher-utils.ts b/packages/expect/src/jest-matcher-utils.ts similarity index 65% rename from packages/vitest/src/integrations/chai/jest-matcher-utils.ts rename to packages/expect/src/jest-matcher-utils.ts index 48b358aa173e..21902c5c2d0b 100644 --- a/packages/vitest/src/integrations/chai/jest-matcher-utils.ts +++ b/packages/expect/src/jest-matcher-utils.ts @@ -1,11 +1,8 @@ -// we are using only the ones needed by @testing-library/jest-dom -// if you need more, just ask - import c from 'picocolors' -import type { PrettyFormatOptions } from 'pretty-format' -import { format as prettyFormat, plugins as prettyFormatPlugins } from 'pretty-format' -import { unifiedDiff } from '../../utils/diff' -import type { DiffOptions, MatcherHintOptions } from '../../types/matcher-utils' +import { stringify, unifiedDiff } from '@vitest/utils' +import type { DiffOptions, MatcherHintOptions } from './types' + +export { stringify } export const EXPECTED_COLOR = c.green export const RECEIVED_COLOR = c.red @@ -13,24 +10,6 @@ export const INVERTED_COLOR = c.inverse export const BOLD_WEIGHT = c.bold export const DIM_COLOR = c.dim -const { - AsymmetricMatcher, - DOMCollection, - DOMElement, - Immutable, - ReactElement, - ReactTestComponent, -} = prettyFormatPlugins - -const PLUGINS = [ - ReactTestComponent, - ReactElement, - DOMElement, - DOMCollection, - Immutable, - AsymmetricMatcher, -] - export function matcherHint( matcherName: string, received = 'received', @@ -39,12 +18,12 @@ export function matcherHint( ) { const { comment = '', - expectedColor = EXPECTED_COLOR, isDirectExpectCall = false, // seems redundant with received === '' isNot = false, promise = '', - receivedColor = RECEIVED_COLOR, secondArgument = '', + expectedColor = EXPECTED_COLOR, + receivedColor = RECEIVED_COLOR, secondArgumentColor = EXPECTED_COLOR, } = options let hint = '' @@ -102,35 +81,6 @@ const SPACE_SYMBOL = '\u{00B7}' // middle dot const replaceTrailingSpaces = (text: string): string => text.replace(/\s+$/gm, spaces => SPACE_SYMBOL.repeat(spaces.length)) -export function stringify(object: unknown, maxDepth = 10, { maxLength, ...options }: PrettyFormatOptions & { maxLength?: number } = {}): string { - const MAX_LENGTH = maxLength ?? 10000 - let result - - try { - result = prettyFormat(object, { - maxDepth, - escapeString: false, - // min: true, - plugins: PLUGINS, - ...options, - }) - } - catch { - result = prettyFormat(object, { - callToJSON: false, - maxDepth, - escapeString: false, - // min: true, - plugins: PLUGINS, - ...options, - }) - } - - return result.length >= MAX_LENGTH && maxDepth > 1 - ? stringify(object, Math.floor(maxDepth / 2)) - : result -} - export const printReceived = (object: unknown): string => RECEIVED_COLOR(replaceTrailingSpaces(stringify(object))) export const printExpected = (value: unknown): string => diff --git a/packages/vitest/src/integrations/chai/jest-utils.ts b/packages/expect/src/jest-utils.ts similarity index 99% rename from packages/vitest/src/integrations/chai/jest-utils.ts rename to packages/expect/src/jest-utils.ts index 23f0046278c9..6dc0d593a2ff 100644 --- a/packages/vitest/src/integrations/chai/jest-utils.ts +++ b/packages/expect/src/jest-utils.ts @@ -21,8 +21,9 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { isObject } from '../../utils' -import type { Tester } from '../../types/chai' + +import { isObject } from '@vitest/utils' +import type { Tester } from './types' // Extracted out of jasmine 2.5.2 export function equals( diff --git a/packages/expect/src/state.ts b/packages/expect/src/state.ts new file mode 100644 index 000000000000..aaa0f4301b58 --- /dev/null +++ b/packages/expect/src/state.ts @@ -0,0 +1,30 @@ +import type { MatcherState } from './types' +import { GLOBAL_EXPECT, JEST_MATCHERS_OBJECT, MATCHERS_OBJECT } from './constants' + +if (!Object.prototype.hasOwnProperty.call(globalThis, MATCHERS_OBJECT)) { + const globalState = new WeakMap() + const matchers = Object.create(null) + Object.defineProperty(globalThis, MATCHERS_OBJECT, { + get: () => globalState, + }) + Object.defineProperty(globalThis, JEST_MATCHERS_OBJECT, { + configurable: true, + get: () => ({ + state: globalState.get((globalThis as any)[GLOBAL_EXPECT]), + matchers, + }), + }) +} + +export const getState = (expect: Vi.ExpectStatic): State => + (globalThis as any)[MATCHERS_OBJECT].get(expect) + +export const setState = ( + state: Partial, + expect: Vi.ExpectStatic, +): void => { + const map = (globalThis as any)[MATCHERS_OBJECT] + const current = map.get(expect) || {} + Object.assign(current, state) + map.set(expect, current) +} diff --git a/packages/expect/src/types.ts b/packages/expect/src/types.ts new file mode 100644 index 000000000000..3ff834b17753 --- /dev/null +++ b/packages/expect/src/types.ts @@ -0,0 +1,95 @@ +import type { use as chaiUse } from 'chai' + +/** + * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +import type { Formatter } from 'picocolors/types' +import type * as jestMatcherUtils from './jest-matcher-utils' + +export type FirstFunctionArgument = T extends (arg: infer A) => unknown ? A : never +export type ChaiPlugin = FirstFunctionArgument + +export type Tester = (a: any, b: any) => boolean | undefined + +export interface MatcherHintOptions { + comment?: string + expectedColor?: Formatter + isDirectExpectCall?: boolean + isNot?: boolean + promise?: string + receivedColor?: Formatter + secondArgument?: string + secondArgumentColor?: Formatter +} + +export interface DiffOptions { + aAnnotation?: string + aColor?: Formatter + aIndicator?: string + bAnnotation?: string + bColor?: Formatter + bIndicator?: string + changeColor?: Formatter + changeLineTrailingSpaceColor?: Formatter + commonColor?: Formatter + commonIndicator?: string + commonLineTrailingSpaceColor?: Formatter + contextLines?: number + emptyFirstOrLastLinePlaceholder?: string + expand?: boolean + includeChangeCounts?: boolean + omitAnnotationLines?: boolean + patchColor?: Formatter + // pretty-format type + compareKeys?: any +} + +export interface MatcherState { + assertionCalls: number + currentTestName?: string + dontThrow?: () => void + error?: Error + equals: ( + a: unknown, + b: unknown, + customTesters?: Array, + strictCheck?: boolean, + ) => boolean + expand?: boolean + expectedAssertionsNumber?: number | null + expectedAssertionsNumberErrorGen?: (() => Error) | null + isExpectingAssertions?: boolean + isExpectingAssertionsError?: Error | null + isNot: boolean + // environment: VitestEnvironment + promise: string + // snapshotState: SnapshotState + suppressedErrors: Array + testPath?: string + utils: typeof jestMatcherUtils & { + iterableEquality: Tester + subsetEquality: Tester + } +} + +export interface SyncExpectationResult { + pass: boolean + message: () => string + actual?: any + expected?: any +} + +export type AsyncExpectationResult = Promise + +export type ExpectationResult = SyncExpectationResult | AsyncExpectationResult + +export interface RawMatcherFn { + (this: T, received: any, expected: any, options?: any): ExpectationResult +} + +export type MatchersObject = Record> diff --git a/packages/spy/README.md b/packages/spy/README.md new file mode 100644 index 000000000000..5d23c876f4d7 --- /dev/null +++ b/packages/spy/README.md @@ -0,0 +1,3 @@ +# @vitest/spy + +Lightweight Jest compatible spy implementation. diff --git a/packages/spy/package.json b/packages/spy/package.json new file mode 100644 index 000000000000..0ae85c3443f3 --- /dev/null +++ b/packages/spy/package.json @@ -0,0 +1,34 @@ +{ + "name": "@vitest/spy", + "type": "module", + "version": "0.26.2", + "description": "Lightweight Jest compatible spy implementation", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/vitest-dev/vitest.git", + "directory": "packages/spy" + }, + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./*": "./*" + }, + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "rimraf dist && rollup -c", + "dev": "rollup -c --watch", + "prepublishOnly": "pnpm build" + }, + "dependencies": { + "tinyspy": "^1.0.2" + } +} diff --git a/packages/spy/rollup.config.js b/packages/spy/rollup.config.js new file mode 100644 index 000000000000..fddfda5974ce --- /dev/null +++ b/packages/spy/rollup.config.js @@ -0,0 +1,51 @@ +import { builtinModules } from 'module' +import esbuild from 'rollup-plugin-esbuild' +import dts from 'rollup-plugin-dts' +import { defineConfig } from 'rollup' +import pkg from './package.json' + +const external = [ + ...builtinModules, + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.peerDependencies || {}), +] + +const plugins = [ + esbuild({ + target: 'node14', + }), +] + +export default defineConfig([ + { + input: 'src/index.ts', + output: { + dir: 'dist', + format: 'esm', + entryFileNames: '[name].js', + chunkFileNames: 'chunk-[name].js', + }, + external, + plugins, + onwarn, + }, + { + input: 'src/index.ts', + output: { + dir: 'dist', + entryFileNames: '[name].d.ts', + format: 'esm', + }, + external, + plugins: [ + dts({ respectExternal: true }), + ], + onwarn, + }, +]) + +function onwarn(message) { + if (['EMPTY_BUNDLE', 'CIRCULAR_DEPENDENCY'].includes(message.code)) + return + console.error(message) +} diff --git a/packages/spy/src/index.ts b/packages/spy/src/index.ts new file mode 100644 index 000000000000..b83d2c9a0f63 --- /dev/null +++ b/packages/spy/src/index.ts @@ -0,0 +1,295 @@ +import type { SpyImpl } from 'tinyspy' +import * as tinyspy from 'tinyspy' + +interface MockResultReturn { + type: 'return' + value: T +} +interface MockResultIncomplete { + type: 'incomplete' + value: undefined +} +interface MockResultThrow { + type: 'throw' + value: any +} + +type MockResult = MockResultReturn | MockResultThrow | MockResultIncomplete + +export interface MockContext { + calls: TArgs[] + instances: TReturns[] + invocationCallOrder: number[] + results: MockResult[] + lastCall: TArgs | undefined +} + +type Procedure = (...args: any[]) => any + +type Methods = { + [K in keyof T]: T[K] extends Procedure ? K : never +}[keyof T] & (string | symbol) +type Properties = { + [K in keyof T]: T[K] extends Procedure ? never : K +}[keyof T] & (string | symbol) +type Classes = { + [K in keyof T]: T[K] extends new (...args: any[]) => any ? K : never +}[keyof T] & (string | symbol) + +export interface SpyInstance { + getMockName(): string + mockName(n: string): this + mock: MockContext + mockClear(): this + mockReset(): this + mockRestore(): void + getMockImplementation(): ((...args: TArgs) => TReturns) | undefined + mockImplementation(fn: ((...args: TArgs) => TReturns) | (() => Promise)): this + mockImplementationOnce(fn: ((...args: TArgs) => TReturns) | (() => Promise)): this + mockReturnThis(): this + mockReturnValue(obj: TReturns): this + mockReturnValueOnce(obj: TReturns): this + mockResolvedValue(obj: Awaited): this + mockResolvedValueOnce(obj: Awaited): this + mockRejectedValue(obj: any): this + mockRejectedValueOnce(obj: any): this +} + +export interface MockInstance extends SpyInstance {} + +export interface Mock extends SpyInstance { + new (...args: TArgs): TReturns + (...args: TArgs): TReturns +} +export interface PartialMock extends SpyInstance> { + new (...args: TArgs): TReturns + (...args: TArgs): TReturns +} + +export type MaybeMockedConstructor = T extends new ( + ...args: Array +) => infer R + ? Mock, R> + : T +export type MockedFunction = Mock, ReturnType> & { + [K in keyof T]: T[K]; +} +export type PartiallyMockedFunction = PartialMock, ReturnType> & { + [K in keyof T]: T[K]; +} +export type MockedFunctionDeep = Mock, ReturnType> & MockedObjectDeep +export type PartiallyMockedFunctionDeep = PartialMock, ReturnType> & MockedObjectDeep +export type MockedObject = MaybeMockedConstructor & { + [K in Methods]: T[K] extends Procedure + ? MockedFunction + : T[K]; +} & { [K in Properties]: T[K] } +export type MockedObjectDeep = MaybeMockedConstructor & { + [K in Methods]: T[K] extends Procedure + ? MockedFunctionDeep + : T[K]; +} & { [K in Properties]: MaybeMockedDeep } + +export type MaybeMockedDeep = T extends Procedure + ? MockedFunctionDeep + : T extends object + ? MockedObjectDeep + : T + +export type MaybePartiallyMockedDeep = T extends Procedure + ? PartiallyMockedFunctionDeep + : T extends object + ? MockedObjectDeep + : T + +export type MaybeMocked = T extends Procedure + ? MockedFunction + : T extends object + ? MockedObject + : T + +export type MaybePartiallyMocked = T extends Procedure + ? PartiallyMockedFunction + : T extends object + ? MockedObject + : T + +interface Constructable { + new (...args: any[]): any +} + +export type MockedClass = MockInstance< + T extends new (...args: infer P) => any ? P : never, + InstanceType +> & { + prototype: T extends { prototype: any } ? Mocked : never +} & T + +export type Mocked = { + [P in keyof T]: T[P] extends (...args: infer Args) => infer Returns + ? MockInstance + : T[P] extends Constructable + ? MockedClass + : T[P] +} & +T + +export type EnhancedSpy = SpyInstance & SpyImpl + +export const spies = new Set() + +export function isMockFunction(fn: any): fn is EnhancedSpy { + return typeof fn === 'function' + && '_isMockFunction' in fn + && fn._isMockFunction +} + +export function spyOn>>( + obj: T, + methodName: S, + accessType: 'get', +): SpyInstance<[], T[S]> +export function spyOn>>( + obj: T, + methodName: G, + accessType: 'set', +): SpyInstance<[T[G]], void> +export function spyOn> | Classes>)>( + obj: T, + methodName: M, +): Required[M] extends (...args: infer A) => infer R | (new (...args: infer A) => infer R) ? SpyInstance : never +export function spyOn( + obj: T, + method: K, + accessType?: 'get' | 'set', +): SpyInstance { + const dictionary = { + get: 'getter', + set: 'setter', + } as const + const objMethod = accessType ? { [dictionary[accessType]]: method } : method + + const stub = tinyspy.spyOn(obj, objMethod as any) + + return enhanceSpy(stub) as SpyInstance +} + +let callOrder = 0 + +function enhanceSpy( + spy: SpyImpl, +): SpyInstance { + const stub = spy as unknown as EnhancedSpy + + let implementation: ((...args: TArgs) => TReturns) | undefined + + let instances: any[] = [] + let invocations: number[] = [] + + const mockContext = { + get calls() { + return stub.calls + }, + get instances() { + return instances + }, + get invocationCallOrder() { + return invocations + }, + get results() { + return stub.results.map(([callType, value]) => { + const type = callType === 'error' ? 'throw' : 'return' + return { type, value } + }) + }, + get lastCall() { + return stub.calls[stub.calls.length - 1] + }, + } + + let onceImplementations: ((...args: TArgs) => TReturns)[] = [] + + let name: string = (stub as any).name + + stub.getMockName = () => name || 'vi.fn()' + stub.mockName = (n) => { + name = n + return stub + } + + stub.mockClear = () => { + stub.reset() + instances = [] + invocations = [] + return stub + } + + stub.mockReset = () => { + stub.mockClear() + implementation = () => undefined as unknown as TReturns + onceImplementations = [] + return stub + } + + stub.mockRestore = () => { + stub.mockReset() + implementation = undefined + return stub + } + + stub.getMockImplementation = () => implementation + stub.mockImplementation = (fn: (...args: TArgs) => TReturns) => { + implementation = fn + return stub + } + + stub.mockImplementationOnce = (fn: (...args: TArgs) => TReturns) => { + onceImplementations.push(fn) + return stub + } + + stub.mockReturnThis = () => + stub.mockImplementation(function (this: TReturns) { + return this + }) + + stub.mockReturnValue = (val: TReturns) => stub.mockImplementation(() => val) + stub.mockReturnValueOnce = (val: TReturns) => stub.mockImplementationOnce(() => val) + + stub.mockResolvedValue = (val: Awaited) => + stub.mockImplementation(() => Promise.resolve(val as TReturns)) + + stub.mockResolvedValueOnce = (val: Awaited) => + stub.mockImplementationOnce(() => Promise.resolve(val as TReturns)) + + stub.mockRejectedValue = (val: unknown) => + stub.mockImplementation(() => Promise.reject(val)) + + stub.mockRejectedValueOnce = (val: unknown) => + stub.mockImplementationOnce(() => Promise.reject(val)) + + Object.defineProperty(stub, 'mock', { + get: () => mockContext, + }) + + stub.willCall(function (this: unknown, ...args) { + instances.push(this) + invocations.push(++callOrder) + const impl = onceImplementations.shift() || implementation || stub.getOriginal() || (() => {}) + return impl.apply(this, args) + }) + + spies.add(stub) + + return stub as any +} + +export function fn(): Mock +export function fn( + implementation: (...args: TArgs) => R +): Mock +export function fn( + implementation?: (...args: TArgs) => R, +): Mock { + return enhanceSpy(tinyspy.spyOn({ fn: implementation || (() => {}) }, 'fn')) as unknown as Mock +} diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 000000000000..38bb54e9886d --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,48 @@ +{ + "name": "@vitest/utils", + "type": "module", + "version": "0.26.2", + "description": "Shared Vitest utility functions", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/vitest-dev/vitest.git", + "directory": "packages/utils" + }, + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./diff": { + "types": "./dist/diff.d.ts", + "import": "./dist/diff.js" + }, + "./helpers": { + "types": "./dist/helpers.d.ts", + "import": "./dist/helpers.js" + }, + "./*": "./*" + }, + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "rimraf dist && rollup -c", + "dev": "rollup -c --watch", + "prepublishOnly": "pnpm build" + }, + "dependencies": { + "cli-truncate": "^3.1.0", + "diff": "^5.1.0", + "picocolors": "^1.0.0", + "pretty-format": "^27.5.1" + }, + "devDependencies": { + "@types/diff": "^5.0.2" + } +} diff --git a/packages/utils/rollup.config.js b/packages/utils/rollup.config.js new file mode 100644 index 000000000000..d9cef53a2618 --- /dev/null +++ b/packages/utils/rollup.config.js @@ -0,0 +1,64 @@ +import { builtinModules } from 'module' +import { defineConfig } from 'rollup' +import esbuild from 'rollup-plugin-esbuild' +import dts from 'rollup-plugin-dts' +import resolve from '@rollup/plugin-node-resolve' +import json from '@rollup/plugin-json' +import pkg from './package.json' + +const entries = { + index: 'src/index.ts', + helpers: 'src/helpers.ts', + diff: 'src/diff.ts', + types: 'src/types.ts', +} + +const external = [ + ...builtinModules, + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.peerDependencies || {}), +] + +const plugins = [ + resolve({ + preferBuiltins: true, + }), + json(), + esbuild({ + target: 'node14', + }), +] + +export default defineConfig([ + { + input: entries, + output: { + dir: 'dist', + format: 'esm', + entryFileNames: '[name].js', + chunkFileNames: 'chunk-[name].js', + }, + external, + plugins, + onwarn, + }, + { + input: entries, + output: { + dir: 'dist', + entryFileNames: '[name].d.ts', + format: 'esm', + }, + external, + plugins: [ + dts({ respectExternal: true }), + ], + onwarn, + }, +]) + +function onwarn(message) { + if (['EMPTY_BUNDLE', 'CIRCULAR_DEPENDENCY'].includes(message.code)) + return + console.error(message) +} diff --git a/packages/utils/src/diff.ts b/packages/utils/src/diff.ts new file mode 100644 index 000000000000..1b720554c974 --- /dev/null +++ b/packages/utils/src/diff.ts @@ -0,0 +1,128 @@ +import c from 'picocolors' +import * as diff from 'diff' +import cliTruncate from 'cli-truncate' + +export function formatLine(line: string, outputTruncateLength?: number) { + return cliTruncate(line, (outputTruncateLength ?? (process.stdout?.columns || 80)) - 4) +} + +export interface DiffOptions { + noColor?: boolean + outputDiffMaxLines?: number + outputTruncateLength?: number + outputDiffLines?: number + showLegend?: boolean +} + +/** +* Returns unified diff between two strings with coloured ANSI output. +* +* @private +* @param {String} actual +* @param {String} expected +* @return {string} The diff. +*/ + +export function unifiedDiff(actual: string, expected: string, options: DiffOptions = {}) { + if (actual === expected) + return '' + + const { outputTruncateLength, outputDiffLines, outputDiffMaxLines, noColor, showLegend = true } = options + + const indent = ' ' + const diffLimit = outputDiffLines || 15 + const diffMaxLines = outputDiffMaxLines || 50 + + const counts = { + '+': 0, + '-': 0, + } + let previousState: '-' | '+' | null = null + let previousCount = 0 + + const str = (str: string) => str + const dim = noColor ? str : c.dim + const green = noColor ? str : c.green + const red = noColor ? str : c.red + function preprocess(line: string) { + if (!line || line.match(/\\ No newline/)) + return + + const char = line[0] as '+' | '-' + if ('-+'.includes(char)) { + if (previousState !== char) { + previousState = char + previousCount = 0 + } + previousCount++ + counts[char]++ + if (previousCount === diffLimit) + return dim(`${char} ...`) + else if (previousCount > diffLimit) + return + } + return line + } + + const msg = diff.createPatch('string', expected, actual) + let lines = msg.split('\n').slice(5).map(preprocess).filter(Boolean) as string[] + let moreLines = 0 + const isCompact = counts['+'] === 1 && counts['-'] === 1 && lines.length === 2 + + if (lines.length > diffMaxLines) { + const firstDiff = lines.findIndex(line => line[0] === '-' || line[0] === '+') + const displayLines = lines.slice(firstDiff - 2, diffMaxLines) + const lastDisplayedIndex = firstDiff - 2 + diffMaxLines + if (lastDisplayedIndex < lines.length) + moreLines = lines.length - lastDisplayedIndex + lines = displayLines + } + + let formatted = lines.map((line: string) => { + line = line.replace(/\\"/g, '"') + if (line[0] === '-') { + line = formatLine(line.slice(1), outputTruncateLength) + if (isCompact) + return green(line) + return green(`- ${formatLine(line, outputTruncateLength)}`) + } + if (line[0] === '+') { + line = formatLine(line.slice(1), outputTruncateLength) + if (isCompact) + return red(line) + return red(`+ ${formatLine(line, outputTruncateLength)}`) + } + if (line.match(/@@/)) + return '--' + return ` ${line}` + }) + + if (moreLines) + formatted.push(dim(`... ${moreLines} more lines`)) + + if (showLegend) { + // Compact mode + if (isCompact) { + formatted = [ + `${green('- Expected')} ${formatted[0]}`, + `${red('+ Received')} ${formatted[1]}`, + ] + } + else { + if (formatted[0].includes('"')) + formatted[0] = formatted[0].replace('"', '') + + const last = formatted.length - 1 + if (formatted[last].endsWith('"')) + formatted[last] = formatted[last].slice(0, formatted[last].length - 1) + + formatted.unshift( + green(`- Expected - ${counts['-']}`), + red(`+ Received + ${counts['+']}`), + '', + ) + } + } + + return formatted.map(i => i ? (indent + i) : i).join('\n') +} diff --git a/packages/utils/src/helpers.ts b/packages/utils/src/helpers.ts new file mode 100644 index 000000000000..f2f963ebaae9 --- /dev/null +++ b/packages/utils/src/helpers.ts @@ -0,0 +1,10 @@ +export function assertTypes(value: unknown, name: string, types: string[]): void { + const receivedType = typeof value + const pass = types.includes(receivedType) + if (!pass) + throw new TypeError(`${name} value must be ${types.join(' or ')}, received "${receivedType}"`) +} + +export function isObject(item: unknown): boolean { + return item != null && typeof item === 'object' && !Array.isArray(item) +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 000000000000..db9ed73002ee --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,4 @@ +export * from './diff' +export * from './helpers' +export * from './types' +export * from './stringify' diff --git a/packages/utils/src/stringify.ts b/packages/utils/src/stringify.ts new file mode 100644 index 000000000000..ce778af8e7dc --- /dev/null +++ b/packages/utils/src/stringify.ts @@ -0,0 +1,49 @@ +import type { PrettyFormatOptions } from 'pretty-format' +import { format as prettyFormat, plugins as prettyFormatPlugins } from 'pretty-format' + +const { + AsymmetricMatcher, + DOMCollection, + DOMElement, + Immutable, + ReactElement, + ReactTestComponent, +} = prettyFormatPlugins + +const PLUGINS = [ + ReactTestComponent, + ReactElement, + DOMElement, + DOMCollection, + Immutable, + AsymmetricMatcher, +] + +export function stringify(object: unknown, maxDepth = 10, { maxLength, ...options }: PrettyFormatOptions & { maxLength?: number } = {}): string { + const MAX_LENGTH = maxLength ?? 10000 + let result + + try { + result = prettyFormat(object, { + maxDepth, + escapeString: false, + // min: true, + plugins: PLUGINS, + ...options, + }) + } + catch { + result = prettyFormat(object, { + callToJSON: false, + maxDepth, + escapeString: false, + // min: true, + plugins: PLUGINS, + ...options, + }) + } + + return result.length >= MAX_LENGTH && maxDepth > 1 + ? stringify(object, Math.floor(maxDepth / 2)) + : result +} diff --git a/packages/utils/src/types.ts b/packages/utils/src/types.ts new file mode 100644 index 000000000000..730ef610aa2e --- /dev/null +++ b/packages/utils/src/types.ts @@ -0,0 +1,25 @@ +export type Awaitable = T | PromiseLike +export type Nullable = T | null | undefined +export type Arrayable = T | Array +export type ArgumentsType = T extends (...args: infer U) => any ? U : never + +export type MergeInsertions = + T extends object + ? { [K in keyof T]: MergeInsertions } + : T + +export type DeepMerge = MergeInsertions<{ + [K in keyof F | keyof S]: K extends keyof S & keyof F + ? DeepMerge + : K extends keyof S + ? S[K] + : K extends keyof F + ? F[K] + : never; +}> + +export type MutableArray = { -readonly [k in keyof T]: T[k] } + +export interface Constructable { + new (...args: any[]): any +} diff --git a/packages/vitest/LICENSE.md b/packages/vitest/LICENSE.md index ba7d48a919ab..d88622892889 100644 --- a/packages/vitest/LICENSE.md +++ b/packages/vitest/LICENSE.md @@ -250,7 +250,7 @@ Repository: chalk/ansi-regex > MIT License > -> Copyright (c) Sindre Sorhus (sindresorhus.com) +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) > > Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: > @@ -267,7 +267,7 @@ Repository: chalk/ansi-styles > MIT License > -> Copyright (c) Sindre Sorhus (sindresorhus.com) +> Copyright (c) Sindre Sorhus (https://sindresorhus.com) > > Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: > diff --git a/packages/vitest/package.json b/packages/vitest/package.json index 3dc2d141b87b..1b9d7fb01d7a 100644 --- a/packages/vitest/package.json +++ b/packages/vitest/package.json @@ -131,7 +131,10 @@ "@types/natural-compare": "^1.4.1", "@types/prompts": "^2.4.2", "@types/sinonjs__fake-timers": "^8.1.2", + "@vitest/expect": "workspace:*", + "@vitest/spy": "workspace:*", "@vitest/ui": "workspace:*", + "@vitest/utils": "workspace:*", "birpc": "^0.2.3", "cac": "^6.7.14", "chai-subset": "^1.6.0", diff --git a/packages/vitest/rollup.config.js b/packages/vitest/rollup.config.js index 9c1328766d64..9194833a9074 100644 --- a/packages/vitest/rollup.config.js +++ b/packages/vitest/rollup.config.js @@ -140,6 +140,7 @@ function licensePlugin() { } const licenses = new Set() const dependencyLicenseTexts = dependencies + .filter(({ name }) => !name.startsWith('@vitest/')) .sort(({ name: nameA }, { name: nameB }) => nameA > nameB ? 1 : nameB > nameA ? -1 : 0, ) diff --git a/packages/vitest/src/integrations/chai/index.ts b/packages/vitest/src/integrations/chai/index.ts index 76cddfac59eb..b245b926ad15 100644 --- a/packages/vitest/src/integrations/chai/index.ts +++ b/packages/vitest/src/integrations/chai/index.ts @@ -1,10 +1,9 @@ import * as chai from 'chai' import './setup' +import { GLOBAL_EXPECT, getState, setState } from '@vitest/expect' +import type { MatcherState } from '../../types/chai' import type { Test } from '../../types' import { getCurrentEnvironment, getFullName } from '../../utils' -import type { MatcherState } from '../../types/chai' -import { getState, setState } from './jest-expect' -import { GLOBAL_EXPECT } from './constants' export function createExpect(test?: Test) { const expect = ((value: any, message?: string): Vi.Assertion => { @@ -19,18 +18,23 @@ export function createExpect(test?: Test) { }) as Vi.ExpectStatic Object.assign(expect, chai.expect) - expect.getState = () => getState(expect) + expect.getState = () => getState(expect) expect.setState = state => setState(state as Partial, expect) - setState({ + // @ts-expect-error global is not typed + const globalState = getState(globalThis[GLOBAL_EXPECT]) || {} + + setState({ + // this should also add "snapshotState" that is added conditionally + ...globalState, assertionCalls: 0, isExpectingAssertions: false, isExpectingAssertionsError: null, expectedAssertionsNumber: null, expectedAssertionsNumberErrorGen: null, environment: getCurrentEnvironment(), - testPath: test?.suite.file?.filepath, - currentTestName: test ? getFullName(test) : undefined, + testPath: test ? test.suite.file?.filepath : globalState.testPath, + currentTestName: test ? getFullName(test) : globalState.currentTestName, }, expect) // @ts-expect-error untyped diff --git a/packages/vitest/src/integrations/chai/setup.ts b/packages/vitest/src/integrations/chai/setup.ts index 8414ebb60b1d..1687e013b8f1 100644 --- a/packages/vitest/src/integrations/chai/setup.ts +++ b/packages/vitest/src/integrations/chai/setup.ts @@ -1,9 +1,7 @@ import * as chai from 'chai' import Subset from 'chai-subset' +import { JestAsymmetricMatchers, JestChaiExpect, JestExtend } from '@vitest/expect' import { SnapshotPlugin } from '../snapshot/chai' -import { JestExtend } from './jest-extend' -import { JestChaiExpect } from './jest-expect' -import { JestAsymmetricMatchers } from './jest-asymmetric-matchers' chai.use(JestExtend) chai.use(JestChaiExpect) diff --git a/packages/vitest/src/integrations/snapshot/chai.ts b/packages/vitest/src/integrations/snapshot/chai.ts index 9bec0c4ad478..fefbcc65a76f 100644 --- a/packages/vitest/src/integrations/snapshot/chai.ts +++ b/packages/vitest/src/integrations/snapshot/chai.ts @@ -1,6 +1,7 @@ -import type { ChaiPlugin } from '../../types/chai' +import type { ChaiPlugin } from '@vitest/expect' import { SnapshotClient } from './client' import { stripSnapshotIndentation } from './port/inlineSnapshot' +import { addSerializer } from './port/plugins' let _client: SnapshotClient @@ -123,4 +124,9 @@ export const SnapshotPlugin: ChaiPlugin = (chai, utils) => { }) }, ) + utils.addMethod( + chai.expect, + 'addSnapshotSerializer', + addSerializer, + ) } diff --git a/packages/vitest/src/integrations/snapshot/client.ts b/packages/vitest/src/integrations/snapshot/client.ts index 72576a90ab5f..a28dabefcfb9 100644 --- a/packages/vitest/src/integrations/snapshot/client.ts +++ b/packages/vitest/src/integrations/snapshot/client.ts @@ -1,8 +1,8 @@ import { expect } from 'chai' +import { equals, iterableEquality, subsetEquality } from '@vitest/expect' import type { Test } from '../../types' import { rpc } from '../../runtime/rpc' import { getNames, getWorkerState } from '../../utils' -import { equals, iterableEquality, subsetEquality } from '../chai/jest-utils' import { deepMergeSnapshot } from './port/utils' import SnapshotState from './port/state' diff --git a/packages/vitest/src/integrations/spy.ts b/packages/vitest/src/integrations/spy.ts index b83d2c9a0f63..5908224361b3 100644 --- a/packages/vitest/src/integrations/spy.ts +++ b/packages/vitest/src/integrations/spy.ts @@ -1,295 +1 @@ -import type { SpyImpl } from 'tinyspy' -import * as tinyspy from 'tinyspy' - -interface MockResultReturn { - type: 'return' - value: T -} -interface MockResultIncomplete { - type: 'incomplete' - value: undefined -} -interface MockResultThrow { - type: 'throw' - value: any -} - -type MockResult = MockResultReturn | MockResultThrow | MockResultIncomplete - -export interface MockContext { - calls: TArgs[] - instances: TReturns[] - invocationCallOrder: number[] - results: MockResult[] - lastCall: TArgs | undefined -} - -type Procedure = (...args: any[]) => any - -type Methods = { - [K in keyof T]: T[K] extends Procedure ? K : never -}[keyof T] & (string | symbol) -type Properties = { - [K in keyof T]: T[K] extends Procedure ? never : K -}[keyof T] & (string | symbol) -type Classes = { - [K in keyof T]: T[K] extends new (...args: any[]) => any ? K : never -}[keyof T] & (string | symbol) - -export interface SpyInstance { - getMockName(): string - mockName(n: string): this - mock: MockContext - mockClear(): this - mockReset(): this - mockRestore(): void - getMockImplementation(): ((...args: TArgs) => TReturns) | undefined - mockImplementation(fn: ((...args: TArgs) => TReturns) | (() => Promise)): this - mockImplementationOnce(fn: ((...args: TArgs) => TReturns) | (() => Promise)): this - mockReturnThis(): this - mockReturnValue(obj: TReturns): this - mockReturnValueOnce(obj: TReturns): this - mockResolvedValue(obj: Awaited): this - mockResolvedValueOnce(obj: Awaited): this - mockRejectedValue(obj: any): this - mockRejectedValueOnce(obj: any): this -} - -export interface MockInstance extends SpyInstance {} - -export interface Mock extends SpyInstance { - new (...args: TArgs): TReturns - (...args: TArgs): TReturns -} -export interface PartialMock extends SpyInstance> { - new (...args: TArgs): TReturns - (...args: TArgs): TReturns -} - -export type MaybeMockedConstructor = T extends new ( - ...args: Array -) => infer R - ? Mock, R> - : T -export type MockedFunction = Mock, ReturnType> & { - [K in keyof T]: T[K]; -} -export type PartiallyMockedFunction = PartialMock, ReturnType> & { - [K in keyof T]: T[K]; -} -export type MockedFunctionDeep = Mock, ReturnType> & MockedObjectDeep -export type PartiallyMockedFunctionDeep = PartialMock, ReturnType> & MockedObjectDeep -export type MockedObject = MaybeMockedConstructor & { - [K in Methods]: T[K] extends Procedure - ? MockedFunction - : T[K]; -} & { [K in Properties]: T[K] } -export type MockedObjectDeep = MaybeMockedConstructor & { - [K in Methods]: T[K] extends Procedure - ? MockedFunctionDeep - : T[K]; -} & { [K in Properties]: MaybeMockedDeep } - -export type MaybeMockedDeep = T extends Procedure - ? MockedFunctionDeep - : T extends object - ? MockedObjectDeep - : T - -export type MaybePartiallyMockedDeep = T extends Procedure - ? PartiallyMockedFunctionDeep - : T extends object - ? MockedObjectDeep - : T - -export type MaybeMocked = T extends Procedure - ? MockedFunction - : T extends object - ? MockedObject - : T - -export type MaybePartiallyMocked = T extends Procedure - ? PartiallyMockedFunction - : T extends object - ? MockedObject - : T - -interface Constructable { - new (...args: any[]): any -} - -export type MockedClass = MockInstance< - T extends new (...args: infer P) => any ? P : never, - InstanceType -> & { - prototype: T extends { prototype: any } ? Mocked : never -} & T - -export type Mocked = { - [P in keyof T]: T[P] extends (...args: infer Args) => infer Returns - ? MockInstance - : T[P] extends Constructable - ? MockedClass - : T[P] -} & -T - -export type EnhancedSpy = SpyInstance & SpyImpl - -export const spies = new Set() - -export function isMockFunction(fn: any): fn is EnhancedSpy { - return typeof fn === 'function' - && '_isMockFunction' in fn - && fn._isMockFunction -} - -export function spyOn>>( - obj: T, - methodName: S, - accessType: 'get', -): SpyInstance<[], T[S]> -export function spyOn>>( - obj: T, - methodName: G, - accessType: 'set', -): SpyInstance<[T[G]], void> -export function spyOn> | Classes>)>( - obj: T, - methodName: M, -): Required[M] extends (...args: infer A) => infer R | (new (...args: infer A) => infer R) ? SpyInstance : never -export function spyOn( - obj: T, - method: K, - accessType?: 'get' | 'set', -): SpyInstance { - const dictionary = { - get: 'getter', - set: 'setter', - } as const - const objMethod = accessType ? { [dictionary[accessType]]: method } : method - - const stub = tinyspy.spyOn(obj, objMethod as any) - - return enhanceSpy(stub) as SpyInstance -} - -let callOrder = 0 - -function enhanceSpy( - spy: SpyImpl, -): SpyInstance { - const stub = spy as unknown as EnhancedSpy - - let implementation: ((...args: TArgs) => TReturns) | undefined - - let instances: any[] = [] - let invocations: number[] = [] - - const mockContext = { - get calls() { - return stub.calls - }, - get instances() { - return instances - }, - get invocationCallOrder() { - return invocations - }, - get results() { - return stub.results.map(([callType, value]) => { - const type = callType === 'error' ? 'throw' : 'return' - return { type, value } - }) - }, - get lastCall() { - return stub.calls[stub.calls.length - 1] - }, - } - - let onceImplementations: ((...args: TArgs) => TReturns)[] = [] - - let name: string = (stub as any).name - - stub.getMockName = () => name || 'vi.fn()' - stub.mockName = (n) => { - name = n - return stub - } - - stub.mockClear = () => { - stub.reset() - instances = [] - invocations = [] - return stub - } - - stub.mockReset = () => { - stub.mockClear() - implementation = () => undefined as unknown as TReturns - onceImplementations = [] - return stub - } - - stub.mockRestore = () => { - stub.mockReset() - implementation = undefined - return stub - } - - stub.getMockImplementation = () => implementation - stub.mockImplementation = (fn: (...args: TArgs) => TReturns) => { - implementation = fn - return stub - } - - stub.mockImplementationOnce = (fn: (...args: TArgs) => TReturns) => { - onceImplementations.push(fn) - return stub - } - - stub.mockReturnThis = () => - stub.mockImplementation(function (this: TReturns) { - return this - }) - - stub.mockReturnValue = (val: TReturns) => stub.mockImplementation(() => val) - stub.mockReturnValueOnce = (val: TReturns) => stub.mockImplementationOnce(() => val) - - stub.mockResolvedValue = (val: Awaited) => - stub.mockImplementation(() => Promise.resolve(val as TReturns)) - - stub.mockResolvedValueOnce = (val: Awaited) => - stub.mockImplementationOnce(() => Promise.resolve(val as TReturns)) - - stub.mockRejectedValue = (val: unknown) => - stub.mockImplementation(() => Promise.reject(val)) - - stub.mockRejectedValueOnce = (val: unknown) => - stub.mockImplementationOnce(() => Promise.reject(val)) - - Object.defineProperty(stub, 'mock', { - get: () => mockContext, - }) - - stub.willCall(function (this: unknown, ...args) { - instances.push(this) - invocations.push(++callOrder) - const impl = onceImplementations.shift() || implementation || stub.getOriginal() || (() => {}) - return impl.apply(this, args) - }) - - spies.add(stub) - - return stub as any -} - -export function fn(): Mock -export function fn( - implementation: (...args: TArgs) => R -): Mock -export function fn( - implementation?: (...args: TArgs) => R, -): Mock { - return enhanceSpy(tinyspy.spyOn({ fn: implementation || (() => {}) }, 'fn')) as unknown as Mock -} +export * from '@vitest/spy' diff --git a/packages/vitest/src/node/error.ts b/packages/vitest/src/node/error.ts index 9bdd1532f725..31c30fa03781 100644 --- a/packages/vitest/src/node/error.ts +++ b/packages/vitest/src/node/error.ts @@ -3,10 +3,10 @@ import { existsSync, readFileSync } from 'fs' import { normalize, relative } from 'pathe' import c from 'picocolors' import cliTruncate from 'cli-truncate' +import { stringify } from '@vitest/utils' import type { ErrorWithDiff, ParsedStack } from '../types' import { lineSplitRE, parseStacktrace, positionToOffset } from '../utils/source-map' import { F_POINTER } from '../utils/figures' -import { stringify } from '../integrations/chai/jest-matcher-utils' import { TypeCheckError } from '../typecheck/typechecker' import { type DiffOptions, unifiedDiff } from '../utils/diff' import type { Vitest } from './core' diff --git a/packages/vitest/src/runtime/error.ts b/packages/vitest/src/runtime/error.ts index d66560d499cf..15a56c331a44 100644 --- a/packages/vitest/src/runtime/error.ts +++ b/packages/vitest/src/runtime/error.ts @@ -1,6 +1,6 @@ import util from 'util' import { util as ChaiUtil } from 'chai' -import { stringify } from '../integrations/chai/jest-matcher-utils' +import { stringify } from '@vitest/utils' import { deepClone, getType, getWorkerState } from '../utils' const IS_RECORD_SYMBOL = '@@__IMMUTABLE_RECORD__@@' diff --git a/packages/vitest/src/runtime/run.ts b/packages/vitest/src/runtime/run.ts index 18490bb19a99..45164b75041d 100644 --- a/packages/vitest/src/runtime/run.ts +++ b/packages/vitest/src/runtime/run.ts @@ -1,11 +1,12 @@ import { performance } from 'perf_hooks' import limit from 'p-limit' +import { GLOBAL_EXPECT, getState, setState } from '@vitest/expect' import type { BenchTask, Benchmark, BenchmarkResult, File, HookCleanupCallback, HookListener, ResolvedConfig, SequenceHooks, Suite, SuiteHooks, Task, TaskResult, TaskState, Test } from '../types' import { vi } from '../integrations/vi' import { clearTimeout, createDefer, getFullName, getWorkerState, hasFailed, hasTests, isBrowser, isNode, isRunningInBenchmark, partitionSuiteChildren, setTimeout, shuffle } from '../utils' -import { getState, setState } from '../integrations/chai/jest-expect' -import { GLOBAL_EXPECT } from '../integrations/chai/constants' import { takeCoverageInsideWorker } from '../integrations/coverage' +import type { MatcherState } from '../types/chai' +import { getSnapshotClient } from '../integrations/snapshot/chai' import { getBenchOptions, getFn, getHooks } from './map' import { rpc } from './rpc' import { collectTests } from './collect' @@ -148,7 +149,7 @@ export async function runTest(test: Test) { for (let retryCount = 0; retryCount < retry; retryCount++) { let beforeEachCleanups: HookCleanupCallback[] = [] try { - setState({ + setState({ assertionCalls: 0, isExpectingAssertions: false, isExpectingAssertionsError: null, @@ -156,6 +157,7 @@ export async function runTest(test: Test) { expectedAssertionsNumberErrorGen: null, testPath: test.suite.file?.filepath, currentTestName: getFullName(test), + snapshotState: getSnapshotClient().snapshotState, }, (globalThis as any)[GLOBAL_EXPECT]) beforeEachCleanups = await callSuiteHook(test.suite, test, 'beforeEach', [test.context, test.suite]) diff --git a/packages/vitest/src/types/chai.ts b/packages/vitest/src/types/chai.ts index 0d96ab3af5c9..94069cfe9162 100644 --- a/packages/vitest/src/types/chai.ts +++ b/packages/vitest/src/types/chai.ts @@ -1,63 +1,8 @@ -import type { use as chaiUse } from 'chai' - -/** - * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -import type * as jestMatcherUtils from '../integrations/chai/jest-matcher-utils' +import type { MatcherState as JestMatcherState } from '@vitest/expect' import type SnapshotState from '../integrations/snapshot/port/state' import type { VitestEnvironment } from './config' -export type FirstFunctionArgument = T extends (arg: infer A) => unknown ? A : never -export type ChaiPlugin = FirstFunctionArgument - -export type Tester = (a: any, b: any) => boolean | undefined - -export interface MatcherState { - assertionCalls: number - currentTestName?: string - dontThrow?: () => void - error?: Error - equals: ( - a: unknown, - b: unknown, - customTesters?: Array, - strictCheck?: boolean, - ) => boolean - expand?: boolean - expectedAssertionsNumber?: number | null - expectedAssertionsNumberErrorGen?: (() => Error) | null - isExpectingAssertions?: boolean - isExpectingAssertionsError?: Error | null - isNot: boolean +export interface MatcherState extends JestMatcherState { environment: VitestEnvironment - promise: string snapshotState: SnapshotState - suppressedErrors: Array - testPath?: string - utils: typeof jestMatcherUtils & { - iterableEquality: Tester - subsetEquality: Tester - } -} - -export interface SyncExpectationResult { - pass: boolean - message: () => string - actual?: any - expected?: any } - -export type AsyncExpectationResult = Promise - -export type ExpectationResult = SyncExpectationResult | AsyncExpectationResult - -export interface RawMatcherFn { - (this: T, received: any, expected: any, options?: any): ExpectationResult -} - -export type MatchersObject = Record> diff --git a/packages/vitest/src/types/global.ts b/packages/vitest/src/types/global.ts index 4ea4a275b3ca..a1b87d37dae6 100644 --- a/packages/vitest/src/types/global.ts +++ b/packages/vitest/src/types/global.ts @@ -1,5 +1,6 @@ import type { Plugin as PrettyFormatPlugin } from 'pretty-format' -import type { MatcherState, MatchersObject } from './chai' +import type { MatchersObject } from '@vitest/expect' +import type { MatcherState } from './chai' import type { Constructable } from './general' type Promisify = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 51ee866e89b2..a346a2d17a01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -684,6 +684,24 @@ importers: '@types/istanbul-reports': 3.0.1 pathe: 0.2.0 + packages/expect: + specifiers: + '@vitest/spy': workspace:* + '@vitest/utils': workspace:* + chai: ^4.3.7 + picocolors: ^1.0.0 + dependencies: + '@vitest/spy': link:../spy + '@vitest/utils': link:../utils + chai: 4.3.7 + picocolors: 1.0.0 + + packages/spy: + specifiers: + tinyspy: ^1.0.2 + dependencies: + tinyspy: 1.0.2 + packages/ui: specifiers: '@faker-js/faker': ^7.6.0 @@ -753,6 +771,21 @@ importers: vue: 3.2.45 vue-router: 4.1.6_vue@3.2.45 + packages/utils: + specifiers: + '@types/diff': ^5.0.2 + cli-truncate: ^3.1.0 + diff: ^5.1.0 + picocolors: ^1.0.0 + pretty-format: ^27.5.1 + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + picocolors: 1.0.0 + pretty-format: 27.5.1 + devDependencies: + '@types/diff': 5.0.2 + packages/vite-node: specifiers: '@types/debug': ^4.1.7 @@ -796,7 +829,10 @@ importers: '@types/node': '*' '@types/prompts': ^2.4.2 '@types/sinonjs__fake-timers': ^8.1.2 + '@vitest/expect': workspace:* + '@vitest/spy': workspace:* '@vitest/ui': workspace:* + '@vitest/utils': workspace:* acorn: ^8.8.1 acorn-walk: ^8.2.0 birpc: ^0.2.3 @@ -864,7 +900,10 @@ importers: '@types/natural-compare': 1.4.1 '@types/prompts': 2.4.2 '@types/sinonjs__fake-timers': 8.1.2 + '@vitest/expect': link:../expect + '@vitest/spy': link:../spy '@vitest/ui': link:../ui + '@vitest/utils': link:../utils birpc: 0.2.3 cac: 6.7.14 chai-subset: 1.6.0 @@ -8965,7 +9004,6 @@ packages: /ansi-regex/6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - dev: true /ansi-styles/2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} @@ -8987,12 +9025,10 @@ packages: /ansi-styles/5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - dev: true /ansi-styles/6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - dev: true /ansi-to-html/0.6.15: resolution: {integrity: sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==} @@ -10296,7 +10332,6 @@ packages: dependencies: slice-ansi: 5.0.0 string-width: 5.1.2 - dev: true /cli-width/3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} @@ -11295,7 +11330,6 @@ packages: /diff/5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} - dev: true /diffie-hellman/5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} @@ -11468,7 +11502,6 @@ packages: /eastasianwidth/0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true /ecc-jsbn/0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} @@ -11519,7 +11552,6 @@ packages: /emoji-regex/9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true /emojis-list/3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} @@ -14111,7 +14143,6 @@ packages: /is-fullwidth-code-point/4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} - dev: true /is-function/1.0.2: resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} @@ -17052,7 +17083,6 @@ packages: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - dev: true /pretty-format/29.0.1: resolution: {integrity: sha512-iTHy3QZMzuL484mSTYbQIM1AHhEQsH8mXWS2/vd2yFBYnG3EBqGiMONo28PlPgrW7P/8s/1ISv+y7WH306l8cw==} @@ -17469,7 +17499,6 @@ packages: /react-is/17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true /react-is/18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} @@ -18571,7 +18600,6 @@ packages: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - dev: true /snapdragon-node/2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} @@ -18919,7 +18947,6 @@ packages: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.0.1 - dev: true /string.prototype.matchall/4.0.7: resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} @@ -19016,7 +19043,6 @@ packages: engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 - dev: true /strip-bom/2.0.0: resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} diff --git a/test/core/test/diff.test.ts b/test/core/test/diff.test.ts index 98e5eea4641c..d57fcd938e61 100644 --- a/test/core/test/diff.test.ts +++ b/test/core/test/diff.test.ts @@ -1,6 +1,6 @@ import { expect, test, vi } from 'vitest' +import { stringify } from '@vitest/utils' import { displayDiff } from 'vitest/src/node/error' -import { stringify } from 'vitest/src/integrations/chai/jest-matcher-utils' test('displays an error for large objects', () => { const objectA = new Array(1000).fill(0).map((_, i) => ({ i, long: 'a'.repeat(i) })) diff --git a/test/core/test/file-path.test.ts b/test/core/test/file-path.test.ts index a848dcafd527..c0b1a4f37319 100644 --- a/test/core/test/file-path.test.ts +++ b/test/core/test/file-path.test.ts @@ -4,7 +4,7 @@ import { isWindows, slash, toFilePath } from '../../../packages/vite-node/src/ut // @ts-expect-error aliased to ../src/aliased-mod.ts import { getPaths as getAbsoluteAliasedPaths } from '$/aliased-mod' // @ts-expect-error aliased to ../src/aliased-mod.ts -import { getPaths as getRelativeAliasedPath } from '@/aliased-mod' +import { getPaths as getRelativeAliasedPath } from '#/aliased-mod' vi.mock('fs') diff --git a/test/core/test/imports.test.ts b/test/core/test/imports.test.ts index 309928377676..9ec6e9a34f8f 100644 --- a/test/core/test/imports.test.ts +++ b/test/core/test/imports.test.ts @@ -20,7 +20,7 @@ test('Relative imports in imported modules work', async () => { test('dynamic aliased import works', async () => { const stringTimeoutMod = await import('./../src/timeout') - const timeoutPath = '@/timeout' + const timeoutPath = '#/timeout' const variableTimeoutMod = await import(timeoutPath) expect(stringTimeoutMod).toBe(variableTimeoutMod) diff --git a/test/core/test/jest-expect.test.ts b/test/core/test/jest-expect.test.ts index 442aebf944dd..450403fa244a 100644 --- a/test/core/test/jest-expect.test.ts +++ b/test/core/test/jest-expect.test.ts @@ -1,7 +1,7 @@ /* eslint-disable no-sparse-arrays */ import { AssertionError } from 'assert' import { describe, expect, it, vi } from 'vitest' -import { generateToBeMessage } from 'vitest/src/integrations/chai/jest-utils' +import { generateToBeMessage } from '@vitest/expect' class TestError extends Error {} diff --git a/test/core/test/local-context.test.ts b/test/core/test/local-context.test.ts index a475840dfc51..8ace7b7e3489 100644 --- a/test/core/test/local-context.test.ts +++ b/test/core/test/local-context.test.ts @@ -25,7 +25,14 @@ describe('local test context works with implicit type', () => { it('works with implicit type', (context: LocalTestContext) => { expect(context.bar).toBe('bar') }) - it.only('is chainable with implicit type', (context: LocalTestContext) => { + it('is chainable with implicit type', (context: LocalTestContext) => { expect(context.bar).toBe('bar') }) }) + +describe('context expect', () => { + it('has snapshotState', ({ expect: localExpect }) => { + expect(expect.getState().snapshotState).toBeDefined() + expect(localExpect.getState().snapshotState).toBeDefined() + }) +}) diff --git a/test/core/vitest.config.ts b/test/core/vitest.config.ts index 4a37556787f4..fa07e6ba8474 100644 --- a/test/core/vitest.config.ts +++ b/test/core/vitest.config.ts @@ -33,8 +33,9 @@ export default defineConfig({ }, resolve: { alias: [ - { find: '@', replacement: resolve(__dirname, 'src') }, + { find: '#', replacement: resolve(__dirname, 'src') }, { find: '$', replacement: 'src' }, + { find: '@vitest', replacement: resolve(__dirname, '..', '..', 'packages') }, ], }, test: { diff --git a/tsconfig.json b/tsconfig.json index 03bec70b5b0e..ebe03fc547a8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,9 @@ "paths": { "@vitest/ws-client": ["./packages/ws-client/src/index.ts"], "@vitest/ui": ["./packages/ui/node/index.ts"], + "@vitest/utils": ["./packages/utils/src/index.ts"], + "@vitest/spy": ["./packages/spy/src/index.ts"], + "@vitest/expect": ["./packages/expect/src/index.ts"], "@vitest/browser": ["./packages/browser/src/node/index.ts"], "#types": ["./packages/vitest/src/index.ts"], "~/*": ["./packages/ui/client/*"], @@ -38,6 +41,7 @@ "**/dist/**", "./packages/vitest/dist/**", "./packages/vitest/*.d.ts", + "./packages/vitest/*.d.cts", "./packages/ui/client/**", "./examples/**/*.*", "./bench/**", From 09d19892de427d0c64fb6c46b756bbe5dd6b9678 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 2 Jan 2023 18:42:09 +0100 Subject: [PATCH 04/17] perf: improve vi.mock performance (#2594) --- packages/vitest/src/integrations/vi.ts | 10 +-- packages/vitest/src/utils/error.ts | 22 ++++++ packages/vitest/src/utils/source-map.ts | 92 +++++++++++++------------ 3 files changed, 77 insertions(+), 47 deletions(-) create mode 100644 packages/vitest/src/utils/error.ts diff --git a/packages/vitest/src/integrations/vi.ts b/packages/vitest/src/integrations/vi.ts index 8fc981710e59..474befedd8c8 100644 --- a/packages/vitest/src/integrations/vi.ts +++ b/packages/vitest/src/integrations/vi.ts @@ -1,9 +1,10 @@ import type { FakeTimerInstallOpts } from '@sinonjs/fake-timers' -import { parseStacktrace } from '../utils/source-map' +import { parseSingleStack } from '../utils/source-map' import type { VitestMocker } from '../runtime/mocker' import type { ResolvedConfig, RuntimeConfig } from '../types' import { getWorkerState, resetModules, waitForImportsToResolve } from '../utils' import type { MockFactoryWithHelper } from '../types/mocker' +import { createSimpleStackTrace } from '../utils/error' import { FakeTimers } from './mock/timers' import type { EnhancedSpy, MaybeMocked, MaybeMockedDeep, MaybePartiallyMocked, MaybePartiallyMockedDeep } from './spy' import { fn, isMockFunction, spies, spyOn } from './spy' @@ -110,9 +111,10 @@ class VitestUtils { fn = fn private getImporter() { - const err = new Error('mock') - const [,, importer] = parseStacktrace(err, true) - return importer.file + const stackTrace = createSimpleStackTrace({ stackTraceLimit: 4 }) + const importerStack = stackTrace.split('\n')[4] + const stack = parseSingleStack(importerStack) + return stack?.file || '' } /** diff --git a/packages/vitest/src/utils/error.ts b/packages/vitest/src/utils/error.ts new file mode 100644 index 000000000000..8189d03c7239 --- /dev/null +++ b/packages/vitest/src/utils/error.ts @@ -0,0 +1,22 @@ +interface ErrorOptions { + message?: string + stackTraceLimit?: number +} + +/** + * Get original stacktrace without source map support the most performant way. + * - Create only 1 stack frame. + * - Rewrite prepareStackTrace to bypass "support-stack-trace" (usually takes ~250ms). + */ +export function createSimpleStackTrace(options?: ErrorOptions) { + const { message = 'error', stackTraceLimit = 1 } = options || {} + const limit = Error.stackTraceLimit + const prepareStackTrace = Error.prepareStackTrace + Error.stackTraceLimit = stackTraceLimit + Error.prepareStackTrace = e => e.stack + const err = new Error(message) + const stackTrace = err.stack || '' + Error.prepareStackTrace = prepareStackTrace + Error.stackTraceLimit = limit + return stackTrace +} diff --git a/packages/vitest/src/utils/source-map.ts b/packages/vitest/src/utils/source-map.ts index 081e2ecff103..f071a1395b3f 100644 --- a/packages/vitest/src/utils/source-map.ts +++ b/packages/vitest/src/utils/source-map.ts @@ -27,63 +27,69 @@ function extractLocation(urlLike: string) { return [parts[1], parts[2] || undefined, parts[3] || undefined] } -export function parseStacktrace(e: ErrorWithDiff, full = false): ParsedStack[] { - if (!e) - return [] +// Based on https://github.com/stacktracejs/error-stack-parser +// Credit to stacktracejs +export function parseSingleStack(raw: string): ParsedStack | null { + let line = raw.trim() - if (e.stacks) - return e.stacks + if (line.includes('(eval ')) + line = line.replace(/eval code/g, 'eval').replace(/(\(eval at [^()]*)|(,.*$)/g, '') - const stackStr = e.stack || e.stackStr || '' - const stackFrames = stackStr - .split('\n') - // Based on https://github.com/stacktracejs/error-stack-parser - // Credit to stacktracejs - .map((raw): ParsedStack | null => { - let line = raw.trim() + let sanitizedLine = line + .replace(/^\s+/, '') + .replace(/\(eval code/g, '(') + .replace(/^.*?\s+/, '') - if (line.includes('(eval ')) - line = line.replace(/eval code/g, 'eval').replace(/(\(eval at [^()]*)|(,.*$)/g, '') + // capture and preserve the parenthesized location "(/foo/my bar.js:12:87)" in + // case it has spaces in it, as the string is split on \s+ later on + const location = sanitizedLine.match(/ (\(.+\)$)/) - let sanitizedLine = line - .replace(/^\s+/, '') - .replace(/\(eval code/g, '(') - .replace(/^.*?\s+/, '') + // remove the parenthesized location from the line, if it was matched + sanitizedLine = location ? sanitizedLine.replace(location[0], '') : sanitizedLine - // capture and preserve the parenthesized location "(/foo/my bar.js:12:87)" in - // case it has spaces in it, as the string is split on \s+ later on - const location = sanitizedLine.match(/ (\(.+\)$)/) + // if a location was matched, pass it to extractLocation() otherwise pass all sanitizedLine + // because this line doesn't have function name + const [url, lineNumber, columnNumber] = extractLocation(location ? location[1] : sanitizedLine) + let method = (location && sanitizedLine) || '' + let file = url && ['eval', ''].includes(url) ? undefined : url - // remove the parenthesized location from the line, if it was matched - sanitizedLine = location ? sanitizedLine.replace(location[0], '') : sanitizedLine + if (!file || !lineNumber || !columnNumber) + return null - // if a location was matched, pass it to extractLocation() otherwise pass all sanitizedLine - // because this line doesn't have function name - const [url, lineNumber, columnNumber] = extractLocation(location ? location[1] : sanitizedLine) - let method = (location && sanitizedLine) || '' - let file = url && ['eval', ''].includes(url) ? undefined : url + if (method.startsWith('async ')) + method = method.slice(6) - if (!file || !lineNumber || !columnNumber) - return null + if (file.startsWith('file://')) + file = file.slice(7) - if (method.startsWith('async ')) - method = method.slice(6) + // normalize Windows path (\ -> /) + file = resolve(file) - if (file.startsWith('file://')) - file = file.slice(7) + return { + method, + file, + line: parseInt(lineNumber), + column: parseInt(columnNumber), + } +} - // normalize Windows path (\ -> /) - file = resolve(file) +export function parseStacktrace(e: ErrorWithDiff, full = false): ParsedStack[] { + if (!e) + return [] + + if (e.stacks) + return e.stacks + + const stackStr = e.stack || e.stackStr || '' + const stackFrames = stackStr + .split('\n') + .map((raw): ParsedStack | null => { + const stack = parseSingleStack(raw) - if (!full && stackIgnorePatterns.some(p => file && file.includes(p))) + if (!stack || (!full && stackIgnorePatterns.some(p => stack.file.includes(p)))) return null - return { - method, - file, - line: parseInt(lineNumber), - column: parseInt(columnNumber), - } + return stack }) .filter(notNullish) From 039a0c01bb8dfdcf30ca3e151b945f1a609fd32d Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 2 Jan 2023 18:43:17 +0100 Subject: [PATCH 05/17] chore: don't bundle cac and picocolors (#2595) * chore: don't bundle cac and picocolors * chore: cleanup --- packages/browser/package.json | 1 - packages/ui/client/components.d.ts | 1 + packages/vite-node/package.json | 5 +-- packages/vitest/LICENSE.md | 52 ------------------------------ packages/vitest/package.json | 5 +-- pnpm-lock.yaml | 11 +++---- 6 files changed, 11 insertions(+), 64 deletions(-) diff --git a/packages/browser/package.json b/packages/browser/package.json index 1283d6fe487c..9b5ec14be0fd 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -43,7 +43,6 @@ "devDependencies": { "@types/ws": "^8.5.3", "@vitest/ws-client": "workspace:*", - "picocolors": "^1.0.0", "rollup": "^2.79.1", "vitest": "workspace:*" } diff --git a/packages/ui/client/components.d.ts b/packages/ui/client/components.d.ts index c62c6cc7fcc1..031f6be1d7ef 100644 --- a/packages/ui/client/components.d.ts +++ b/packages/ui/client/components.d.ts @@ -33,5 +33,6 @@ declare module '@vue/runtime-core' { ViewEditor: typeof import('./components/views/ViewEditor.vue')['default'] ViewModuleGraph: typeof import('./components/views/ViewModuleGraph.vue')['default'] ViewReport: typeof import('./components/views/ViewReport.vue')['default'] + ViewReportError: typeof import('./components/views/ViewReportError.vue')['default'] } } diff --git a/packages/vite-node/package.json b/packages/vite-node/package.json index 27ccc6ba8c4c..c73c1888877f 100644 --- a/packages/vite-node/package.json +++ b/packages/vite-node/package.json @@ -14,6 +14,7 @@ "bugs": { "url": "https://github.com/vitest-dev/vitest/issues" }, + "sideEffects": false, "exports": { ".": { "types": "./dist/index.d.ts", @@ -75,9 +76,11 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "cac": "^6.7.14", "debug": "^4.3.4", "mlly": "^1.0.0", "pathe": "^0.2.0", + "picocolors": "^1.0.0", "source-map": "^0.6.1", "source-map-support": "^0.5.21", "vite": "^3.0.0 || ^4.0.0" @@ -86,8 +89,6 @@ "@types/debug": "^4.1.7", "@types/source-map": "^0.5.7", "@types/source-map-support": "^0.5.6", - "cac": "^6.7.14", - "picocolors": "^1.0.0", "rollup": "^2.79.1" } } diff --git a/packages/vitest/LICENSE.md b/packages/vitest/LICENSE.md index d88622892889..0cb365ba35d7 100644 --- a/packages/vitest/LICENSE.md +++ b/packages/vitest/LICENSE.md @@ -335,35 +335,6 @@ Repository: micromatch/braces --------------------------------------- -## cac -License: MIT -By: egoist -Repository: egoist/cac - -> The MIT License (MIT) -> -> Copyright (c) EGOIST <0x142857@gmail.com> (https://github.com/egoist) -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. - ---------------------------------------- - ## chai-subset License: MIT By: Andrii Shumada, Robert Herhold @@ -1693,29 +1664,6 @@ Repository: unjs/pathe --------------------------------------- -## picocolors -License: ISC -By: Alexey Raspopov -Repository: alexeyraspopov/picocolors - -> ISC License -> -> Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov -> -> Permission to use, copy, modify, and/or distribute this software for any -> purpose with or without fee is hereby granted, provided that the above -> copyright notice and this permission notice appear in all copies. -> -> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ---------------------------------------- - ## picomatch License: MIT By: Jon Schlinkert diff --git a/packages/vitest/package.json b/packages/vitest/package.json index 1b9d7fb01d7a..3f4fc18da879 100644 --- a/packages/vitest/package.json +++ b/packages/vitest/package.json @@ -22,6 +22,7 @@ "test", "jest" ], + "sideEffects": false, "exports": { ".": { "require": { @@ -110,9 +111,11 @@ "@types/node": "*", "acorn": "^8.8.1", "acorn-walk": "^8.2.0", + "cac": "^6.7.14", "chai": "^4.3.7", "debug": "^4.3.4", "local-pkg": "^0.4.2", + "picocolors": "^1.0.0", "source-map": "^0.6.1", "strip-literal": "^1.0.0", "tinybench": "^2.3.1", @@ -136,7 +139,6 @@ "@vitest/ui": "workspace:*", "@vitest/utils": "workspace:*", "birpc": "^0.2.3", - "cac": "^6.7.14", "chai-subset": "^1.6.0", "cli-truncate": "^3.1.0", "diff": "^5.1.0", @@ -156,7 +158,6 @@ "natural-compare": "^1.4.0", "p-limit": "^4.0.0", "pathe": "^0.2.0", - "picocolors": "^1.0.0", "pkg-types": "^1.0.1", "pretty-format": "^27.5.1", "prompts": "^2.4.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a346a2d17a01..e798a93ee9d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -624,7 +624,6 @@ importers: local-pkg: ^0.4.2 mlly: ^1.0.0 modern-node-polyfills: 0.0.9 - picocolors: ^1.0.0 rollup: ^2.79.1 rollup-plugin-node-polyfills: ^0.2.1 sirv: ^2.0.2 @@ -638,7 +637,6 @@ importers: devDependencies: '@types/ws': 8.5.3 '@vitest/ws-client': link:../ws-client - picocolors: 1.0.0 rollup: 2.79.1 vitest: link:../vitest @@ -801,9 +799,11 @@ importers: source-map-support: ^0.5.21 vite: ^4.0.0 dependencies: + cac: 6.7.14 debug: 4.3.4 mlly: 1.0.0 pathe: 0.2.0 + picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 vite: 4.0.0 @@ -811,8 +811,6 @@ importers: '@types/debug': 4.1.7 '@types/source-map': 0.5.7 '@types/source-map-support': 0.5.6 - cac: 6.7.14 - picocolors: 1.0.0 rollup: 2.79.1 packages/vitest: @@ -880,9 +878,11 @@ importers: '@types/node': 18.7.13 acorn: 8.8.1 acorn-walk: 8.2.0 + cac: 6.7.14 chai: 4.3.7 debug: 4.3.4 local-pkg: 0.4.2 + picocolors: 1.0.0 source-map: 0.6.1 strip-literal: 1.0.0 tinybench: 2.3.1 @@ -905,7 +905,6 @@ importers: '@vitest/ui': link:../ui '@vitest/utils': link:../utils birpc: 0.2.3 - cac: 6.7.14 chai-subset: 1.6.0 cli-truncate: 3.1.0 diff: 5.1.0 @@ -925,7 +924,6 @@ importers: natural-compare: 1.4.0 p-limit: 4.0.0 pathe: 0.2.0 - picocolors: 1.0.0 pkg-types: 1.0.1 pretty-format: 27.5.1 prompts: 2.4.2 @@ -9928,7 +9926,6 @@ packages: /cac/6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - dev: true /cacache/12.0.4: resolution: {integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==} From 199776767a10bcd9f241e36a5cdd578c7d7c0dc2 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 3 Jan 2023 13:30:24 +0100 Subject: [PATCH 06/17] ci: set Node version to 16/18 (#2599) --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4615dd23d4a5..78dd9a7b62f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: - name: Set node uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x - name: Install run: pnpm i @@ -43,7 +43,7 @@ jobs: - name: Set node uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x - name: Install run: pnpm i @@ -62,12 +62,12 @@ jobs: strategy: matrix: os: [ubuntu-latest] - node_version: [14, 16] + node_version: [16, 18] include: - os: macos-latest - node_version: 16 + node_version: 18 - os: windows-latest - node_version: 16 + node_version: 18 fail-fast: false steps: From aeba4925fac2632ca7a20ab3f8762e6ef76cb52b Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 6 Jan 2023 11:19:50 +0100 Subject: [PATCH 07/17] test: fix windows tests (#2618) --- test/reporters/tests/reporters.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/reporters/tests/reporters.spec.ts b/test/reporters/tests/reporters.spec.ts index d26db9b953b7..52f680bb2308 100644 --- a/test/reporters/tests/reporters.spec.ts +++ b/test/reporters/tests/reporters.spec.ts @@ -185,7 +185,7 @@ test('JUnit reporter with outputFile in non-existing directory', async () => { expect(readFileSync(outputFile, 'utf8')).toMatchSnapshot() // Cleanup - rmSync(rootDirectory, { recursive: true }) + rmSync(outputFile) }) test('JUnit reporter with outputFile object in non-existing directory', async () => { @@ -214,7 +214,7 @@ test('JUnit reporter with outputFile object in non-existing directory', async () expect(readFileSync(outputFile, 'utf8')).toMatchSnapshot() // Cleanup - rmSync(rootDirectory, { recursive: true }) + rmSync(outputFile) }) test('json reporter', async () => { From f8ac2094253d267fa64a85ddb60511471813d00f Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 6 Jan 2023 12:00:31 +0100 Subject: [PATCH 08/17] fix: return mock path only when mocked (#2619) --- packages/vitest/src/runtime/mocker.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/vitest/src/runtime/mocker.ts b/packages/vitest/src/runtime/mocker.ts index 6846a6a25831..d111f0839570 100644 --- a/packages/vitest/src/runtime/mocker.ts +++ b/packages/vitest/src/runtime/mocker.ts @@ -377,8 +377,7 @@ export class VitestMocker { return result } if (typeof mock === 'string' && !callstack.includes(mock)) - url = mock - return url + return mock } public queueMock(id: string, importer: string, factory?: MockFactory) { From 9a29f9848201ae54586b3193035558f41d4fd8ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Fri, 6 Jan 2023 14:10:07 +0200 Subject: [PATCH 09/17] fix(coverage): flaky c8 coverage caused by parallel sourcemap constructing (#2591) Co-authored-by: Vladimir Fixes undefined --- packages/coverage-c8/src/provider.ts | 72 ++++--- .../__snapshots__/c8.report.test.ts.snap | 190 +++++++++++++++++- .../istanbul.report.test.ts.snap | 80 +++++++- test/coverage-test/src/Defined.vue | 13 ++ 4 files changed, 319 insertions(+), 36 deletions(-) diff --git a/packages/coverage-c8/src/provider.ts b/packages/coverage-c8/src/provider.ts index dc8621acaa7d..71ab00461f82 100644 --- a/packages/coverage-c8/src/provider.ts +++ b/packages/coverage-c8/src/provider.ts @@ -48,39 +48,61 @@ export class C8CoverageProvider implements CoverageProvider { takeCoverage() const report = createReport(this.ctx.config.coverage) + interface MapAndSource { map: RawSourceMap; source: string | undefined } + type SourceMapMeta = { url: string; filepath: string } & MapAndSource + // add source maps - const sourceMapMeta: Record = {} - await Promise.all(Array + const sourceMapMeta: Record = {} + + const entries = Array .from(this.ctx.vitenode.fetchCache.entries()) .filter(i => !i[0].includes('/node_modules/')) - .map(async ([file, { result }]) => { - const map = result.map - if (!map) - return + .map(([file, { result }]) => { + if (!result.map) + return null const filepath = file.split('?')[0] - const url = _url.pathToFileURL(filepath).href - - let code: string | undefined - try { - code = (await fs.readFile(filepath)).toString() - } - catch { } - - // Vite does not report full path in sourcemap sources - // so use an actual file path - const sources = [url] - - sourceMapMeta[url] = { + return { + filepath, + url: _url.pathToFileURL(filepath).href, + map: result.map, source: result.code, - map: { - sourcesContent: code ? [code] : undefined, - ...map, - sources, - }, } - })) + }) + .filter((entry) => { + if (!entry) + return false + + // Mappings and sourcesContent are needed for C8 to work + return ( + entry.map.mappings.length > 0 + && entry.map.sourcesContent + && entry.map.sourcesContent.length > 0 + && entry.map.sourcesContent[0].length > 0 + ) + }) as SourceMapMeta[] + + await Promise.all(entries.map(async ({ url, source, map, filepath }) => { + let code: string | undefined + try { + code = (await fs.readFile(filepath)).toString() + } + catch { } + + // Vite does not report full path in sourcemap sources + // so use an actual file path + const sources = [url] + + sourceMapMeta[url] = { + source, + map: { + sourcesContent: code ? [code] : undefined, + ...map, + sources, + }, + } + })) // This is a magic number. It corresponds to the amount of code // that we add in packages/vite-node/src/client.ts:114 (vm.runInThisContext) diff --git a/test/coverage-test/coverage-report-tests/__snapshots__/c8.report.test.ts.snap b/test/coverage-test/coverage-report-tests/__snapshots__/c8.report.test.ts.snap index 07f8eb6edfcf..d3f6fe9e7335 100644 --- a/test/coverage-test/coverage-report-tests/__snapshots__/c8.report.test.ts.snap +++ b/test/coverage-test/coverage-report-tests/__snapshots__/c8.report.test.ts.snap @@ -809,19 +809,63 @@ exports[`c8 json report 1`] = ` }, "/src/Defined.vue": { "all": false, - "b": {}, - "branchMap": {}, + "b": { + "0": [ + 0, + ], + }, + "branchMap": { + "0": { + "line": 6, + "loc": { + "end": { + "column": 36, + "line": 8, + }, + "start": { + "column": 33, + "line": 6, + }, + }, + "locations": [ + { + "end": { + "column": 36, + "line": 8, + }, + "start": { + "column": 33, + "line": 6, + }, + }, + ], + "type": "branch", + }, + }, "f": {}, "fnMap": {}, "path": "/src/Defined.vue", "s": { "0": 1, "1": 1, + "10": 1, + "11": 1, + "12": 1, + "13": 1, + "14": 1, + "15": 1, + "16": 1, + "17": 1, + "18": 1, + "19": 1, "2": 1, "3": 1, "4": 1, "5": 1, - "6": 1, + "6": 0, + "7": 0, + "8": 1, + "9": 1, }, "statementMap": { "0": { @@ -844,9 +888,109 @@ exports[`c8 json report 1`] = ` "line": 2, }, }, + "10": { + "end": { + "column": 10, + "line": 11, + }, + "start": { + "column": 0, + "line": 11, + }, + }, + "11": { + "end": { + "column": 15, + "line": 12, + }, + "start": { + "column": 0, + "line": 12, + }, + }, + "12": { + "end": { + "column": 11, + "line": 13, + }, + "start": { + "column": 0, + "line": 13, + }, + }, + "13": { + "end": { + "column": 0, + "line": 14, + }, + "start": { + "column": 0, + "line": 14, + }, + }, + "14": { + "end": { + "column": 90, + "line": 15, + }, + "start": { + "column": 0, + "line": 15, + }, + }, + "15": { + "end": { + "column": 25, + "line": 16, + }, + "start": { + "column": 0, + "line": 16, + }, + }, + "16": { + "end": { + "column": 6, + "line": 17, + }, + "start": { + "column": 0, + "line": 17, + }, + }, + "17": { + "end": { + "column": 25, + "line": 18, + }, + "start": { + "column": 0, + "line": 18, + }, + }, + "18": { + "end": { + "column": 1, + "line": 19, + }, + "start": { + "column": 0, + "line": 19, + }, + }, + "19": { + "end": { + "column": 8, + "line": 20, + }, + "start": { + "column": 0, + "line": 20, + }, + }, "2": { "end": { - "column": 9, + "column": 0, "line": 3, }, "start": { @@ -856,7 +1000,7 @@ exports[`c8 json report 1`] = ` }, "3": { "end": { - "column": 0, + "column": 31, "line": 4, }, "start": { @@ -866,7 +1010,7 @@ exports[`c8 json report 1`] = ` }, "4": { "end": { - "column": 10, + "column": 12, "line": 5, }, "start": { @@ -876,7 +1020,7 @@ exports[`c8 json report 1`] = ` }, "5": { "end": { - "column": 15, + "column": 34, "line": 6, }, "start": { @@ -886,7 +1030,7 @@ exports[`c8 json report 1`] = ` }, "6": { "end": { - "column": 11, + "column": 4, "line": 7, }, "start": { @@ -894,6 +1038,36 @@ exports[`c8 json report 1`] = ` "line": 7, }, }, + "7": { + "end": { + "column": 36, + "line": 8, + }, + "start": { + "column": 0, + "line": 8, + }, + }, + "8": { + "end": { + "column": 9, + "line": 9, + }, + "start": { + "column": 0, + "line": 9, + }, + }, + "9": { + "end": { + "column": 0, + "line": 10, + }, + "start": { + "column": 0, + "line": 10, + }, + }, }, }, "/src/Hello.vue": { diff --git a/test/coverage-test/coverage-report-tests/__snapshots__/istanbul.report.test.ts.snap b/test/coverage-test/coverage-report-tests/__snapshots__/istanbul.report.test.ts.snap index 1a268c4af53e..4894bfa52465 100644 --- a/test/coverage-test/coverage-report-tests/__snapshots__/istanbul.report.test.ts.snap +++ b/test/coverage-test/coverage-report-tests/__snapshots__/istanbul.report.test.ts.snap @@ -256,14 +256,58 @@ exports[`istanbul json report 1`] = ` }, }, "/src/Defined.vue": { - "b": {}, - "branchMap": {}, + "b": { + "0": [ + 1, + 0, + ], + }, + "branchMap": { + "0": { + "loc": { + "end": { + "column": null, + "line": 8, + }, + "start": { + "column": 0, + "line": 5, + }, + }, + "locations": [ + { + "end": { + "column": null, + "line": 8, + }, + "start": { + "column": 0, + "line": 5, + }, + }, + { + "end": { + "column": null, + "line": 8, + }, + "start": { + "column": 2, + "line": 8, + }, + }, + ], + "type": "if", + }, + }, "f": {}, "fnMap": {}, "path": "/src/Defined.vue", "s": { "0": 1, "1": 1, + "2": 1, + "3": 0, + "4": 1, }, "statementMap": { "0": { @@ -277,15 +321,45 @@ exports[`istanbul json report 1`] = ` }, }, "1": { + "end": { + "column": null, + "line": 8, + }, + "start": { + "column": 0, + "line": 5, + }, + }, + "2": { "end": { "column": null, "line": 6, }, "start": { - "column": 5, + "column": 2, "line": 6, }, }, + "3": { + "end": { + "column": null, + "line": 8, + }, + "start": { + "column": 2, + "line": 8, + }, + }, + "4": { + "end": { + "column": null, + "line": 12, + }, + "start": { + "column": 5, + "line": 12, + }, + }, }, }, "/src/Hello.vue": { diff --git a/test/coverage-test/src/Defined.vue b/test/coverage-test/src/Defined.vue index 4774d9d23160..0f116e00bebd 100644 --- a/test/coverage-test/src/Defined.vue +++ b/test/coverage-test/src/Defined.vue @@ -1,7 +1,20 @@ + + + From 6b3e36d4e9fd029984ce0f6a723ddb3fdce92379 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 6 Jan 2023 13:11:10 +0100 Subject: [PATCH 10/17] fix: allow mocking CJS module with interoped default (#2598) * fix: allow mocking CJS module with interoped default * chore: cleanup * chore: cleanup --- examples/mocks/src/external/default-function.cjs | 3 +++ examples/mocks/test/external.test.ts | 7 +++++++ examples/mocks/vite.config.ts | 1 + packages/vite-node/src/client.ts | 15 +++++++++++---- packages/vitest/src/runtime/execute.ts | 4 +++- 5 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 examples/mocks/src/external/default-function.cjs diff --git a/examples/mocks/src/external/default-function.cjs b/examples/mocks/src/external/default-function.cjs new file mode 100644 index 000000000000..6d33c32d8ead --- /dev/null +++ b/examples/mocks/src/external/default-function.cjs @@ -0,0 +1,3 @@ +module.exports = function () { + return true +} diff --git a/examples/mocks/test/external.test.ts b/examples/mocks/test/external.test.ts index fcdb8a631567..fe53d7d0aca2 100644 --- a/examples/mocks/test/external.test.ts +++ b/examples/mocks/test/external.test.ts @@ -1,7 +1,14 @@ import '../src/external/external.mjs' import { expect, test, vi } from 'vitest' import axios from 'axios' +import defaultFunc from '../src/external/default-function.cjs' + +vi.mock('../src/external/default-function.cjs') test('axios is mocked', () => { expect(vi.isMockFunction(axios.get)).toBe(true) }) + +test('defaultFunc is mocked', () => { + expect(vi.isMockFunction(defaultFunc)).toBe(true) +}) diff --git a/examples/mocks/vite.config.ts b/examples/mocks/vite.config.ts index 46dc4f567ccf..34f684a689f0 100644 --- a/examples/mocks/vite.config.ts +++ b/examples/mocks/vite.config.ts @@ -25,6 +25,7 @@ export default defineConfig({ environment: 'node', deps: { external: [/src\/external/], + interopDefault: true, }, }, }) diff --git a/packages/vite-node/src/client.ts b/packages/vite-node/src/client.ts index 7d7fa70bfc74..6286f0a87c40 100644 --- a/packages/vite-node/src/client.ts +++ b/packages/vite-node/src/client.ts @@ -424,6 +424,14 @@ export class ViteNodeRunner { const { mod, defaultExport } = interopModule(importedModule) + const modKeys = Reflect.ownKeys(mod) + let defaultKeys = !isPrimitive(defaultExport) ? Reflect.ownKeys(defaultExport) : [] + // remove reserved keys from default keys + if (typeof mod !== 'function' && typeof defaultExport === 'function') { + const reservedKeys = ['arguments', 'caller', 'prototype', 'name', 'length'] + defaultKeys = defaultKeys.filter(n => typeof n === 'string' && !reservedKeys.includes(n)) + } + return new Proxy(mod, { get(mod, prop) { if (prop === 'default') @@ -436,11 +444,10 @@ export class ViteNodeRunner { return prop in mod || (defaultExport && prop in defaultExport) }, // this is needed for mocker to know what is available to mock - ownKeys(mod) { - const keys = Reflect.ownKeys(mod) + ownKeys() { if (!defaultExport || isPrimitive(defaultExport)) - return keys - const allKeys = [...keys, 'default', ...Reflect.ownKeys(defaultExport)] + return modKeys + const allKeys = [...modKeys, 'default', ...defaultKeys] return Array.from(new Set(allKeys)) }, getOwnPropertyDescriptor(mod, prop) { diff --git a/packages/vitest/src/runtime/execute.ts b/packages/vitest/src/runtime/execute.ts index f08d2095f8c2..e624057ee83a 100644 --- a/packages/vitest/src/runtime/execute.ts +++ b/packages/vitest/src/runtime/execute.ts @@ -73,6 +73,8 @@ export class VitestRunner extends ViteNodeRunner { } shouldInterop(path: string, mod: any) { - return this.options.interopDefault ?? (getCurrentEnvironment() !== 'node' && super.shouldInterop(path, mod)) + if (this.options.interopDefault === false) + return false + return (this.options.interopDefault || getCurrentEnvironment() !== 'node') && super.shouldInterop(path, mod) } } From 59766fa48f922c6a5e2faddce50d747e410aa618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Fri, 6 Jan 2023 17:29:28 +0200 Subject: [PATCH 11/17] fix: avoid random ENOTEMPTY errors (#2620) --- packages/coverage-c8/src/provider.ts | 4 ++-- packages/coverage-istanbul/src/provider.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/coverage-c8/src/provider.ts b/packages/coverage-c8/src/provider.ts index 71ab00461f82..fe2dc132d25f 100644 --- a/packages/coverage-c8/src/provider.ts +++ b/packages/coverage-c8/src/provider.ts @@ -34,7 +34,7 @@ export class C8CoverageProvider implements CoverageProvider { async clean(clean = true) { if (clean && existsSync(this.options.reportsDirectory)) - await fs.rm(this.options.reportsDirectory, { recursive: true, force: true }) + await fs.rm(this.options.reportsDirectory, { recursive: true, force: true, maxRetries: 10 }) if (!existsSync(this.options.tempDirectory)) await fs.mkdir(this.options.tempDirectory, { recursive: true }) @@ -131,7 +131,7 @@ export class C8CoverageProvider implements CoverageProvider { // There will still be a temp directory with some reports when vitest exists, // but at least it will only contain reports of vitest's internal functions. if (existsSync(this.options.tempDirectory)) - await fs.rm(this.options.tempDirectory, { recursive: true, force: true }) + await fs.rm(this.options.tempDirectory, { recursive: true, force: true, maxRetries: 10 }) } } function resolveC8Options(options: CoverageC8Options, root: string) { diff --git a/packages/coverage-istanbul/src/provider.ts b/packages/coverage-istanbul/src/provider.ts index 25596de38031..77e4e5602be8 100644 --- a/packages/coverage-istanbul/src/provider.ts +++ b/packages/coverage-istanbul/src/provider.ts @@ -93,7 +93,7 @@ export class IstanbulCoverageProvider implements CoverageProvider { async clean(clean = true) { if (clean && existsSync(this.options.reportsDirectory)) - await fs.rm(this.options.reportsDirectory, { recursive: true, force: true }) + await fs.rm(this.options.reportsDirectory, { recursive: true, force: true, maxRetries: 10 }) this.coverages = [] } From bf87282c3530bd0c982455047e10d230f4acb317 Mon Sep 17 00:00:00 2001 From: Gurkiran Singh <61521805+g4rry420@users.noreply.github.com> Date: Sun, 8 Jan 2023 07:52:29 -0500 Subject: [PATCH 12/17] feat(coverage): istanbul coverage only for changed files (#2385) * feat: Istanbul Coverage only for changed Files Signed-off-by: GurkiranSingh * chore: latest pnpm install changes Signed-off-by: GurkiranSingh * chore: removed previous changes related to ctx.changedTests and watchAll config option Signed-off-by: GurkiranSingh * chore: cleanOnReRun=true and all=false if watch mode is enabled Signed-off-by: GurkiranSingh * chore: deleted example Signed-off-by: GurkiranSingh * chore: updated pnpm-lock file after deleting example Signed-off-by: GurkiranSingh * chore: change default value for clearOnReRun=true, since watch= true by default Signed-off-by: GurkiranSingh * chore: Updated pnpm-lock.yaml file Signed-off-by: GurkiranSingh * chore: Update pnpm-lock.yaml Signed-off-by: GurkiranSingh * chore: Update pnpm.yaml file as per in main branch Signed-off-by: GurkiranSingh Signed-off-by: GurkiranSingh --- docs/config/index.md | 2 +- packages/vitest/src/defaults.ts | 3 ++- packages/vitest/src/types/coverage.ts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/config/index.md b/docs/config/index.md index 477d86f844d7..d77d3c911219 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -635,7 +635,7 @@ Clean coverage results before running tests #### cleanOnRerun - **Type:** `boolean` -- **Default:** `false` +- **Default:** `true` - **Available for providers:** `'c8' | 'istanbul'` Clean coverage report on watch rerun diff --git a/packages/vitest/src/defaults.ts b/packages/vitest/src/defaults.ts index fa7be64ed08a..61d51640da0c 100644 --- a/packages/vitest/src/defaults.ts +++ b/packages/vitest/src/defaults.ts @@ -25,10 +25,11 @@ const defaultCoverageExcludes = [ ] const coverageConfigDefaults = { + all: false, provider: 'c8', enabled: false, clean: true, - cleanOnRerun: false, + cleanOnRerun: true, reportsDirectory: './coverage', excludeNodeModules: true, exclude: defaultCoverageExcludes, diff --git a/packages/vitest/src/types/coverage.ts b/packages/vitest/src/types/coverage.ts index 25426266d939..7dd202b6dca5 100644 --- a/packages/vitest/src/types/coverage.ts +++ b/packages/vitest/src/types/coverage.ts @@ -101,7 +101,7 @@ export interface BaseCoverageOptions { /** * Clean coverage report on watch rerun * - * @default false + * @default true */ cleanOnRerun?: boolean From 9eeee0c8d894a1bd95ccbb83ac364a9e83536937 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Sun, 8 Jan 2023 14:01:05 +0100 Subject: [PATCH 13/17] refactor: make ids in typecheck suites more reliable, store errors in array (#2597) * refactor: make ids in typecheck suites more reliable, store errors in array * chore: cleanup * Update packages/vitest/src/typecheck/typechecker.ts --- packages/vitest/src/node/core.ts | 24 +++-- packages/vitest/src/node/reporters/base.ts | 16 ++-- .../node/reporters/renderers/listRenderer.ts | 6 +- .../src/node/reporters/renderers/utils.ts | 4 + packages/vitest/src/runtime/collect.ts | 28 +----- packages/vitest/src/typecheck/collect.ts | 75 +++++++++------ packages/vitest/src/typecheck/constants.ts | 2 - packages/vitest/src/typecheck/parse.ts | 14 +-- packages/vitest/src/typecheck/typechecker.ts | 59 +++++++----- packages/vitest/src/types/tasks.ts | 7 +- packages/vitest/src/utils/collect.ts | 20 ++++ packages/vitest/src/utils/tasks.ts | 21 +---- test/typescript/failing/fail.test-d.ts | 1 + .../test/__snapshots__/runner.test.ts.snap | 92 +++++++++++++------ test/typescript/test/runner.test.ts | 14 ++- 15 files changed, 221 insertions(+), 162 deletions(-) delete mode 100644 packages/vitest/src/typecheck/constants.ts diff --git a/packages/vitest/src/node/core.ts b/packages/vitest/src/node/core.ts index f7c5f40dd39d..74104d8df29d 100644 --- a/packages/vitest/src/node/core.ts +++ b/packages/vitest/src/node/core.ts @@ -71,7 +71,7 @@ export class Vitest { this.cache = new VitestCache() this.snapshot = new SnapshotManager({ ...resolved.snapshotOptions }) - if (this.config.watch) + if (this.config.watch && this.mode !== 'typecheck') this.registerWatcher() this.vitenode = new ViteNodeServer(server, this.config) @@ -154,8 +154,9 @@ export class Vitest { ) as ResolvedConfig } - async typecheck(filters?: string[]) { - const testsFilesList = await this.globTestFiles(filters) + async typecheck(filters: string[] = []) { + const { include, exclude } = this.config.typecheck + const testsFilesList = await this.globFiles(filters, include, exclude) const checker = new Typechecker(this, testsFilesList) this.typechecker = checker checker.onParseEnd(async ({ files, sourceErrors }) => { @@ -198,6 +199,7 @@ export class Vitest { await this.report('onTaskUpdate', checker.getTestPacks()) await this.report('onCollected') }) + await checker.prepare() await checker.collectTests() await checker.start() } @@ -562,9 +564,7 @@ export class Vitest { ))) } - async globTestFiles(filters: string[] = []) { - const { include, exclude, includeSource } = this.config - + async globFiles(filters: string[], include: string[], exclude: string[]) { const globOptions: fg.Options = { absolute: true, dot: true, @@ -580,10 +580,16 @@ export class Vitest { if (filters.length) testFiles = testFiles.filter(i => filters.some(f => i.includes(f))) + return testFiles + } + + async globTestFiles(filters: string[] = []) { + const { include, exclude, includeSource } = this.config + + const testFiles = await this.globFiles(filters, include, exclude) + if (includeSource) { - let files = await fg(includeSource, globOptions) - if (filters.length) - files = files.filter(i => filters.some(f => i.includes(f))) + const files = await this.globFiles(filters, includeSource, exclude) await Promise.all(files.map(async (file) => { try { diff --git a/packages/vitest/src/node/reporters/base.ts b/packages/vitest/src/node/reporters/base.ts index b951de4c2b62..0127f594cadd 100644 --- a/packages/vitest/src/node/reporters/base.ts +++ b/packages/vitest/src/node/reporters/base.ts @@ -1,10 +1,10 @@ import { performance } from 'perf_hooks' import c from 'picocolors' import type { ErrorWithDiff, File, Reporter, Task, TaskResultPack, UserConsoleLog } from '../../types' -import { clearInterval, getFullName, getSuites, getTests, getTypecheckTests, hasFailed, hasFailedSnapshot, isNode, relativePath, setInterval } from '../../utils' +import { clearInterval, getFullName, getSuites, getTests, hasFailed, hasFailedSnapshot, isNode, relativePath, setInterval } from '../../utils' import type { Vitest } from '../../node' import { F_RIGHT } from '../../utils/figures' -import { divider, formatProjectName, formatTimeString, getStateString, getStateSymbol, pointer, renderSnapshotSummary } from './renderers/utils' +import { countTestErrors, divider, formatProjectName, formatTimeString, getStateString, getStateSymbol, pointer, renderSnapshotSummary } from './renderers/utils' const BADGE_PADDING = ' ' const HELP_HINT = `${c.dim('press ')}${c.bold('h')}${c.dim(' to show help')}` @@ -202,7 +202,7 @@ export abstract class BaseReporter implements Reporter { } async reportTestSummary(files: File[]) { - const tests = this.mode === 'typecheck' ? getTypecheckTests(files) : getTests(files) + const tests = getTests(files) const logger = this.ctx.logger const executionTime = this.end - this.start @@ -240,9 +240,8 @@ export abstract class BaseReporter implements Reporter { logger.log(padTitle('Test Files'), getStateString(files)) logger.log(padTitle('Tests'), getStateString(tests)) if (this.mode === 'typecheck') { - // has only failed checks - const typechecks = getTests(files).filter(t => t.type === 'typecheck') - logger.log(padTitle('Type Errors'), getStateString(typechecks, 'errors', false)) + const failed = tests.filter(t => t.meta?.typecheck && t.result?.errors?.length) + logger.log(padTitle('Type Errors'), failed.length ? c.bold(c.red(`${failed} failed`)) : c.dim('no errors')) } logger.log(padTitle('Start at'), formatTimeString(this._timeStart)) if (this.watchFilters) @@ -262,7 +261,7 @@ export abstract class BaseReporter implements Reporter { const failedSuites = suites.filter(i => i.result?.errors) const failedTests = tests.filter(i => i.result?.state === 'fail') - const failedTotal = failedSuites.length + failedTests.length + const failedTotal = countTestErrors(failedSuites) + countTestErrors(failedTests) let current = 1 @@ -275,8 +274,7 @@ export abstract class BaseReporter implements Reporter { } if (failedTests.length) { - const message = this.mode === 'typecheck' ? 'Type Errors' : 'Failed Tests' - logger.error(c.red(divider(c.bold(c.inverse(` ${message} ${failedTests.length} `))))) + logger.error(c.red(divider(c.bold(c.inverse(` Failed Tests ${failedTests.length} `))))) logger.error() await this.printTaskErrors(failedTests, errorDivider) diff --git a/packages/vitest/src/node/reporters/renderers/listRenderer.ts b/packages/vitest/src/node/reporters/renderers/listRenderer.ts index 316b6d75664a..d9e353593ec4 100644 --- a/packages/vitest/src/node/reporters/renderers/listRenderer.ts +++ b/packages/vitest/src/node/reporters/renderers/listRenderer.ts @@ -2,7 +2,7 @@ import c from 'picocolors' import cliTruncate from 'cli-truncate' import stripAnsi from 'strip-ansi' import type { Benchmark, BenchmarkResult, SuiteHooks, Task, VitestRunMode } from '../../../types' -import { clearInterval, getTests, getTypecheckTests, isTypecheckTest, notNullish, setInterval } from '../../../utils' +import { clearInterval, getTests, notNullish, setInterval } from '../../../utils' import { F_RIGHT } from '../../../utils/figures' import type { Logger } from '../../logger' import { formatProjectName, getCols, getHookStateSymbol, getStateSymbol } from './utils' @@ -99,8 +99,8 @@ export function renderTree(tasks: Task[], options: ListRendererOptions, level = if (task.type === 'test' && task.result?.retryCount && task.result.retryCount > 1) suffix += c.yellow(` (retry x${task.result.retryCount})`) - if (task.type === 'suite' && !isTypecheckTest(task)) { - const tests = options.mode === 'typecheck' ? getTypecheckTests(task) : getTests(task) + if (task.type === 'suite' && !task.meta?.typecheck) { + const tests = getTests(task) suffix += c.dim(` (${tests.length})`) } diff --git a/packages/vitest/src/node/reporters/renderers/utils.ts b/packages/vitest/src/node/reporters/renderers/utils.ts index cd7c215efd0e..8d0313677da6 100644 --- a/packages/vitest/src/node/reporters/renderers/utils.ts +++ b/packages/vitest/src/node/reporters/renderers/utils.ts @@ -91,6 +91,10 @@ export function renderSnapshotSummary(rootDir: string, snapshots: SnapshotSummar return summary } +export function countTestErrors(tasks: Task[]) { + return tasks.reduce((c, i) => c + (i.result?.errors?.length || 0), 0) +} + export function getStateString(tasks: Task[], name = 'tests', showTotal = true) { if (tasks.length === 0) return c.dim(`no ${name}`) diff --git a/packages/vitest/src/runtime/collect.ts b/packages/vitest/src/runtime/collect.ts index c1930e468fb9..7d15461f951a 100644 --- a/packages/vitest/src/runtime/collect.ts +++ b/packages/vitest/src/runtime/collect.ts @@ -1,6 +1,6 @@ -import type { File, ResolvedConfig, Suite } from '../types' +import type { File, ResolvedConfig } from '../types' import { getWorkerState, isBrowser, relativePath } from '../utils' -import { interpretTaskModes, someTasksAreOnly } from '../utils/collect' +import { calculateSuiteHash, generateHash, interpretTaskModes, someTasksAreOnly } from '../utils/collect' import { clearCollectorContext, defaultSuite } from './suite' import { getHooks, setHooks } from './map' import { processError } from './error' @@ -9,18 +9,6 @@ import { runSetupFiles } from './setup' const now = Date.now -function hash(str: string): string { - let hash = 0 - if (str.length === 0) - return `${hash}` - for (let i = 0; i < str.length; i++) { - const char = str.charCodeAt(i) - hash = (hash << 5) - hash + char - hash = hash & hash // Convert to 32bit integer - } - return `${hash}` -} - export async function collectTests(paths: string[], config: ResolvedConfig): Promise { const files: File[] = [] const browserHashMap = getWorkerState().browserHashMap! @@ -37,7 +25,7 @@ export async function collectTests(paths: string[], config: ResolvedConfig): Pro for (const filepath of paths) { const path = relativePath(config.root, filepath) const file: File = { - id: hash(path), + id: generateHash(path), name: path, type: 'suite', mode: 'run', @@ -92,7 +80,7 @@ export async function collectTests(paths: string[], config: ResolvedConfig): Pro console.error(e) } - calculateHash(file) + calculateSuiteHash(file) const hasOnlyTasks = someTasksAreOnly(file) interpretTaskModes(file, config.testNamePattern, hasOnlyTasks, false, config.allowOnly) @@ -102,11 +90,3 @@ export async function collectTests(paths: string[], config: ResolvedConfig): Pro return files } - -function calculateHash(parent: Suite) { - parent.tasks.forEach((t, idx) => { - t.id = `${parent.id}_${idx}` - if (t.type === 'suite') - calculateHash(t) - }) -} diff --git a/packages/vitest/src/typecheck/collect.ts b/packages/vitest/src/typecheck/collect.ts index 5c7609bba15c..0916b499be13 100644 --- a/packages/vitest/src/typecheck/collect.ts +++ b/packages/vitest/src/typecheck/collect.ts @@ -3,15 +3,19 @@ import { parse as parseAst } from 'acorn' import { ancestor as walkAst } from 'acorn-walk' import type { RawSourceMap } from 'vite-node' -import type { File, Suite, Vitest } from '../types' -import { interpretTaskModes, someTasksAreOnly } from '../utils/collect' -import { TYPECHECK_SUITE } from './constants' +import type { File, Suite, Test, Vitest } from '../types' +import { calculateSuiteHash, generateHash, interpretTaskModes, someTasksAreOnly } from '../utils/collect' interface ParsedFile extends File { start: number end: number } +interface ParsedTest extends Test { + start: number + end: number +} + interface ParsedSuite extends Suite { start: number end: number @@ -21,9 +25,9 @@ interface LocalCallDefinition { start: number end: number name: string - type: string + type: 'suite' | 'test' mode: 'run' | 'skip' | 'only' | 'todo' - task: ParsedSuite | ParsedFile + task: ParsedSuite | ParsedFile | ParsedTest } export interface FileInformation { @@ -42,18 +46,16 @@ export async function collectTests(ctx: Vitest, filepath: string): Promise { @@ -80,14 +82,17 @@ export async function collectTests(ctx: Vitest, filepath: string): Promise a.start - b.start).forEach((definition, idx) => { + definitions.sort((a, b) => a.start - b.start).forEach((definition) => { const latestSuite = updateLatestSuite(definition.start) let mode = definition.mode if (latestSuite.mode !== 'run') // inherit suite mode, if it's set mode = latestSuite.mode - const state = mode === 'run' ? 'pass' : mode - // expectTypeOf and any type error is actually a "test" ("typecheck"), - // and all "test"s should be inside a "suite", so semantics inside typecheck for "test" changes - // if we ever allow having multiple errors in a test, we can change type to "test" - const task: ParsedSuite = { - type: 'suite', - id: idx.toString(), + if (definition.type === 'suite') { + const task: ParsedSuite = { + type: definition.type, + id: '', + suite: latestSuite, + file, + tasks: [], + mode, + name: definition.name, + end: definition.end, + start: definition.start, + meta: { + typecheck: true, + }, + } + definition.task = task + latestSuite.tasks.push(task) + lastSuite = task + return + } + const task: ParsedTest = { + type: definition.type, + id: '', suite: latestSuite, file, - tasks: [], mode, + context: {} as any, // not used in typecheck name: definition.name, end: definition.end, start: definition.start, - result: { - state, + meta: { + typecheck: true, }, } definition.task = task latestSuite.tasks.push(task) - if (definition.type === 'describe' || definition.type === 'suite') - lastSuite = task - else - // to show correct amount of "tests" in summary, we mark this with a special symbol - Object.defineProperty(task, TYPECHECK_SUITE, { value: true }) }) + calculateSuiteHash(file) const hasOnly = someTasksAreOnly(file) interpretTaskModes(file, ctx.config.testNamePattern, hasOnly, false, ctx.config.allowOnly) return { diff --git a/packages/vitest/src/typecheck/constants.ts b/packages/vitest/src/typecheck/constants.ts deleted file mode 100644 index c52d92249ff7..000000000000 --- a/packages/vitest/src/typecheck/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const EXPECT_TYPEOF_MATCHERS = Symbol('vitest:expect-typeof-matchers') -export const TYPECHECK_SUITE = Symbol('vitest:typecheck-suite') diff --git a/packages/vitest/src/typecheck/parse.ts b/packages/vitest/src/typecheck/parse.ts index 982ef5f15542..39a1ad7f1b4a 100644 --- a/packages/vitest/src/typecheck/parse.ts +++ b/packages/vitest/src/typecheck/parse.ts @@ -1,7 +1,7 @@ -import path from 'node:path' import url from 'node:url' import { writeFile } from 'node:fs/promises' -import { getTsconfig } from 'get-tsconfig' +import { join } from 'pathe' +import { getTsconfig as getTsconfigContent } from 'get-tsconfig' import type { TypecheckConfig } from '../types' import type { RawErrsMap, TscErrorInfo } from './types' @@ -57,14 +57,14 @@ export async function makeTscErrorInfo( ] } -export async function getTsconfigPath(root: string, config: TypecheckConfig) { - const tempConfigPath = path.join(root, 'tsconfig.temp.json') +export async function getTsconfig(root: string, config: TypecheckConfig) { + const tempConfigPath = join(root, 'tsconfig.temp.json') const configName = config.tsconfig?.includes('jsconfig.json') ? 'jsconfig.json' : undefined - const tsconfig = getTsconfig(config.tsconfig || root, configName) + const tsconfig = getTsconfigContent(config.tsconfig || root, configName) if (!tsconfig) throw new Error('no tsconfig.json found') @@ -75,14 +75,14 @@ export async function getTsconfigPath(root: string, config: TypecheckConfig) { tmpTsConfig.compilerOptions = tmpTsConfig.compilerOptions || {} tmpTsConfig.compilerOptions.emitDeclarationOnly = false tmpTsConfig.compilerOptions.incremental = true - tmpTsConfig.compilerOptions.tsBuildInfoFile = path.join( + tmpTsConfig.compilerOptions.tsBuildInfoFile = join( __dirname, 'tsconfig.tmp.tsbuildinfo', ) const tsconfigFinalContent = JSON.stringify(tmpTsConfig, null, 2) await writeFile(tempConfigPath, tsconfigFinalContent) - return tempConfigPath + return { path: tempConfigPath, config: tmpTsConfig } } catch (err) { throw new Error('failed to write tsconfig.temp.json', { cause: err }) diff --git a/packages/vitest/src/typecheck/typechecker.ts b/packages/vitest/src/typecheck/typechecker.ts index fd322e72a164..354f76532bbe 100644 --- a/packages/vitest/src/typecheck/typechecker.ts +++ b/packages/vitest/src/typecheck/typechecker.ts @@ -1,11 +1,11 @@ import { rm } from 'node:fs/promises' import type { ExecaChildProcess } from 'execa' import { execa } from 'execa' -import { resolve } from 'pathe' +import { extname, resolve } from 'pathe' import { SourceMapConsumer } from 'source-map' import { ensurePackageInstalled } from '../utils' import type { Awaitable, File, ParsedStack, Task, TaskResultPack, TaskState, TscErrorInfo, Vitest } from '../types' -import { getRawErrsMapFromTsCompile, getTsconfigPath } from './parse' +import { getRawErrsMapFromTsCompile, getTsconfig } from './parse' import { createIndexMap } from './utils' import type { FileInformation } from './collect' import { collectTests } from './collect' @@ -36,6 +36,7 @@ export class Typechecker { private _tests: Record | null = {} private tempConfigPath?: string + private allowJs?: boolean private process!: ExecaChildProcess constructor(protected ctx: Vitest, protected files: string[]) {} @@ -56,9 +57,16 @@ export class Typechecker { return collectTests(this.ctx, filepath) } + protected getFiles() { + return this.files.filter((filename) => { + const extension = extname(filename) + return extension !== '.js' || this.allowJs + }) + } + public async collectTests() { const tests = (await Promise.all( - this.files.map(filepath => this.collectFileTests(filepath)), + this.getFiles().map(filepath => this.collectFileTests(filepath)), )).reduce((acc, data) => { if (!data) return acc @@ -71,7 +79,7 @@ export class Typechecker { protected async prepareResults(output: string) { const typeErrors = await this.parseTscLikeOutput(output) - const testFiles = new Set(this.files) + const testFiles = new Set(this.getFiles()) if (!this._tests) this._tests = await this.collectTests() @@ -96,31 +104,24 @@ export class Typechecker { if (task.suite) markFailed(task.suite) } - errors.forEach(({ error, originalError }, idx) => { + errors.forEach(({ error, originalError }) => { const originalPos = mapConsumer?.generatedPositionFor({ line: originalError.line, column: originalError.column, source: path, }) || originalError const index = indexMap.get(`${originalPos.line}:${originalPos.column}`) - const definition = (index != null && sortedDefinitions.find(def => def.start <= index && def.end >= index)) || file - const suite = 'task' in definition ? definition.task : definition + const definition = (index != null && sortedDefinitions.find(def => def.start <= index && def.end >= index)) + const suite = definition ? definition.task : file const state: TaskState = suite.mode === 'run' || suite.mode === 'only' ? 'fail' : suite.mode - const task: Task = { - type: 'typecheck', - id: `${path}${idx.toString()}`, - name: `error expect ${idx + 1}`, // TODO naming - mode: suite.mode, - file, - suite, - result: { - state, - error: state === 'fail' ? error : undefined, - }, + const errors = suite.result?.errors || [] + suite.result = { + state, + errors, } - if (state === 'fail') - markFailed(suite) - suite.tasks.push(task) + errors.push(error) + if (state === 'fail' && suite.suite) + markFailed(suite.suite) }) }) @@ -179,11 +180,22 @@ export class Typechecker { await ensurePackageInstalled(packageName, root) } + public async prepare() { + const { root, typecheck } = this.ctx.config + await this.ensurePackageInstalled(root, typecheck.checker) + + const { config, path } = await getTsconfig(root, typecheck) + + this.tempConfigPath = path + this.allowJs = typecheck.allowJs || config.allowJs || false + } + public async start() { + if (!this.tempConfigPath) + throw new Error('tsconfig was not initialized') + const { root, watch, typecheck } = this.ctx.config - await this.ensurePackageInstalled(root, typecheck.checker) - this.tempConfigPath = await getTsconfigPath(root, typecheck) const args = ['--noEmit', '--pretty', 'false', '-p', this.tempConfigPath] // use builtin watcher, because it's faster if (watch) @@ -223,7 +235,6 @@ export class Typechecker { await child this._result = await this.prepareResults(output) await this._onParseEnd?.(this._result) - await this.clear() } } diff --git a/packages/vitest/src/types/tasks.ts b/packages/vitest/src/types/tasks.ts index 18918866565a..da62441943ce 100644 --- a/packages/vitest/src/types/tasks.ts +++ b/packages/vitest/src/types/tasks.ts @@ -16,6 +16,7 @@ export interface TaskBase { result?: TaskResult retry?: number logs?: UserConsoleLog[] + meta?: any } export interface TaskResult { @@ -59,11 +60,7 @@ export interface Test extends TaskBase { onFailed?: OnTestFailedHandler[] } -export interface TypeCheck extends TaskBase { - type: 'typecheck' -} - -export type Task = Test | Suite | File | Benchmark | TypeCheck +export type Task = Test | Suite | File | Benchmark export type DoneCallback = (error?: any) => void export type TestFunction = (context: TestContext & ExtraContext) => Awaitable | void diff --git a/packages/vitest/src/utils/collect.ts b/packages/vitest/src/utils/collect.ts index e26d2ecc70b8..169af606ccef 100644 --- a/packages/vitest/src/utils/collect.ts +++ b/packages/vitest/src/utils/collect.ts @@ -70,3 +70,23 @@ function checkAllowOnly(task: TaskBase, allowOnly?: boolean) { error: new Error('[Vitest] Unexpected .only modifier. Remove it or pass --allowOnly argument to bypass this error'), } } + +export function generateHash(str: string): string { + let hash = 0 + if (str.length === 0) + return `${hash}` + for (let i = 0; i < str.length; i++) { + const char = str.charCodeAt(i) + hash = (hash << 5) - hash + char + hash = hash & hash // Convert to 32bit integer + } + return `${hash}` +} + +export function calculateSuiteHash(parent: Suite) { + parent.tasks.forEach((t, idx) => { + t.id = `${parent.id}_${idx}` + if (t.type === 'suite') + calculateSuiteHash(t) + }) +} diff --git a/packages/vitest/src/utils/tasks.ts b/packages/vitest/src/utils/tasks.ts index efc1b892caa0..70c547567b83 100644 --- a/packages/vitest/src/utils/tasks.ts +++ b/packages/vitest/src/utils/tasks.ts @@ -1,27 +1,14 @@ -import type { Arrayable, Benchmark, Suite, Task, Test, TypeCheck } from '../types' -import { TYPECHECK_SUITE } from '../typecheck/constants' +import type { Arrayable, Benchmark, Suite, Task, Test } from '../types' import { toArray } from './base' -function isAtomTest(s: Task): s is Test | Benchmark | TypeCheck { - return (s.type === 'test' || s.type === 'benchmark' || s.type === 'typecheck') +function isAtomTest(s: Task): s is Test | Benchmark { + return (s.type === 'test' || s.type === 'benchmark') } -export function getTests(suite: Arrayable): (Test | Benchmark | TypeCheck)[] { +export function getTests(suite: Arrayable): (Test | Benchmark)[] { return toArray(suite).flatMap(s => isAtomTest(s) ? [s] : s.tasks.flatMap(c => isAtomTest(c) ? [c] : getTests(c))) } -export function isTypecheckTest(suite: Task): suite is Suite { - return TYPECHECK_SUITE in suite -} - -export function getTypecheckTests(suite: Arrayable): Suite[] { - return toArray(suite).flatMap((s) => { - if (s.type !== 'suite') - return [] - return TYPECHECK_SUITE in s ? [s, ...getTypecheckTests(s.tasks)] : getTypecheckTests(s.tasks) - }) -} - export function getTasks(tasks: Arrayable = []): Task[] { return toArray(tasks).flatMap(s => isAtomTest(s) ? [s] : [s, ...getTasks(s.tasks)]) } diff --git a/test/typescript/failing/fail.test-d.ts b/test/typescript/failing/fail.test-d.ts index b05bbbceb1f1..0ebd21d7ad90 100644 --- a/test/typescript/failing/fail.test-d.ts +++ b/test/typescript/failing/fail.test-d.ts @@ -8,6 +8,7 @@ describe('nested suite', () => { describe('nested 2', () => { test('failing test 2', () => { expectTypeOf(1).toBeVoid() + expectTypeOf(1).toBeUndefined() }) }) diff --git a/test/typescript/test/__snapshots__/runner.test.ts.snap b/test/typescript/test/__snapshots__/runner.test.ts.snap index fedcd22e556b..45f2f244e2c5 100644 --- a/test/typescript/test/__snapshots__/runner.test.ts.snap +++ b/test/typescript/test/__snapshots__/runner.test.ts.snap @@ -1,54 +1,88 @@ // Vitest Snapshot v1 -exports[`should fails > typecheck files > expect-error.test-d.ts 1`] = ` -" ❯ expect-error.test-d.ts:4:3 +exports[`should fails > typecheck files 1`] = ` +"TypeCheckError: Expected 1 arguments, but got 0. +TypeCheckError: Expected 1 arguments, but got 0. +TypeCheckError: Expected 1 arguments, but got 0. +TypeCheckError: Expected 1 arguments, but got 0. +TypeCheckError: Expected 1 arguments, but got 0. +TypeCheckError: Unused '@ts-expect-error' directive. +TypeCheckError: Expected 1 arguments, but got 0." +`; + +exports[`should fails > typecheck files 2`] = ` +" FAIL fail.test-d.ts > nested suite +TypeCheckError: Expected 1 arguments, but got 0. + ❯ fail.test-d.ts:15:19 + 13| }) + 14| + 15| expectTypeOf(1).toBeVoid() + | ^ + 16| })" +`; + +exports[`should fails > typecheck files 3`] = ` +" FAIL expect-error.test-d.ts > failing test with expect-error +TypeCheckError: Unused '@ts-expect-error' directive. + ❯ expect-error.test-d.ts:4:3 2| 3| test('failing test with expect-error', () => { 4| // @ts-expect-error expect nothing | ^ - 5| expectTypeOf(1).toEqualTypeOf() - 6| }) -" + 5| expectTypeOf(1).toEqualTypeOf()" `; -exports[`should fails > typecheck files > fail.test-d.ts 1`] = ` -" ❯ fail.test-d.ts:4:19 +exports[`should fails > typecheck files 4`] = ` +" FAIL fail.test-d.ts > failing test +TypeCheckError: Expected 1 arguments, but got 0. + ❯ fail.test-d.ts:4:19 2| 3| test('failing test', () => { 4| expectTypeOf(1).toEqualTypeOf() | ^ - 5| }) - 6| -" + 5| })" `; -exports[`should fails > typecheck files > js-fail.test-d.js 1`] = ` -" ❯ js-fail.test-d.js:6:19 +exports[`should fails > typecheck files 5`] = ` +" FAIL fail.test-d.ts > nested suite > nested 2 > failing test 2 +TypeCheckError: Expected 1 arguments, but got 0. + ❯ fail.test-d.ts:10:23 + 8| describe('nested 2', () => { + 9| test('failing test 2', () => { + 10| expectTypeOf(1).toBeVoid() + | ^ + 11| expectTypeOf(1).toBeUndefined()" +`; + +exports[`should fails > typecheck files 6`] = ` +" FAIL fail.test-d.ts > nested suite > nested 2 > failing test 2 +TypeCheckError: Expected 1 arguments, but got 0. + ❯ fail.test-d.ts:11:23 + 9| test('failing test 2', () => { + 10| expectTypeOf(1).toBeVoid() + 11| expectTypeOf(1).toBeUndefined() + | ^ + 12| })" +`; + +exports[`should fails > typecheck files 7`] = ` +" FAIL js-fail.test-d.js > js test fails +TypeCheckError: Expected 1 arguments, but got 0. + ❯ js-fail.test-d.js:6:19 4| 5| test('js test fails', () => { 6| expectTypeOf(1).toBeArray() | ^ - 7| }) - 8| -" + 7| })" `; -exports[`should fails > typecheck files > only.test-d.ts 1`] = ` -" ❯ only.test-d.ts:4:19 +exports[`should fails > typecheck files 8`] = ` +" FAIL only.test-d.ts > failing test +TypeCheckError: Expected 1 arguments, but got 0. + ❯ only.test-d.ts:4:19 2| 3| test.only('failing test', () => { 4| expectTypeOf(1).toEqualTypeOf() | ^ - 5| }) - 6| -" -`; - -exports[`should fails > typecheck files 1`] = ` -"TypeCheckError: Expected 1 arguments, but got 0. -TypeCheckError: Expected 1 arguments, but got 0. -TypeCheckError: Expected 1 arguments, but got 0. -TypeCheckError: Expected 1 arguments, but got 0. -TypeCheckError: Expected 1 arguments, but got 0. -TypeCheckError: Unused '@ts-expect-error' directive." + 5| })" `; diff --git a/test/typescript/test/runner.test.ts b/test/typescript/test/runner.test.ts index 31f5c3360f7f..fe6798ef223d 100644 --- a/test/typescript/test/runner.test.ts +++ b/test/typescript/test/runner.test.ts @@ -16,7 +16,7 @@ describe('should fails', async () => { 'vitest', 'typecheck', '--dir', - 'failing', + resolve(__dirname, '..', './failing'), '--config', resolve(__dirname, './vitest.config.ts'), ], { @@ -37,12 +37,18 @@ describe('should fails', async () => { .join('\n') .trim() .replace(root, '') + expect(stderr).not.toMatch('files found, exiting with code') expect(msg).toMatchSnapshot() files.forEach((file) => { - const index = lines.findIndex(val => val.includes(`${file}:`)) - const msg = lines.slice(index, index + 8).join('\n') - expect(msg).toMatchSnapshot(file) + expect(String(stderr)).toMatch(`${file}:`) + }) + + lines.forEach((line, idx) => { + if (line.includes('TypeCheckError')) { + const msg = lines.slice(idx - 1, idx + 7).join('\n') + expect(msg).toMatchSnapshot() + } }) }, 30_000) }) From fed1cd605fb5e7a47c70519290c8e4f04a9e3449 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Sun, 8 Jan 2023 14:01:31 +0100 Subject: [PATCH 14/17] fix: always inline assets and modules with special Vite queries (#2617) * fix: always inline assets and modules with special queries * chore: cleanup * refactor: cleanup --- packages/vite-node/src/externalize.ts | 39 +++++++++++++++++ packages/vite-node/src/utils.ts | 4 -- .../vitest/src/node/plugins/cssEnabler.ts | 2 +- test/core/test/imports.test.ts | 43 ++++++++++++++++++- 4 files changed, 82 insertions(+), 6 deletions(-) diff --git a/packages/vite-node/src/externalize.ts b/packages/vite-node/src/externalize.ts index c6f5007bfaed..b388593a5719 100644 --- a/packages/vite-node/src/externalize.ts +++ b/packages/vite-node/src/externalize.ts @@ -3,12 +3,51 @@ import { isNodeBuiltin, isValidNodeImport } from 'mlly' import type { DepsHandlingOptions } from './types' import { slash } from './utils' +const KNOWN_ASSET_TYPES = [ + // images + 'png', + 'jpe?g', + 'jfif', + 'pjpeg', + 'pjp', + 'gif', + 'svg', + 'ico', + 'webp', + 'avif', + + // media + 'mp4', + 'webm', + 'ogg', + 'mp3', + 'wav', + 'flac', + 'aac', + + // fonts + 'woff2?', + 'eot', + 'ttf', + 'otf', + + // other + 'webmanifest', + 'pdf', + 'txt', +] + const ESM_EXT_RE = /\.(es|esm|esm-browser|esm-bundler|es6|module)\.js$/ const ESM_FOLDER_RE = /\/(es|esm)\/(.*\.js)$/ const defaultInline = [ /virtual:/, /\.[mc]?ts$/, + + // special Vite query strings + /[?&](init|raw|url|inline)\b/, + // Vite returns a string for assets imports, even if it's inside "node_modules" + new RegExp(`\\.(${KNOWN_ASSET_TYPES.join('|')})$`), ] const depsExternal = [ diff --git a/packages/vite-node/src/utils.ts b/packages/vite-node/src/utils.ts index c98ef475c24d..e11f22f6ffaf 100644 --- a/packages/vite-node/src/utils.ts +++ b/packages/vite-node/src/utils.ts @@ -9,10 +9,6 @@ export function slash(str: string) { return str.replace(/\\/g, '/') } -export function mergeSlashes(str: string) { - return str.replace(/\/\//g, '/') -} - export const VALID_ID_PREFIX = '/@id/' export function normalizeRequestId(id: string, base?: string): string { diff --git a/packages/vitest/src/node/plugins/cssEnabler.ts b/packages/vitest/src/node/plugins/cssEnabler.ts index fda273615eb6..43d151a11bce 100644 --- a/packages/vitest/src/node/plugins/cssEnabler.ts +++ b/packages/vitest/src/node/plugins/cssEnabler.ts @@ -70,7 +70,7 @@ export function CSSEnablerPlugin(ctx: Vitest): VitePlugin[] { return { code } } - return { code: '' } + return { code: 'export default ""' } }, }, ] diff --git a/test/core/test/imports.test.ts b/test/core/test/imports.test.ts index 9ec6e9a34f8f..eed2418e2640 100644 --- a/test/core/test/imports.test.ts +++ b/test/core/test/imports.test.ts @@ -1,4 +1,6 @@ -import { expect, test } from 'vitest' +import { mkdir, writeFile } from 'node:fs/promises' +import { resolve } from 'pathe' +import { describe, expect, test } from 'vitest' import { dynamicRelativeImport } from '../src/relative-import' test('dynamic relative import works', async () => { @@ -67,3 +69,42 @@ test('can import @vite/client', async () => { await expect(import(name)).resolves.not.toThrow() await expect(import(`/${name}`)).resolves.not.toThrow() }) + +describe('importing special files from node_modules', async () => { + const dir = resolve(__dirname, '../src/node_modules') + const wasm = resolve(dir, 'file.wasm') + const css = resolve(dir, 'file.css') + const mp3 = resolve(dir, 'file.mp3') + await mkdir(dir, { recursive: true }) + await Promise.all([ + writeFile(wasm, '(module)'), + writeFile(css, '.foo { color: red; }'), + writeFile(mp3, ''), + ]) + const importModule = (path: string) => import(path) + + test('importing wasm with ?url query', async () => { + const mod = await importModule('../src/node_modules/file.wasm?url') + expect(mod.default).toBe('/src/node_modules/file.wasm') + }) + + test('importing wasm with ?raw query', async () => { + const mod = await importModule('../src/node_modules/file.wasm?raw') + expect(mod.default).toBe('(module)') + }) + + test('importing wasm with ?init query', async () => { + const mod = await importModule('../src/node_modules/file.wasm?init') + expect(mod.default).toBeTypeOf('function') + }) + + test('importing css with ?inline query', async () => { + const mod = await importModule('../src/node_modules/file.css?inline') + expect(mod.default).toBeTypeOf('string') + }) + + test('importing asset returns a string', async () => { + const mod = await importModule('../src/node_modules/file.mp3') + expect(mod.default).toBe('/src/node_modules/file.mp3') + }) +}) From 7446370ce4df957daa6cfd870ee302ee59746cd3 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 9 Jan 2023 13:31:17 +0100 Subject: [PATCH 15/17] fix(coverage): validate extension, when reporting c8 coverage (#2626) * fix: validate extension, when reporting coverage * refactor: cleanup --- packages/coverage-c8/package.json | 1 + packages/coverage-c8/src/provider.ts | 14 +- pnpm-lock.yaml | 1554 ++++++++++++++++++++++---- 3 files changed, 1356 insertions(+), 213 deletions(-) diff --git a/packages/coverage-c8/package.json b/packages/coverage-c8/package.json index 11283c0f1896..94ceae2171e0 100644 --- a/packages/coverage-c8/package.json +++ b/packages/coverage-c8/package.json @@ -46,6 +46,7 @@ "vitest": "workspace:*" }, "devDependencies": { + "pathe": "^0.2.0", "vite-node": "workspace:*" } } diff --git a/packages/coverage-c8/src/provider.ts b/packages/coverage-c8/src/provider.ts index fe2dc132d25f..f88630666ead 100644 --- a/packages/coverage-c8/src/provider.ts +++ b/packages/coverage-c8/src/provider.ts @@ -2,7 +2,7 @@ import { existsSync, promises as fs } from 'fs' import _url from 'url' import type { Profiler } from 'inspector' import { takeCoverage } from 'v8' -import { resolve } from 'pathe' +import { extname, resolve } from 'pathe' import type { RawSourceMap } from 'vite-node' import { configDefaults } from 'vitest/config' // eslint-disable-next-line no-restricted-imports @@ -53,6 +53,7 @@ export class C8CoverageProvider implements CoverageProvider { // add source maps const sourceMapMeta: Record = {} + const extensions = Array.isArray(this.options.extension) ? this.options.extension : [this.options.extension] const entries = Array .from(this.ctx.vitenode.fetchCache.entries()) @@ -62,10 +63,13 @@ export class C8CoverageProvider implements CoverageProvider { return null const filepath = file.split('?')[0] + const url = _url.pathToFileURL(filepath).href + const extension = extname(file) || extname(url) return { filepath, - url: _url.pathToFileURL(filepath).href, + url, + extension, map: result.map, source: result.code, } @@ -74,6 +78,9 @@ export class C8CoverageProvider implements CoverageProvider { if (!entry) return false + if (!extensions.includes(entry.extension)) + return false + // Mappings and sourcesContent are needed for C8 to work return ( entry.map.mappings.length > 0 @@ -84,6 +91,9 @@ export class C8CoverageProvider implements CoverageProvider { }) as SourceMapMeta[] await Promise.all(entries.map(async ({ url, source, map, filepath }) => { + if (url in sourceMapMeta) + return + let code: string | undefined try { code = (await fs.readFile(filepath)).toString() diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e798a93ee9d2..e8d5ca665709 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -191,7 +191,7 @@ importers: lit: 2.3.1 devDependencies: '@vitest/ui': link:../../packages/ui - jsdom: 20.0.3 + jsdom: 21.0.0 vite: 4.0.0 vitest: link:../../packages/vitest @@ -238,8 +238,8 @@ importers: '@testing-library/react': 13.3.0_zpnidt7m3osuk7shl3s4oenomq '@types/node': 18.11.18 '@types/react': 18.0.26 - '@vitejs/plugin-react': 3.0.0 - jsdom: 20.0.3 + '@vitejs/plugin-react': 3.0.1 + jsdom: 21.0.0 typescript: 4.8.4 vitest: link:../../packages/vitest @@ -286,10 +286,10 @@ importers: devDependencies: '@types/react': 17.0.49 '@types/react-test-renderer': 17.0.2 - '@vitejs/plugin-react': 3.0.0_vite@4.0.0 + '@vitejs/plugin-react': 3.0.1_vite@4.0.0 '@vitest/ui': link:../../packages/ui - happy-dom: 8.1.1 - jsdom: 20.0.3 + happy-dom: 8.1.3 + jsdom: 21.0.0 react-test-renderer: 17.0.2_react@17.0.2 vite: 4.0.0 vitest: link:../../packages/vitest @@ -315,7 +315,7 @@ importers: '@types/enzyme': 3.10.12 '@types/react': 17.0.49 '@types/react-dom': 17.0.17 - '@vitejs/plugin-react': 3.0.0_vite@4.0.0 + '@vitejs/plugin-react': 3.0.1_vite@4.0.0 '@vitest/ui': link:../../packages/ui '@wojtekmaj/enzyme-adapter-react-17': 0.6.7_7ltvq4e2railvf5uya4ffxpe2a enzyme: 3.11.0 @@ -362,7 +362,7 @@ importers: '@testing-library/user-event': 14.4.3 '@vitest/ui': link:../../packages/ui date-fns: 2.29.2 - jsdom: 20.0.3 + jsdom: 21.0.0 vite: 4.0.0 vitest: link:../../packages/vitest @@ -414,7 +414,7 @@ importers: '@vitejs/plugin-react': 1.3.2 '@vitest/ui': link:../../packages/ui babel-loader: 8.2.5_@babel+core@7.18.13 - jsdom: 20.0.3 + jsdom: 21.0.0 msw: 0.49.2_typescript@4.8.4 msw-storybook-addon: 1.6.3_s5cxgiagrgvv4frx3sfmny2xh4 typescript: 4.8.4 @@ -449,7 +449,7 @@ importers: '@vitejs/plugin-react': 2.2.0_vite@4.0.0 '@vitest/coverage-c8': 0.24.5 '@vitest/ui': link:../../packages/ui - jsdom: 20.0.3 + jsdom: 21.0.0 typescript: 4.8.4 vite: 4.0.0 vitest: link:../../packages/vitest @@ -482,7 +482,7 @@ importers: '@vitejs/plugin-react': 1.3.2 '@vitest/ui': link:../../packages/ui cross-fetch: 3.1.5 - jsdom: 20.0.3 + jsdom: 21.0.0 msw: 0.49.2 vite: 4.0.0 vitest: link:../../packages/vitest @@ -498,8 +498,8 @@ importers: vue: latest devDependencies: '@vitejs/plugin-vue': 4.0.0_vite@4.0.0+vue@3.2.45 - '@vue/test-utils': 2.2.6_vue@3.2.45 - jsdom: 20.0.3 + '@vue/test-utils': 2.2.7_vue@3.2.45 + jsdom: 21.0.0 vite: 4.0.0 vite-plugin-ruby: 3.1.2_vite@4.0.0 vitest: link:../../packages/vitest @@ -518,7 +518,7 @@ importers: solid-js: 1.5.2 devDependencies: '@testing-library/jest-dom': 5.16.5 - jsdom: 20.0.3 + jsdom: 21.0.0 solid-testing-library: 0.5.0_solid-js@1.5.2 vite: 4.0.0 vite-plugin-solid: 2.5.0_solid-js@1.5.2+vite@4.0.0 @@ -537,7 +537,7 @@ importers: '@sveltejs/vite-plugin-svelte': 2.0.0_svelte@3.55.0+vite@4.0.0 '@testing-library/svelte': 3.2.2_svelte@3.55.0 '@vitest/ui': link:../../packages/ui - jsdom: 20.0.3 + jsdom: 21.0.0 svelte: 3.55.0 vite: 4.0.0 vitest: link:../../packages/vitest @@ -557,7 +557,7 @@ importers: devDependencies: '@vitejs/plugin-vue': 4.0.0_vite@4.0.0+vue@3.2.45 '@vue/test-utils': 2.0.2_vue@3.2.45 - jsdom: 20.0.3 + jsdom: 21.0.0 unplugin-auto-import: 0.11.2_vite@4.0.0 unplugin-vue-components: 0.22.4_vite@4.0.0+vue@3.2.45 vite: 4.0.0 @@ -576,7 +576,7 @@ importers: devDependencies: '@vitejs/plugin-vue': 4.0.0_vite@4.0.0+vue@3.2.45 '@vue/test-utils': 2.0.0_vue@3.2.45 - jsdom: 20.0.3 + jsdom: 21.0.0 vite: 4.0.0 vitest: link:../../packages/vitest @@ -592,8 +592,8 @@ importers: devDependencies: '@vitejs/plugin-vue': 4.0.0_vite@4.0.0+vue@3.2.45 '@vitejs/plugin-vue-jsx': 3.0.0_vite@4.0.0+vue@3.2.45 - '@vue/test-utils': 2.2.6_vue@3.2.45 - jsdom: 20.0.3 + '@vue/test-utils': 2.2.7_vue@3.2.45 + jsdom: 21.0.0 vite: 4.0.0 vitest: link:../../packages/vitest vue: 3.2.45 @@ -612,7 +612,7 @@ importers: devDependencies: '@vitejs/plugin-vue2': 1.1.2_vite@4.0.0+vue@2.7.10 '@vue/test-utils': 1.3.0_42puyn3dcxirnpdjnosl7pbb6a - jsdom: 20.0.3 + jsdom: 21.0.0 vite: 4.0.0 vitest: link:../../packages/vitest vue-template-compiler: 2.7.10 @@ -643,12 +643,14 @@ importers: packages/coverage-c8: specifiers: c8: ^7.12.0 + pathe: ^0.2.0 vite-node: workspace:* vitest: workspace:* dependencies: c8: 7.12.0 vitest: link:../vitest devDependencies: + pathe: 0.2.0 vite-node: link:../vite-node packages/coverage-istanbul: @@ -1030,8 +1032,8 @@ importers: vue: latest devDependencies: '@vitejs/plugin-vue': 4.0.0_vite@4.0.0+vue@3.2.45 - '@vue/test-utils': 2.2.6_vue@3.2.45 - happy-dom: 8.1.1 + '@vue/test-utils': 2.2.7_vue@3.2.45 + happy-dom: 8.1.3 vite: 4.0.0 vitest: link:../../packages/vitest vue: 3.2.45 @@ -1501,22 +1503,27 @@ packages: resolution: {integrity: sha512-Gt9jszFJYq7qzXVK4slhc6NzJXnOVmRECWcVjF/T23rNXD9NtWQ0W3qxdg+p9wWIB+VQw3GYV/U2Ha9bRTfs4w==} engines: {node: '>=6.9.0'} + /@babel/compat-data/7.20.10: + resolution: {integrity: sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core/7.12.9: resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.5 - '@babel/helper-module-transforms': 7.20.2 - '@babel/helpers': 7.20.6 - '@babel/parser': 7.20.5 - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/generator': 7.20.7 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helpers': 7.20.7 + '@babel/parser': 7.20.7 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.12 + '@babel/types': 7.20.7 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.1 + json5: 2.2.3 lodash: 4.17.21 resolve: 1.22.1 semver: 5.7.1 @@ -1570,6 +1577,29 @@ packages: - supports-color dev: true + /@babel/core/7.20.12: + resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helpers': 7.20.7 + '@babel/parser': 7.20.7 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.12 + '@babel/types': 7.20.7 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/core/7.20.5: resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==} engines: {node: '>=6.9.0'} @@ -1605,7 +1635,15 @@ packages: resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + + /@babel/generator/7.20.7: + resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 @@ -1613,7 +1651,7 @@ packages: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: true /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: @@ -1621,7 +1659,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: true /@babel/helper-compilation-targets/7.18.9_@babel+core@7.18.13: @@ -1636,42 +1674,71 @@ packages: browserslist: 4.21.3 semver: 6.3.0 - /@babel/helper-compilation-targets/7.20.0_@babel+core@7.18.13: + /@babel/helper-compilation-targets/7.20.0_@babel+core@7.19.6: resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.20.0 - '@babel/core': 7.18.13 + '@babel/compat-data': 7.20.10 + '@babel/core': 7.19.6 '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.3 semver: 6.3.0 dev: true - /@babel/helper-compilation-targets/7.20.0_@babel+core@7.19.6: + /@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.5: resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.20.0 - '@babel/core': 7.19.6 + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.5 '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.3 semver: 6.3.0 dev: true - /@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.5: - resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.18.13: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.20.0 + '@babel/compat-data': 7.20.10 + '@babel/core': 7.18.13 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.3 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.12 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.3 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.5: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.20.10 '@babel/core': 7.20.5 '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.3 + lru-cache: 5.1.1 semver: 6.3.0 dev: true @@ -1693,6 +1760,24 @@ packages: - supports-color dev: true + /@babel/helper-create-class-features-plugin/7.20.5_@babel+core@7.20.12: + resolution: {integrity: sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-create-class-features-plugin/7.20.5_@babel+core@7.20.5: resolution: {integrity: sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==} engines: {node: '>=6.9.0'} @@ -1722,6 +1807,17 @@ packages: regexpu-core: 5.1.0 dev: true + /@babel/helper-create-regexp-features-plugin/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.1.0 + dev: true + /@babel/helper-create-regexp-features-plugin/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==} engines: {node: '>=6.9.0'} @@ -1733,16 +1829,16 @@ packages: regexpu-core: 5.1.0 dev: true - /@babel/helper-define-polyfill-provider/0.1.5_@babel+core@7.20.5: + /@babel/helper-define-polyfill-provider/0.1.5_@babel+core@7.20.12: resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/traverse': 7.20.5 + '@babel/traverse': 7.20.12 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.1 @@ -1757,7 +1853,23 @@ packages: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.18.13 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.13 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider/0.3.2_@babel+core@7.20.12: + resolution: {integrity: sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 '@babel/helper-plugin-utils': 7.20.2 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -1773,7 +1885,7 @@ packages: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.5 '@babel/helper-plugin-utils': 7.20.2 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -1791,41 +1903,41 @@ packages: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: true /@babel/helper-function-name/7.19.0: resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.20.5 + '@babel/template': 7.20.7 + '@babel/types': 7.20.7 /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 /@babel/helper-member-expression-to-functions/7.18.9: resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: true /@babel/helper-module-imports/7.16.0: resolution: {integrity: sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: true /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 /@babel/helper-module-transforms/7.18.9: resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==} @@ -1842,6 +1954,22 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helper-module-transforms/7.20.11: + resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.12 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-module-transforms/7.20.2: resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} engines: {node: '>=6.9.0'} @@ -1851,9 +1979,9 @@ packages: '@babel/helper-simple-access': 7.20.2 '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.12 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color dev: true @@ -1862,7 +1990,7 @@ packages: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: true /@babel/helper-plugin-utils/7.10.4: @@ -1883,7 +2011,22 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.18.11 - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-wrap-function': 7.18.11 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color dev: true @@ -1898,7 +2041,7 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.18.11 - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color dev: true @@ -1910,8 +2053,8 @@ packages: '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/traverse': 7.20.12 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color dev: true @@ -1920,20 +2063,20 @@ packages: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 /@babel/helper-skip-transparent-expression-wrappers/7.18.9: resolution: {integrity: sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 dev: true /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 /@babel/helper-string-parser/7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} @@ -1952,9 +2095,9 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-function-name': 7.19.0 - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.12 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color dev: true @@ -1973,9 +2116,20 @@ packages: resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.18.10 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.12 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers/7.20.7: + resolution: {integrity: sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.12 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color dev: true @@ -2002,6 +2156,13 @@ packages: dependencies: '@babel/types': 7.20.5 + /@babel/parser/7.20.7: + resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.20.7 + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.18.13: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} @@ -2012,6 +2173,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} @@ -2034,6 +2205,18 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.18.13 dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.12 + dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} engines: {node: '>=6.9.0'} @@ -2061,6 +2244,21 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-async-generator-functions/7.18.10_@babel+core@7.20.12: + resolution: {integrity: sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-async-generator-functions/7.18.10_@babel+core@7.20.5: resolution: {integrity: sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==} engines: {node: '>=6.9.0'} @@ -2089,6 +2287,19 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -2116,6 +2327,20 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} engines: {node: '>=6.9.0'} @@ -2130,18 +2355,18 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-decorators/7.18.10_@babel+core@7.20.5: + /@babel/plugin-proposal-decorators/7.18.10_@babel+core@7.20.12: resolution: {integrity: sha512-wdGTwWF5QtpTY/gbBtQLAiCnoxfD4qMbN87NYZle1dOZ9Os8Y6zXcKrIaOU8W+TIvFUWVGG9tUgNww3CjXRVVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.5 + '@babel/core': 7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.12 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-replace-supers': 7.19.1 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/plugin-syntax-decorators': 7.18.6_@babel+core@7.20.5 + '@babel/plugin-syntax-decorators': 7.18.6_@babel+core@7.20.12 transitivePeerDependencies: - supports-color dev: true @@ -2157,6 +2382,17 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.13 dev: true + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + dev: true + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} @@ -2168,15 +2404,15 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.5 dev: true - /@babel/plugin-proposal-export-default-from/7.18.10_@babel+core@7.20.5: + /@babel/plugin-proposal-export-default-from/7.18.10_@babel+core@7.20.12: resolution: {integrity: sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-default-from': 7.18.6_@babel+core@7.20.5 + '@babel/plugin-syntax-export-default-from': 7.18.6_@babel+core@7.20.12 dev: true /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.18.13: @@ -2190,6 +2426,17 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.13 dev: true + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 + dev: true + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -2212,6 +2459,17 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.13 dev: true + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 + dev: true + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} @@ -2234,7 +2492,18 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.13 dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.20.5: + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -2256,6 +2525,17 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.13 dev: true + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 + dev: true + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -2278,6 +2558,17 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.13 dev: true + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 + dev: true + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -2306,23 +2597,37 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.0 + '@babel/compat-data': 7.20.10 '@babel/core': 7.18.13 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.13 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.18.13 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.13 '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.18.13 dev: true + /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.20.12 + dev: true + /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.0 + '@babel/compat-data': 7.20.10 '@babel/core': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.5 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.5 '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.20.5 @@ -2339,6 +2644,17 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.18.13 dev: true + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 + dev: true + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -2362,6 +2678,18 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.18.13 dev: true + /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + dev: true + /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} engines: {node: '>=6.9.0'} @@ -2387,6 +2715,19 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -2415,6 +2756,21 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} engines: {node: '>=6.9.0'} @@ -2441,6 +2797,17 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} @@ -2461,6 +2828,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.12: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.5: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -2479,6 +2855,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.12: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.5: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -2498,6 +2883,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.12: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.5: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -2508,13 +2903,13 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-decorators/7.18.6_@babel+core@7.20.5: + /@babel/plugin-syntax-decorators/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -2527,6 +2922,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.5: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -2536,13 +2940,13 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-default-from/7.18.6_@babel+core@7.20.5: + /@babel/plugin-syntax-export-default-from/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -2555,6 +2959,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.5: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -2584,6 +2997,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-import-assertions/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-import-assertions/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==} engines: {node: '>=6.9.0'} @@ -2603,6 +3026,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.5: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -2650,6 +3082,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} @@ -2669,6 +3111,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.12: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.5: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -2687,6 +3138,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.5: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -2705,6 +3165,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.12: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.5: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -2732,6 +3201,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.5: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -2750,6 +3228,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.5: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -2768,6 +3255,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.5: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -2787,6 +3283,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.12: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.5: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -2807,6 +3313,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.12: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.5: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -2817,6 +3333,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.12: + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.5: resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} @@ -2837,6 +3363,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} engines: {node: '>=6.9.0'} @@ -2861,6 +3397,20 @@ packages: - supports-color dev: true + /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} engines: {node: '>=6.9.0'} @@ -2885,6 +3435,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} @@ -2905,6 +3465,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} engines: {node: '>=6.9.0'} @@ -2934,6 +3504,25 @@ packages: - supports-color dev: true + /@babel/plugin-transform-classes/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-classes/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==} engines: {node: '>=6.9.0'} @@ -2963,6 +3552,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} engines: {node: '>=6.9.0'} @@ -2983,6 +3582,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.20.12: + resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.20.5: resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} engines: {node: '>=6.9.0'} @@ -3004,6 +3613,17 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} @@ -3025,6 +3645,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} @@ -3046,6 +3676,17 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} @@ -3078,6 +3719,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.12: + resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.5: resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} @@ -3095,7 +3746,19 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.13 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.13 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.18.13 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -3107,7 +3770,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.5 '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -3122,6 +3785,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} @@ -3142,6 +3815,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} @@ -3159,7 +3842,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.13 - '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helper-plugin-utils': 7.20.2 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: @@ -3173,7 +3870,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.5 - '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: @@ -3187,7 +3884,22 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.13 - '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-simple-access': 7.20.2 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-simple-access': 7.20.2 babel-plugin-dynamic-import-node: 2.3.3 @@ -3202,7 +3914,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.5 - '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-simple-access': 7.20.2 babel-plugin-dynamic-import-node: 2.3.3 @@ -3218,7 +3930,23 @@ packages: dependencies: '@babel/core': 7.18.13 '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-identifier': 7.19.1 babel-plugin-dynamic-import-node: 2.3.3 @@ -3234,7 +3962,7 @@ packages: dependencies: '@babel/core': 7.20.5 '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-identifier': 7.19.1 babel-plugin-dynamic-import-node: 2.3.3 @@ -3249,7 +3977,20 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.13 - '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color @@ -3262,7 +4003,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.20.5 - '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-module-transforms': 7.20.11 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color @@ -3279,6 +4020,17 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-named-capturing-groups-regex/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-named-capturing-groups-regex/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==} engines: {node: '>=6.9.0'} @@ -3300,6 +4052,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} @@ -3323,6 +4085,19 @@ packages: - supports-color dev: true + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} @@ -3356,6 +4131,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.20.12: + resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.20.5: resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} engines: {node: '>=6.9.0'} @@ -3376,6 +4161,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} @@ -3396,13 +4191,13 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -3426,14 +4221,14 @@ packages: '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.19.6 dev: true - /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.5 + '@babel/core': 7.20.12 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.12 dev: true /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.18.13: @@ -3456,13 +4251,13 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -3486,13 +4281,13 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.20.5: + /@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.20.12: resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -3538,17 +4333,17 @@ packages: '@babel/types': 7.20.5 dev: true - /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.20.5: + /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.20.12: resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.12 '@babel/types': 7.20.5 dev: true @@ -3563,13 +4358,13 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.20.5: + /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -3585,6 +4380,17 @@ packages: regenerator-transform: 0.15.0 dev: true + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + regenerator-transform: 0.15.0 + dev: true + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} engines: {node: '>=6.9.0'} @@ -3602,7 +4408,17 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.13 + '@babel/core': 7.18.13 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -3626,6 +4442,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} @@ -3647,6 +4473,17 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 dev: true + /@babel/plugin-transform-spread/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: true + /@babel/plugin-transform-spread/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==} engines: {node: '>=6.9.0'} @@ -3668,6 +4505,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} @@ -3688,6 +4535,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} @@ -3708,6 +4565,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.5: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} @@ -3718,6 +4585,20 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.12: + resolution: {integrity: sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.5: resolution: {integrity: sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==} engines: {node: '>=6.9.0'} @@ -3742,6 +4623,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.12: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.5: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} @@ -3763,6 +4654,17 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.5: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} @@ -3780,9 +4682,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.0 + '@babel/compat-data': 7.20.10 '@babel/core': 7.18.13 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.13 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.18.13 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.18.13 @@ -3850,7 +4752,7 @@ packages: '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.18.13 '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.18.13 '@babel/preset-modules': 0.1.5_@babel+core@7.18.13 - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 babel-plugin-polyfill-corejs2: 0.3.2_@babel+core@7.18.13 babel-plugin-polyfill-corejs3: 0.5.3_@babel+core@7.18.13 babel-plugin-polyfill-regenerator: 0.4.0_@babel+core@7.18.13 @@ -3860,15 +4762,101 @@ packages: - supports-color dev: true + /@babel/preset-env/7.18.10_@babel+core@7.20.12: + resolution: {integrity: sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-proposal-async-generator-functions': 7.18.10_@babel+core@7.20.12 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-import-assertions': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-classes': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.20.12 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.12 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-modules-systemjs': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-named-capturing-groups-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.20.12 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-spread': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.12 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.12 + '@babel/preset-modules': 0.1.5_@babel+core@7.20.12 + '@babel/types': 7.20.7 + babel-plugin-polyfill-corejs2: 0.3.2_@babel+core@7.20.12 + babel-plugin-polyfill-corejs3: 0.5.3_@babel+core@7.20.12 + babel-plugin-polyfill-regenerator: 0.4.0_@babel+core@7.20.12 + core-js-compat: 3.25.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/preset-env/7.18.10_@babel+core@7.20.5: resolution: {integrity: sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.0 + '@babel/compat-data': 7.20.10 '@babel/core': 7.20.5 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.5 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.5 @@ -3936,7 +4924,7 @@ packages: '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.5 '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.5 '@babel/preset-modules': 0.1.5_@babel+core@7.20.5 - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 babel-plugin-polyfill-corejs2: 0.3.2_@babel+core@7.20.5 babel-plugin-polyfill-corejs3: 0.5.3_@babel+core@7.20.5 babel-plugin-polyfill-regenerator: 0.4.0_@babel+core@7.20.5 @@ -3967,7 +4955,20 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.18.13 '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.18.13 - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 + esutils: 2.0.3 + dev: true + + /@babel/preset-modules/0.1.5_@babel+core@7.20.12: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 + '@babel/types': 7.20.7 esutils: 2.0.3 dev: true @@ -3980,7 +4981,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.5 '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.5 - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 esutils: 2.0.3 dev: true @@ -3999,19 +5000,33 @@ packages: '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.18.13 dev: true - /@babel/preset-react/7.18.6_@babel+core@7.20.5: + /@babel/preset-react/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.20.12 + dev: true + + /@babel/preset-typescript/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.5 - '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.20.5 + '@babel/plugin-transform-typescript': 7.20.2_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color dev: true /@babel/preset-typescript/7.18.6_@babel+core@7.20.5: @@ -4028,13 +5043,13 @@ packages: - supports-color dev: true - /@babel/register/7.18.9_@babel+core@7.20.5: + /@babel/register/7.18.9_@babel+core@7.20.12: resolution: {integrity: sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -4056,6 +5071,14 @@ packages: '@babel/parser': 7.20.5 '@babel/types': 7.20.5 + /@babel/template/7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 + /@babel/traverse/7.18.13: resolution: {integrity: sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==} engines: {node: '>=6.9.0'} @@ -4073,18 +5096,36 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse/7.20.12: + resolution: {integrity: sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.7 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/traverse/7.20.5: resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.5 + '@babel/generator': 7.20.7 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -4106,6 +5147,14 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 + /@babel/types/7.20.7: + resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + /@base2/pretty-print-object/1.0.1: resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} dev: true @@ -4783,7 +5832,7 @@ packages: resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 '@jest/types': 26.6.2 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -6034,7 +7083,7 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 '@storybook/addons': 6.5.10_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.5.10_sfoxds7t5ydpegc3knd667wn6m '@storybook/channel-postmessage': 6.5.10 @@ -6054,7 +7103,7 @@ packages: '@types/node': 16.11.56 '@types/webpack': 4.41.32 autoprefixer: 9.8.8 - babel-loader: 8.2.5_em3sh5kto35xuanci4cvhzqfay + babel-loader: 8.2.5_nwtvwtk5tmh22l2urnqucz7kqu case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.25.0 css-loader: 3.6.0_webpack@4.46.0 @@ -6262,35 +7311,35 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-proposal-decorators': 7.18.10_@babel+core@7.20.5 - '@babel/plugin-proposal-export-default-from': 7.18.10_@babel+core@7.20.5 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-transform-classes': 7.18.9_@babel+core@7.20.5 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.20.5 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.5 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.20.5 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-spread': 7.18.9_@babel+core@7.20.5 - '@babel/preset-env': 7.18.10_@babel+core@7.20.5 - '@babel/preset-react': 7.18.6_@babel+core@7.20.5 - '@babel/preset-typescript': 7.18.6_@babel+core@7.20.5 - '@babel/register': 7.18.9_@babel+core@7.20.5 + '@babel/core': 7.20.12 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-decorators': 7.18.10_@babel+core@7.20.12 + '@babel/plugin-proposal-export-default-from': 7.18.10_@babel+core@7.20.12 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-classes': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.20.12 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.12 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.20.12 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-spread': 7.18.9_@babel+core@7.20.12 + '@babel/preset-env': 7.18.10_@babel+core@7.20.12 + '@babel/preset-react': 7.18.6_@babel+core@7.20.12 + '@babel/preset-typescript': 7.18.6_@babel+core@7.20.12 + '@babel/register': 7.18.9_@babel+core@7.20.12 '@storybook/node-logger': 6.5.10 '@storybook/semver': 7.3.2 '@types/node': 16.11.56 '@types/pretty-hrtime': 1.0.1 - babel-loader: 8.2.5_em3sh5kto35xuanci4cvhzqfay + babel-loader: 8.2.5_nwtvwtk5tmh22l2urnqucz7kqu babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.20.5 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.20.12 chalk: 4.1.2 core-js: 3.25.0 express: 4.18.1 @@ -6301,7 +7350,7 @@ packages: glob: 7.2.3 handlebars: 4.7.7 interpret: 2.2.0 - json5: 2.2.1 + json5: 2.2.3 lazy-universal-dotenv: 3.0.1 picomatch: 2.3.1 pkg-dir: 5.0.0 @@ -6450,15 +7499,15 @@ packages: '@storybook/mdx2-csf': optional: true dependencies: - '@babel/core': 7.20.5 - '@babel/generator': 7.20.5 - '@babel/parser': 7.20.5 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.5 - '@babel/preset-env': 7.18.10_@babel+core@7.20.5 - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/core': 7.20.12 + '@babel/generator': 7.20.7 + '@babel/parser': 7.20.7 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.12 + '@babel/preset-env': 7.18.10_@babel+core@7.20.12 + '@babel/traverse': 7.20.12 + '@babel/types': 7.20.7 '@storybook/csf': 0.0.2--canary.4566f4d.1 - '@storybook/mdx1-csf': 0.0.1_@babel+core@7.20.5 + '@storybook/mdx1-csf': 0.0.1_@babel+core@7.20.12 core-js: 3.25.0 fs-extra: 9.1.0 global: 4.4.0 @@ -6483,7 +7532,7 @@ packages: /@storybook/docs-tools/6.5.10_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-/bvYgOO+CxMEcHifkjJg0A60OTGOhcjGxnsB1h0gJuxMrqA/7Qwc108bFmPiX0eiD1BovFkZLJV4O6OY7zP5Vw==} dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.10_sfoxds7t5ydpegc3knd667wn6m core-js: 3.25.0 @@ -6519,9 +7568,9 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.5 - '@babel/preset-react': 7.18.6_@babel+core@7.20.5 + '@babel/core': 7.20.12 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.12 + '@babel/preset-react': 7.18.6_@babel+core@7.20.12 '@storybook/addons': 6.5.10_sfoxds7t5ydpegc3knd667wn6m '@storybook/core-client': 6.5.10_lb6j7tllhltqtas2n635xqdotu '@storybook/core-common': 6.5.10_56jbash75ng5psbctf36wqywr4 @@ -6530,7 +7579,7 @@ packages: '@storybook/ui': 6.5.10_sfoxds7t5ydpegc3knd667wn6m '@types/node': 16.11.56 '@types/webpack': 4.41.32 - babel-loader: 8.2.5_em3sh5kto35xuanci4cvhzqfay + babel-loader: 8.2.5_nwtvwtk5tmh22l2urnqucz7kqu case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.25.0 @@ -6570,10 +7619,10 @@ packages: /@storybook/mdx1-csf/0.0.1_@babel+core@7.18.13: resolution: {integrity: sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg==} dependencies: - '@babel/generator': 7.20.5 - '@babel/parser': 7.20.5 + '@babel/generator': 7.20.7 + '@babel/parser': 7.20.7 '@babel/preset-env': 7.18.10_@babel+core@7.18.13 - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 '@mdx-js/mdx': 1.6.22 '@types/lodash': 4.14.191 js-string-escape: 1.0.1 @@ -6586,13 +7635,13 @@ packages: - supports-color dev: true - /@storybook/mdx1-csf/0.0.1_@babel+core@7.20.5: + /@storybook/mdx1-csf/0.0.1_@babel+core@7.20.12: resolution: {integrity: sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg==} dependencies: - '@babel/generator': 7.20.5 - '@babel/parser': 7.20.5 - '@babel/preset-env': 7.18.10_@babel+core@7.20.5 - '@babel/types': 7.20.5 + '@babel/generator': 7.20.7 + '@babel/parser': 7.20.7 + '@babel/preset-env': 7.18.10_@babel+core@7.20.12 + '@babel/types': 7.20.7 '@mdx-js/mdx': 1.6.22 '@types/lodash': 4.14.191 js-string-escape: 1.0.1 @@ -6942,7 +7991,7 @@ packages: resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} dependencies: ejs: 3.1.8 - json5: 2.2.1 + json5: 2.2.3 magic-string: 0.25.9 string.prototype.matchall: 4.0.7 dev: true @@ -8003,30 +9052,30 @@ packages: - supports-color dev: true - /@vitejs/plugin-react/3.0.0: - resolution: {integrity: sha512-1mvyPc0xYW5G8CHQvJIJXLoMjl5Ct3q2g5Y2s6Ccfgwm45y48LBvsla7az+GkkAtYikWQ4Lxqcsq5RHLcZgtNQ==} + /@vitejs/plugin-react/3.0.1: + resolution: {integrity: sha512-mx+QvYwIbbpOIJw+hypjnW1lAbKDHtWK5ibkF/V1/oMBu8HU/chb+SnqJDAsLq1+7rGqjktCEomMTM5KShzUKQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.5 + '@babel/core': 7.20.12 + '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.12 magic-string: 0.27.0 react-refresh: 0.14.0 transitivePeerDependencies: - supports-color dev: true - /@vitejs/plugin-react/3.0.0_vite@4.0.0: - resolution: {integrity: sha512-1mvyPc0xYW5G8CHQvJIJXLoMjl5Ct3q2g5Y2s6Ccfgwm45y48LBvsla7az+GkkAtYikWQ4Lxqcsq5RHLcZgtNQ==} + /@vitejs/plugin-react/3.0.1_vite@4.0.0: + resolution: {integrity: sha512-mx+QvYwIbbpOIJw+hypjnW1lAbKDHtWK5ibkF/V1/oMBu8HU/chb+SnqJDAsLq1+7rGqjktCEomMTM5KShzUKQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.5 + '@babel/core': 7.20.12 + '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.12 magic-string: 0.27.0 react-refresh: 0.14.0 vite: 4.0.0 @@ -8141,7 +9190,7 @@ packages: /@vue/compiler-core/3.2.39: resolution: {integrity: sha512-mf/36OWXqWn0wsC40nwRRGheR/qoID+lZXbIuLnr4/AngM0ov8Xvv8GHunC0rKRIkh60bTqydlqTeBo49rlbqw==} dependencies: - '@babel/parser': 7.20.5 + '@babel/parser': 7.20.7 '@vue/shared': 3.2.39 estree-walker: 2.0.2 source-map: 0.6.1 @@ -8169,7 +9218,7 @@ packages: /@vue/compiler-sfc/2.7.10: resolution: {integrity: sha512-55Shns6WPxlYsz4WX7q9ZJBL77sKE1ZAYNYStLs6GbhIOMrNtjMvzcob6gu3cGlfpCR4bT7NXgyJ3tly2+Hx8Q==} dependencies: - '@babel/parser': 7.20.5 + '@babel/parser': 7.20.7 postcss: 8.4.19 source-map: 0.6.1 @@ -8220,7 +9269,7 @@ packages: /@vue/reactivity-transform/3.2.39: resolution: {integrity: sha512-HGuWu864zStiWs9wBC6JYOP1E00UjMdDWIG5W+FpUx28hV3uz9ODOKVNm/vdOy/Pvzg8+OcANxAVC85WFBbl3A==} dependencies: - '@babel/parser': 7.20.5 + '@babel/parser': 7.20.7 '@vue/compiler-core': 3.2.39 '@vue/shared': 3.2.39 estree-walker: 2.0.2 @@ -8334,8 +9383,8 @@ packages: vue: 3.2.45 dev: true - /@vue/test-utils/2.2.6_vue@3.2.45: - resolution: {integrity: sha512-64zHtJZdG7V/U2L0j/z3Pt5bSygccI3xs+Kl7LB73AZK4MQ8WONJhqDQPK8leUFFA9CmmoJygeky7zcl2hX10A==} + /@vue/test-utils/2.2.7_vue@3.2.45: + resolution: {integrity: sha512-BMuoruUFTEqhLoOgsMcgNVMiByYbfHCKGr2C4CPdGtz/affUtDVX5zr1RnPuq0tYSiaqq+Enw5voUpG6JY8Q7g==} peerDependencies: vue: ^3.0.1 dependencies: @@ -9379,14 +10428,14 @@ packages: schema-utils: 2.7.1 dev: true - /babel-loader/8.2.5_em3sh5kto35xuanci4cvhzqfay: + /babel-loader/8.2.5_nwtvwtk5tmh22l2urnqucz7kqu: resolution: {integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==} engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 webpack: '>=2' dependencies: - '@babel/core': 7.20.5 + '@babel/core': 7.20.12 find-cache-dir: 3.3.2 loader-utils: 2.0.2 make-dir: 3.1.0 @@ -9441,7 +10490,7 @@ packages: '@babel/core': 7.20.5 '@babel/helper-module-imports': 7.16.0 '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5 - '@babel/types': 7.20.5 + '@babel/types': 7.20.7 html-entities: 2.3.2 dev: true @@ -9458,7 +10507,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.0 + '@babel/compat-data': 7.20.10 '@babel/core': 7.18.13 '@babel/helper-define-polyfill-provider': 0.3.2_@babel+core@7.18.13 semver: 6.3.0 @@ -9466,12 +10515,25 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs2/0.3.2_@babel+core@7.20.12: + resolution: {integrity: sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.2_@babel+core@7.20.12 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs2/0.3.2_@babel+core@7.20.5: resolution: {integrity: sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.20.0 + '@babel/compat-data': 7.20.10 '@babel/core': 7.20.5 '@babel/helper-define-polyfill-provider': 0.3.2_@babel+core@7.20.5 semver: 6.3.0 @@ -9479,13 +10541,13 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-corejs3/0.1.7_@babel+core@7.20.5: + /babel-plugin-polyfill-corejs3/0.1.7_@babel+core@7.20.12: resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.5 - '@babel/helper-define-polyfill-provider': 0.1.5_@babel+core@7.20.5 + '@babel/core': 7.20.12 + '@babel/helper-define-polyfill-provider': 0.1.5_@babel+core@7.20.12 core-js-compat: 3.25.0 transitivePeerDependencies: - supports-color @@ -9503,6 +10565,18 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs3/0.5.3_@babel+core@7.20.12: + resolution: {integrity: sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.2_@babel+core@7.20.12 + core-js-compat: 3.25.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs3/0.5.3_@babel+core@7.20.5: resolution: {integrity: sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==} peerDependencies: @@ -9526,6 +10600,17 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-regenerator/0.4.0_@babel+core@7.20.12: + resolution: {integrity: sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.2_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-regenerator/0.4.0_@babel+core@7.20.5: resolution: {integrity: sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==} peerDependencies: @@ -12253,8 +13338,8 @@ packages: resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} engines: {node: '>=8.3.0'} dependencies: - '@babel/traverse': 7.20.5 - '@babel/types': 7.20.5 + '@babel/traverse': 7.20.12 + '@babel/types': 7.20.7 c8: 7.12.0 transitivePeerDependencies: - supports-color @@ -13387,8 +14472,8 @@ packages: - encoding dev: true - /happy-dom/8.1.1: - resolution: {integrity: sha512-uI8NneN2B0D+vwIhjQVKtIUYOSh/zymfj61bU/fxkoAw+Aktn0ewG6dYKyFPOvyBoFLPg3S8fsn2OqSoYCqJeQ==} + /happy-dom/8.1.3: + resolution: {integrity: sha512-XC0ZvAmMOfW56X7yw9IrBuVpHKRzVAMDbtoF4MmOHoe17r2zY6yTMhs+lrsz9KLGQUcFyDPianULPAOp1+OnVg==} dependencies: css.escape: 1.5.1 he: 1.2.0 @@ -14778,6 +15863,47 @@ packages: - utf-8-validate dev: true + /jsdom/21.0.0: + resolution: {integrity: sha512-AIw+3ZakSUtDYvhwPwWHiZsUi3zHugpMEKlNPaurviseYoBqo0zBd3zqoUi3LPCNtPFlEP8FiW9MqCZdjb2IYA==} + engines: {node: '>=14'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.8.1 + acorn-globals: 7.0.1 + cssom: 0.5.0 + cssstyle: 2.3.0 + data-urls: 3.0.2 + decimal.js: 10.4.2 + domexception: 4.0.0 + escodegen: 2.0.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.2 + parse5: 7.1.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.2 + w3c-xmlserializer: 4.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + ws: 8.11.0 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /jsesc/0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -14833,6 +15959,12 @@ packages: engines: {node: '>=6'} hasBin: true + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + /jsonc-eslint-parser/2.1.0: resolution: {integrity: sha512-qCRJWlbP2v6HbmKW7R3lFbeiVWHo+oMJ0j+MizwvauqnCV/EvtAeEeuCgoc/ErtsuoKgYB8U4Ih8AxJbXoE6/g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -17406,8 +18538,8 @@ packages: engines: {node: '>=8.10.0'} hasBin: true dependencies: - '@babel/core': 7.20.5 - '@babel/generator': 7.20.5 + '@babel/core': 7.20.12 + '@babel/generator': 7.20.7 '@babel/runtime': 7.18.9 ast-types: 0.14.2 commander: 2.20.3 From dfdcb4cdb2ec3ea47b023ca2023a47040c79514f Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Mon, 9 Jan 2023 13:32:14 +0100 Subject: [PATCH 16/17] chore: update lockfile --- pnpm-lock.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e8d5ca665709..7dfc74e5dc05 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9198,7 +9198,7 @@ packages: /@vue/compiler-core/3.2.45: resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} dependencies: - '@babel/parser': 7.20.5 + '@babel/parser': 7.20.7 '@vue/shared': 3.2.45 estree-walker: 2.0.2 source-map: 0.6.1 @@ -9278,7 +9278,7 @@ packages: /@vue/reactivity-transform/3.2.45: resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==} dependencies: - '@babel/parser': 7.20.5 + '@babel/parser': 7.20.7 '@vue/compiler-core': 3.2.45 '@vue/shared': 3.2.45 estree-walker: 2.0.2 From 2b06cf819fdc7e94a580127f72f84b1852e92a11 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Mon, 9 Jan 2023 13:32:56 +0100 Subject: [PATCH 17/17] chore: release v0.27.0 --- package.json | 2 +- packages/browser/package.json | 2 +- packages/coverage-c8/package.json | 2 +- packages/coverage-istanbul/package.json | 2 +- packages/expect/package.json | 2 +- packages/spy/package.json | 2 +- packages/ui/package.json | 2 +- packages/utils/package.json | 2 +- packages/vite-node/package.json | 2 +- packages/vitest/package.json | 2 +- packages/web-worker/package.json | 2 +- packages/ws-client/package.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 9db28880b1c5..6d19d1f84d3a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/monorepo", "type": "module", - "version": "0.26.3", + "version": "0.27.0", "private": true, "packageManager": "pnpm@7.20.0", "description": "A blazing fast unit test framework powered by Vite", diff --git a/packages/browser/package.json b/packages/browser/package.json index 9b5ec14be0fd..7a68b8789546 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/browser", "type": "module", - "version": "0.26.3", + "version": "0.27.0", "description": "Browser running for Vitest", "repository": { "type": "git", diff --git a/packages/coverage-c8/package.json b/packages/coverage-c8/package.json index 94ceae2171e0..8903f949da0f 100644 --- a/packages/coverage-c8/package.json +++ b/packages/coverage-c8/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/coverage-c8", "type": "module", - "version": "0.26.3", + "version": "0.27.0", "description": "C8 coverage provider for Vitest", "author": "Anthony Fu ", "license": "MIT", diff --git a/packages/coverage-istanbul/package.json b/packages/coverage-istanbul/package.json index 74688299a1a3..8caafe06e67f 100644 --- a/packages/coverage-istanbul/package.json +++ b/packages/coverage-istanbul/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/coverage-istanbul", "type": "module", - "version": "0.26.3", + "version": "0.27.0", "description": "Istanbul coverage provider for Vitest", "author": "Anthony Fu ", "license": "MIT", diff --git a/packages/expect/package.json b/packages/expect/package.json index 9e28a90d4cea..12f9c0acea64 100644 --- a/packages/expect/package.json +++ b/packages/expect/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/expect", "type": "module", - "version": "0.26.2", + "version": "0.27.0", "description": "Jest's expect matchers as a Chai plugin", "license": "MIT", "repository": { diff --git a/packages/spy/package.json b/packages/spy/package.json index 0ae85c3443f3..a98a546f4269 100644 --- a/packages/spy/package.json +++ b/packages/spy/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/spy", "type": "module", - "version": "0.26.2", + "version": "0.27.0", "description": "Lightweight Jest compatible spy implementation", "license": "MIT", "repository": { diff --git a/packages/ui/package.json b/packages/ui/package.json index b041995bb5d6..8ebab1b9ea94 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/ui", "type": "module", - "version": "0.26.3", + "version": "0.27.0", "description": "UI for Vitest", "license": "MIT", "repository": { diff --git a/packages/utils/package.json b/packages/utils/package.json index 38bb54e9886d..be0442ca0a5c 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/utils", "type": "module", - "version": "0.26.2", + "version": "0.27.0", "description": "Shared Vitest utility functions", "license": "MIT", "repository": { diff --git a/packages/vite-node/package.json b/packages/vite-node/package.json index c73c1888877f..eb20972de00d 100644 --- a/packages/vite-node/package.json +++ b/packages/vite-node/package.json @@ -1,6 +1,6 @@ { "name": "vite-node", - "version": "0.26.3", + "version": "0.27.0", "description": "Vite as Node.js runtime", "author": "Anthony Fu ", "license": "MIT", diff --git a/packages/vitest/package.json b/packages/vitest/package.json index 3f4fc18da879..0478f3225f2b 100644 --- a/packages/vitest/package.json +++ b/packages/vitest/package.json @@ -1,7 +1,7 @@ { "name": "vitest", "type": "module", - "version": "0.26.3", + "version": "0.27.0", "description": "A blazing fast unit test framework powered by Vite", "author": "Anthony Fu ", "license": "MIT", diff --git a/packages/web-worker/package.json b/packages/web-worker/package.json index a78a7f0d2b55..63e280180b93 100644 --- a/packages/web-worker/package.json +++ b/packages/web-worker/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/web-worker", "type": "module", - "version": "0.26.3", + "version": "0.27.0", "description": "Web Worker support for testing in Vitest", "repository": { "type": "git", diff --git a/packages/ws-client/package.json b/packages/ws-client/package.json index 23067ac99b7c..ede667a2334a 100644 --- a/packages/ws-client/package.json +++ b/packages/ws-client/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/ws-client", "type": "module", - "version": "0.26.3", + "version": "0.27.0", "description": "WebSocket client wrapper for communicating with Vitest", "author": "Anthony Fu ", "license": "MIT",