@nx/vitest 23.2.0-beta.2 → 23.2.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -15,6 +15,27 @@ export interface VitestPluginOptions {
|
|
|
15
15
|
* - 'run': Tests run once and exit
|
|
16
16
|
*/
|
|
17
17
|
testMode?: 'watch' | 'run';
|
|
18
|
+
/**
|
|
19
|
+
* How atomized test files (the `ciTargetName` targets) are discovered.
|
|
20
|
+
* - 'glob' (default): enumerate specs with a glob that mirrors Vitest's own
|
|
21
|
+
* resolution instead of booting Vitest per project. Booting Vitest starts a
|
|
22
|
+
* Vite dev server and runs the config's plugin hooks, so the glob is faster
|
|
23
|
+
* during graph creation. The glob reads the Nx workspace file index, so
|
|
24
|
+
* files ignored by `.gitignore`/`.nxignore` are never enumerated even when
|
|
25
|
+
* Vitest itself would run them.
|
|
26
|
+
* - 'vitest': always enumerate through Vitest.
|
|
27
|
+
*
|
|
28
|
+
* Configs a glob cannot reproduce faithfully still boot Vitest automatically
|
|
29
|
+
* even under 'glob': `test.projects`/`test.workspace` (inline or an
|
|
30
|
+
* auto-loaded `vitest.workspace.*`/`vitest.projects.*` sibling file), plugins
|
|
31
|
+
* with a `configureVitest` hook, `test.changed`/`test.related`, enabled
|
|
32
|
+
* browser `instances` that set their own include/exclude/includeSource/dir,
|
|
33
|
+
* and `include`, `exclude`, `includeSource`, or `typecheck` include/exclude
|
|
34
|
+
* patterns the workspace glob reads differently (absolute paths, a trailing
|
|
35
|
+
* `/`, or an `!(...)` extglob, each optionally negated).
|
|
36
|
+
* @default 'glob'
|
|
37
|
+
*/
|
|
38
|
+
discoverTestFiles?: 'glob' | 'vitest';
|
|
18
39
|
}
|
|
19
40
|
/**
|
|
20
41
|
* @deprecated The 'createDependencies' function is now a no-op. This functionality is included in 'createNodesV2'.
|
|
@@ -6,10 +6,12 @@ const devkit_1 = require("@nx/devkit");
|
|
|
6
6
|
const js_1 = require("@nx/js");
|
|
7
7
|
const internal_2 = require("@nx/js/internal");
|
|
8
8
|
const node_fs_1 = require("node:fs");
|
|
9
|
+
const promises_1 = require("node:fs/promises");
|
|
9
10
|
const node_path_1 = require("node:path");
|
|
10
11
|
const file_hasher_1 = require("nx/src/hasher/file-hasher");
|
|
11
12
|
const cache_directory_1 = require("nx/src/utils/cache-directory");
|
|
12
13
|
const plugins_1 = require("nx/src/utils/plugins");
|
|
14
|
+
const workspace_context_1 = require("nx/src/utils/workspace-context");
|
|
13
15
|
const executor_utils_1 = require("../utils/executor-utils");
|
|
14
16
|
/**
|
|
15
17
|
* @deprecated The 'createDependencies' function is now a no-op. This functionality is included in 'createNodesV2'.
|
|
@@ -129,9 +131,7 @@ async function buildVitestTargets(configFilePath, projectRoot, options, context,
|
|
|
129
131
|
// entirely so it does not register a project rooted at the workspace root (which
|
|
130
132
|
// would, for example, make `nx format` treat the whole workspace as one project).
|
|
131
133
|
const isWorkspaceRoot = projectRoot === '.';
|
|
132
|
-
|
|
133
|
-
// "nodenext". Vite 8's rolldown types break vitest's test augmentation.
|
|
134
|
-
const hasProjectsProperty = Array.isArray(viteBuildConfig?.test?.projects);
|
|
134
|
+
const hasProjectsProperty = Array.isArray(viteBuildConfig.test?.projects);
|
|
135
135
|
if (isWorkspaceRoot && hasProjectsProperty) {
|
|
136
136
|
return null;
|
|
137
137
|
}
|
|
@@ -141,8 +141,7 @@ async function buildVitestTargets(configFilePath, projectRoot, options, context,
|
|
|
141
141
|
const targets = {};
|
|
142
142
|
// if file is vitest.config or vite.config has definition for test, create targets for test and/or atomized tests
|
|
143
143
|
if (configFilePath.includes('vitest.config') || hasTest) {
|
|
144
|
-
const isTypecheckEnabled = !!viteBuildConfig
|
|
145
|
-
?.enabled;
|
|
144
|
+
const isTypecheckEnabled = !!viteBuildConfig.test?.typecheck?.enabled;
|
|
146
145
|
targets[options.testTargetName] = await testTarget(namedInputs, testOutputs, projectRoot, options.testMode, pmc, isTypecheckEnabled, tsconfigInputs);
|
|
147
146
|
if (options.ciTargetName) {
|
|
148
147
|
const groupName = options.ciGroupName ?? (0, plugins_1.deriveGroupNameFromTarget)(options.ciTargetName);
|
|
@@ -153,7 +152,24 @@ async function buildVitestTargets(configFilePath, projectRoot, options, context,
|
|
|
153
152
|
[groupName]: targetGroup,
|
|
154
153
|
},
|
|
155
154
|
};
|
|
156
|
-
|
|
155
|
+
// Not normalizing in normalizeOptions since it also affects the options
|
|
156
|
+
// computed for convert-to-inferred.
|
|
157
|
+
const useGlobDiscovery = (options.discoverTestFiles ?? 'glob') !== 'vitest';
|
|
158
|
+
// Both discovery paths read the serve-resolved config: Vitest runs tests
|
|
159
|
+
// through a Vite server (the `serve` command), so `apply: 'serve'`
|
|
160
|
+
// plugins and command-sensitive `test` options (include/exclude and
|
|
161
|
+
// `dir`) are absent from the build resolution used above for outputs.
|
|
162
|
+
// Resolve under `mode: 'test'` to match Vitest, which defaults the Vite
|
|
163
|
+
// mode to 'test'; a config that branches on `command`/`mode` would
|
|
164
|
+
// otherwise enumerate a different spec set here than at test time.
|
|
165
|
+
const viteServeConfig = await resolveConfig({
|
|
166
|
+
configFile: absoluteConfigFilePath,
|
|
167
|
+
mode: 'test',
|
|
168
|
+
}, 'serve');
|
|
169
|
+
const projectRootRelativeTestPaths = await getTestPathsRelativeToProjectRoot(projectRoot, context.workspaceRoot,
|
|
170
|
+
// Only the glob path reads this config; the opt-out path forces the
|
|
171
|
+
// runtime by receiving no config, and takes `test.dir` separately.
|
|
172
|
+
useGlobDiscovery ? viteServeConfig : undefined, viteServeConfig.test?.dir);
|
|
157
173
|
for (const relativePath of projectRootRelativeTestPaths) {
|
|
158
174
|
if (relativePath.includes('../')) {
|
|
159
175
|
throw new Error('@nx/vitest attempted to run tests outside of the project root. This is not supported and should not happen. Please open an issue at https://github.com/nrwl/nx/issues/new/choose with the following information:\n\n' +
|
|
@@ -403,12 +419,205 @@ function checkIfConfigFileShouldBeProject(projectRoot, context) {
|
|
|
403
419
|
}
|
|
404
420
|
return true;
|
|
405
421
|
}
|
|
406
|
-
async function getTestPathsRelativeToProjectRoot(projectRoot, workspaceRoot
|
|
422
|
+
async function getTestPathsRelativeToProjectRoot(projectRoot, workspaceRoot, viteConfig,
|
|
423
|
+
// Serve-resolved `test.dir` (the command Vitest runs under). Only used on the
|
|
424
|
+
// opt-out path below, which receives no `viteConfig` to read it from.
|
|
425
|
+
optOutTestDir) {
|
|
407
426
|
const fullProjectRoot = (0, node_path_1.join)(workspaceRoot, projectRoot);
|
|
427
|
+
// `viteConfig` is resolved only when glob discovery is requested; its absence
|
|
428
|
+
// means the runtime path was selected (`discoverTestFiles: 'vitest'`).
|
|
429
|
+
if (viteConfig) {
|
|
430
|
+
const test = viteConfig.test ?? {};
|
|
431
|
+
if (!configRequiresVitestRuntime(test, viteConfig, fullProjectRoot)) {
|
|
432
|
+
return globTestPathsRelativeToProjectRoot(test, workspaceRoot, projectRoot, fullProjectRoot);
|
|
433
|
+
}
|
|
434
|
+
return getTestPathsViaVitestRuntime(fullProjectRoot, projectRoot, test.dir);
|
|
435
|
+
}
|
|
436
|
+
return getTestPathsViaVitestRuntime(fullProjectRoot, projectRoot, optOutTestDir);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* The directory Vitest enumerates from: `test.dir` when set, else the project
|
|
440
|
+
* root. Vitest resolves a relative `test.dir` against the working directory,
|
|
441
|
+
* which for both the `test` and atomized targets is the project root.
|
|
442
|
+
*/
|
|
443
|
+
function resolveTestDir(fullProjectRoot, testDir) {
|
|
444
|
+
return testDir ? (0, node_path_1.resolve)(fullProjectRoot, testDir) : fullProjectRoot;
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Enumerates a project's test files by mirroring Vitest's own resolution with
|
|
448
|
+
* a glob. Vitest globs `test.include` and `test.includeSource` (both skipped
|
|
449
|
+
* when typecheck is enabled with `only`, the latter also kept only when the
|
|
450
|
+
* file contains an in-source test) plus `test.typecheck.include` (when
|
|
451
|
+
* typecheck is enabled), each minus the relevant `exclude`, from `test.dir`
|
|
452
|
+
* when set and the project root otherwise. Defaults come from the installed
|
|
453
|
+
* Vitest so they track the user's version. Globbing goes through the Nx
|
|
454
|
+
* workspace context (the daemon-cached file index), so files ignored by
|
|
455
|
+
* `.gitignore`/`.nxignore` are never candidates. Callers must first confirm the
|
|
456
|
+
* config is reproducible with a glob via `configRequiresVitestRuntime`.
|
|
457
|
+
*/
|
|
458
|
+
async function globTestPathsRelativeToProjectRoot(test, workspaceRoot, projectRoot, fullProjectRoot) {
|
|
459
|
+
const { configDefaults } = await (0, executor_utils_1.loadVitestConfigDynamicImport)();
|
|
460
|
+
const exclude = test.exclude ?? configDefaults.exclude;
|
|
461
|
+
const typecheck = test.typecheck;
|
|
462
|
+
const typecheckOnly = !!(typecheck?.enabled && typecheck?.only);
|
|
463
|
+
// The workspace context matches workspace-relative paths, while the config's
|
|
464
|
+
// patterns are relative to the directory Vitest enumerates from; anchor them
|
|
465
|
+
// to it.
|
|
466
|
+
const scanRoot = test.dir
|
|
467
|
+
? (0, devkit_1.normalizePath)((0, node_path_1.relative)(workspaceRoot, resolveTestDir(fullProjectRoot, test.dir)))
|
|
468
|
+
: projectRoot;
|
|
469
|
+
// The workspace context only reads `!` at index 0, so a negated pattern has
|
|
470
|
+
// to be re-prefixed rather than anchored as-is.
|
|
471
|
+
const anchor = (pattern) => isNegatedPattern(pattern)
|
|
472
|
+
? `!${(0, devkit_1.joinPathFragments)(scanRoot, pattern.slice(1))}`
|
|
473
|
+
: (0, devkit_1.joinPathFragments)(scanRoot, pattern);
|
|
474
|
+
const globProjectFiles = (include, ignore) => {
|
|
475
|
+
// The workspace context treats an all-negated (or empty) include set as
|
|
476
|
+
// "match everything" (it inverts to the exclude set), while Vitest
|
|
477
|
+
// enumerates nothing. Match Vitest: without a positive entry there is
|
|
478
|
+
// nothing to enumerate.
|
|
479
|
+
if (!include.some((pattern) => !isNegatedPattern(pattern))) {
|
|
480
|
+
return Promise.resolve([]);
|
|
481
|
+
}
|
|
482
|
+
return (0, workspace_context_1.globWithWorkspaceContext)(workspaceRoot, include.map(anchor),
|
|
483
|
+
// Vitest discards a negated `exclude` entry; forwarding it would turn the
|
|
484
|
+
// exclude set into an allowlist.
|
|
485
|
+
ignore.filter((pattern) => !isNegatedPattern(pattern)).map(anchor));
|
|
486
|
+
};
|
|
487
|
+
// Regular and type tests are independent walks; run them together.
|
|
488
|
+
const globJobs = [];
|
|
489
|
+
// Typecheck enabled with `only` makes Vitest run only type tests, so skip
|
|
490
|
+
// regular tests.
|
|
491
|
+
if (!typecheckOnly) {
|
|
492
|
+
const include = test.include ?? configDefaults.include;
|
|
493
|
+
globJobs.push(globProjectFiles(include, exclude));
|
|
494
|
+
}
|
|
495
|
+
if (typecheck?.enabled) {
|
|
496
|
+
const include = typecheck.include ?? configDefaults.typecheck.include;
|
|
497
|
+
const ignore = typecheck.exclude ?? configDefaults.typecheck.exclude;
|
|
498
|
+
globJobs.push(globProjectFiles(include, ignore));
|
|
499
|
+
}
|
|
500
|
+
const matches = new Set();
|
|
501
|
+
for (const files of await Promise.all(globJobs)) {
|
|
502
|
+
for (const file of files)
|
|
503
|
+
matches.add(file);
|
|
504
|
+
}
|
|
505
|
+
// In-source tests: only files that actually contain a test are included.
|
|
506
|
+
// Typecheck enabled with `only` makes Vitest run only type tests, so skip
|
|
507
|
+
// these too.
|
|
508
|
+
if (!typecheckOnly && test.includeSource?.length) {
|
|
509
|
+
const sourceFiles = await globProjectFiles(test.includeSource, exclude);
|
|
510
|
+
// The candidate set can be the whole `src` tree, so read in bounded
|
|
511
|
+
// batches; an unbounded Promise.all over every file risks EMFILE.
|
|
512
|
+
const readConcurrency = 25;
|
|
513
|
+
for (let i = 0; i < sourceFiles.length; i += readConcurrency) {
|
|
514
|
+
const inSourceMatches = await Promise.all(sourceFiles.slice(i, i + readConcurrency).map(async (file) => {
|
|
515
|
+
// Vitest tolerates unreadable in-source candidates and skips them;
|
|
516
|
+
// match that so a permission error or TOCTOU race can't abort graph
|
|
517
|
+
// creation.
|
|
518
|
+
try {
|
|
519
|
+
const content = await (0, promises_1.readFile)((0, node_path_1.join)(workspaceRoot, file), 'utf-8');
|
|
520
|
+
return content.includes('import.meta.vitest') ? file : null;
|
|
521
|
+
}
|
|
522
|
+
catch {
|
|
523
|
+
return null;
|
|
524
|
+
}
|
|
525
|
+
}));
|
|
526
|
+
for (const file of inSourceMatches) {
|
|
527
|
+
if (file)
|
|
528
|
+
matches.add(file);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
// The workspace context returns workspace-relative paths, so re-relativize
|
|
533
|
+
// them to the project root. An `include` pattern (`../lib2/**`) or an
|
|
534
|
+
// out-of-project `test.dir` can land outside the project root, so drop what
|
|
535
|
+
// does, matching the runtime path.
|
|
536
|
+
return [...matches]
|
|
537
|
+
.map((file) => (0, devkit_1.normalizePath)((0, node_path_1.relative)(projectRoot, file)))
|
|
538
|
+
.filter((file) => !file.startsWith('../'))
|
|
539
|
+
.sort();
|
|
540
|
+
}
|
|
541
|
+
// Vitest reads a leading `!` as a negation, except when it opens an extglob
|
|
542
|
+
// (`!(...)`), which the runtime gate routes away before discovery reaches here.
|
|
543
|
+
function isNegatedPattern(pattern) {
|
|
544
|
+
return pattern.startsWith('!') && !pattern.startsWith('!(');
|
|
545
|
+
}
|
|
546
|
+
/**
|
|
547
|
+
* Whether the workspace context resolves a pattern differently than Vitest.
|
|
548
|
+
* Anchoring rewrites an absolute pattern into a project-relative one that
|
|
549
|
+
* enumerates the wrong location; a trailing `/` becomes a recursive directory
|
|
550
|
+
* match where Vitest (globbing with `expandDirectories: false`) matches
|
|
551
|
+
* nothing; and `!(...)` converts to an include plus literal exclusions that
|
|
552
|
+
* reproduces Vitest's extglob only for some shapes. A leading `!` is stripped
|
|
553
|
+
* first so a negated form of any of these still routes to the runtime.
|
|
554
|
+
*/
|
|
555
|
+
function patternRequiresVitestRuntime(pattern) {
|
|
556
|
+
const bare = isNegatedPattern(pattern) ? pattern.slice(1) : pattern;
|
|
557
|
+
return (0, node_path_1.isAbsolute)(bare) || bare.endsWith('/') || bare.includes('!(');
|
|
558
|
+
}
|
|
559
|
+
// Sibling files Vitest 3 auto-loads to define sub-projects even when the config
|
|
560
|
+
// object declares none. Removed in Vitest 4 in favor of inline `test.projects`.
|
|
561
|
+
const vitestWorkspaceFiles = ['vitest.workspace', 'vitest.projects'].flatMap((name) => ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs', 'json'].map((ext) => `${name}.${ext}`));
|
|
562
|
+
/**
|
|
563
|
+
* Whether a config's test discovery cannot be faithfully reproduced with a
|
|
564
|
+
* glob, so enumeration must go through Vitest itself.
|
|
565
|
+
*/
|
|
566
|
+
function configRequiresVitestRuntime(
|
|
567
|
+
// `workspace` (removed in Vitest 4) and the CLI-only `changed`/`related`
|
|
568
|
+
// filters are not part of the config-file `InlineConfig` type.
|
|
569
|
+
test, viteConfig, projectDir) {
|
|
570
|
+
// Multi-project configs resolve include/exclude per sub-project.
|
|
571
|
+
if (Array.isArray(test?.projects) || test?.workspace)
|
|
572
|
+
return true;
|
|
573
|
+
// Vitest 3 auto-loads a `vitest.workspace.*`/`vitest.projects.*` sibling file
|
|
574
|
+
// to define sub-projects even when the config object declares none; the glob
|
|
575
|
+
// resolves only the single config, so it cannot reproduce that.
|
|
576
|
+
if (vitestWorkspaceFiles.some((file) => (0, node_fs_1.existsSync)((0, node_path_1.join)(projectDir, file)))) {
|
|
577
|
+
return true;
|
|
578
|
+
}
|
|
579
|
+
// Vitest filters specs by VCS/graph state, which a glob cannot know.
|
|
580
|
+
if (test?.changed || test?.related)
|
|
581
|
+
return true;
|
|
582
|
+
// Vitest's own defaults carry none of these shapes, so only a config that
|
|
583
|
+
// spells one out reaches the runtime for this reason.
|
|
584
|
+
const configuredPatterns = [
|
|
585
|
+
test?.include,
|
|
586
|
+
test?.exclude,
|
|
587
|
+
test?.includeSource,
|
|
588
|
+
test?.typecheck?.include,
|
|
589
|
+
test?.typecheck?.exclude,
|
|
590
|
+
]
|
|
591
|
+
.filter(Array.isArray)
|
|
592
|
+
.flat();
|
|
593
|
+
if (configuredPatterns.some(patternRequiresVitestRuntime))
|
|
594
|
+
return true;
|
|
595
|
+
// Browser mode: an instance can override include/exclude/includeSource, and
|
|
596
|
+
// `dir` (the base directory Vitest scans), so a top-level glob enumerates a
|
|
597
|
+
// different spec set than the instance would. Vitest ignores `instances`
|
|
598
|
+
// while browser mode is off, and the atomized target runs `vitest run <file>`
|
|
599
|
+
// without a browser flag, so the resolved `enabled` matches the run.
|
|
600
|
+
const browserInstances = test?.browser?.instances ?? [];
|
|
601
|
+
if (test?.browser?.enabled &&
|
|
602
|
+
browserInstances.some((instance) => instance &&
|
|
603
|
+
(instance.include?.length ||
|
|
604
|
+
instance.exclude?.length ||
|
|
605
|
+
instance.includeSource?.length ||
|
|
606
|
+
instance.dir))) {
|
|
607
|
+
return true;
|
|
608
|
+
}
|
|
609
|
+
// A plugin can inject or reshape projects through this Vitest-only hook.
|
|
610
|
+
const plugins = viteConfig?.plugins ?? [];
|
|
611
|
+
return plugins.some((plugin) => plugin && typeof plugin === 'object' && 'configureVitest' in plugin);
|
|
612
|
+
}
|
|
613
|
+
async function getTestPathsViaVitestRuntime(fullProjectRoot, projectRoot, testDir) {
|
|
408
614
|
const { createVitest } = await import('vitest/node');
|
|
409
615
|
const vitest = await createVitest('test', {
|
|
410
616
|
root: fullProjectRoot,
|
|
411
|
-
dir
|
|
617
|
+
// `dir` defaults to `root`, and a relative `test.dir` would resolve against
|
|
618
|
+
// the working directory, which during graph creation is the workspace root
|
|
619
|
+
// rather than the project root.
|
|
620
|
+
dir: resolveTestDir(fullProjectRoot, testDir),
|
|
412
621
|
filesOnly: true,
|
|
413
622
|
watch: false,
|
|
414
623
|
});
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export declare function loadViteDynamicImport(): Promise<
|
|
1
|
+
export declare function loadViteDynamicImport(): Promise<typeof import('vite')>;
|
|
2
2
|
export declare function loadVitestDynamicImport(): Promise<typeof import('vitest/node')>;
|
|
3
|
+
export declare function loadVitestConfigDynamicImport(): Promise<typeof import('vitest/config')>;
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.loadViteDynamicImport = loadViteDynamicImport;
|
|
4
4
|
exports.loadVitestDynamicImport = loadVitestDynamicImport;
|
|
5
|
-
|
|
6
|
-
// "nodenext". Vite 8 ships ESM-only type declarations (.d.mts) not resolvable
|
|
7
|
-
// under moduleResolution: "node".
|
|
5
|
+
exports.loadVitestConfigDynamicImport = loadVitestConfigDynamicImport;
|
|
8
6
|
function loadViteDynamicImport() {
|
|
9
7
|
return Function('return import("vite")')();
|
|
10
8
|
}
|
|
11
9
|
function loadVitestDynamicImport() {
|
|
12
10
|
return Function('return import("vitest/node")')();
|
|
13
11
|
}
|
|
12
|
+
function loadVitestConfigDynamicImport() {
|
|
13
|
+
return Function('return import("vitest/config")')();
|
|
14
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nx/vitest",
|
|
3
3
|
"description": "The Nx Plugin for Vitest to enable fast unit testing with Vitest.",
|
|
4
|
-
"version": "23.2.0-beta.
|
|
4
|
+
"version": "23.2.0-beta.3",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -73,13 +73,13 @@
|
|
|
73
73
|
"tslib": "^2.3.0",
|
|
74
74
|
"semver": "^7.6.3",
|
|
75
75
|
"@phenomnomnominal/tsquery": "~6.2.0",
|
|
76
|
-
"@nx/devkit": "23.2.0-beta.
|
|
77
|
-
"@nx/js": "23.2.0-beta.
|
|
76
|
+
"@nx/devkit": "23.2.0-beta.3",
|
|
77
|
+
"@nx/js": "23.2.0-beta.3"
|
|
78
78
|
},
|
|
79
79
|
"peerDependencies": {
|
|
80
80
|
"vitest": "^3.0.0 || ^4.0.0",
|
|
81
81
|
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
|
|
82
|
-
"@nx/eslint": "23.2.0-beta.
|
|
82
|
+
"@nx/eslint": "23.2.0-beta.3"
|
|
83
83
|
},
|
|
84
84
|
"peerDependenciesMeta": {
|
|
85
85
|
"@nx/eslint": {
|
|
@@ -93,6 +93,6 @@
|
|
|
93
93
|
}
|
|
94
94
|
},
|
|
95
95
|
"devDependencies": {
|
|
96
|
-
"nx": "23.2.0-beta.
|
|
96
|
+
"nx": "23.2.0-beta.3"
|
|
97
97
|
}
|
|
98
98
|
}
|