From 72f198119d87cf03ca299bdb007b22a759651a37 Mon Sep 17 00:00:00 2001 From: Lev Chelyadinov Date: Fri, 17 Jan 2025 00:54:31 +0100 Subject: [PATCH] Add the first integration test (#124) --- .changeset/flat-months-bow.md | 5 + .github/workflows/bundle-size-trusted.yaml | 4 +- .../src/app/ui/App.tsx | 1 + .../src/app/ui/index.ts | 1 + .../src/entities/user/api/getUser.ts | 3 + .../tsconfig.app.json | 12 ++ .../kitchen-sink-of-fsd-issues/tsconfig.json | 5 +- integration-tests/README.md | 10 ++ integration-tests/eslint.config.mjs | 1 + integration-tests/package.json | 37 ++++++ integration-tests/reset.d.ts | 2 + .../scripts/update-windows-snapshots.mjs | 23 ++++ .../__snapshots__/smoke-stderr-posix.txt | 45 +++++++ .../__snapshots__/smoke-stderr-windows.txt | 45 +++++++ integration-tests/tests/smoke.test.ts | 24 ++++ integration-tests/tsconfig.json | 7 + integration-tests/utils/get-bin-path.ts | 22 ++++ packages/steiger/src/app.ts | 21 ++- pnpm-lock.yaml | 120 +++++++++++++++++- pnpm-workspace.yaml | 1 + 20 files changed, 373 insertions(+), 16 deletions(-) create mode 100644 .changeset/flat-months-bow.md create mode 100644 examples/kitchen-sink-of-fsd-issues/src/app/ui/App.tsx create mode 100644 examples/kitchen-sink-of-fsd-issues/src/app/ui/index.ts create mode 100644 examples/kitchen-sink-of-fsd-issues/tsconfig.app.json create mode 100644 integration-tests/README.md create mode 100644 integration-tests/eslint.config.mjs create mode 100644 integration-tests/package.json create mode 100644 integration-tests/reset.d.ts create mode 100644 integration-tests/scripts/update-windows-snapshots.mjs create mode 100644 integration-tests/tests/__snapshots__/smoke-stderr-posix.txt create mode 100644 integration-tests/tests/__snapshots__/smoke-stderr-windows.txt create mode 100644 integration-tests/tests/smoke.test.ts create mode 100644 integration-tests/tsconfig.json create mode 100644 integration-tests/utils/get-bin-path.ts diff --git a/.changeset/flat-months-bow.md b/.changeset/flat-months-bow.md new file mode 100644 index 00000000..c402ae72 --- /dev/null +++ b/.changeset/flat-months-bow.md @@ -0,0 +1,5 @@ +--- +'steiger': patch +--- + +The diagnostics from a single rule are now sorted by path in alphabetical order diff --git a/.github/workflows/bundle-size-trusted.yaml b/.github/workflows/bundle-size-trusted.yaml index 8ff1e313..c91c7c2d 100644 --- a/.github/workflows/bundle-size-trusted.yaml +++ b/.github/workflows/bundle-size-trusted.yaml @@ -47,8 +47,8 @@ jobs: } } const fs = require('fs'); - const sizes = parseDuOutput(fs.readFileSync(`sizes-${${{ toJson(github.base_ref) }}}.txt`, 'utf8')); - const sizesPR = parseDuOutput(fs.readFileSync(`sizes-${${{ toJson(github.head_ref) }}}.txt`, 'utf8')); + const sizes = parseDuOutput(fs.readFileSync('sizes-master.txt', 'utf8')); + const sizesPR = parseDuOutput(fs.readFileSync(`sizes-${${{ toJson(github.event.workflow_run.head_branch) }}}.txt`, 'utf8')); core.summary.addHeading('πŸ“Š Package size report', '3'); core.summary.addTable([ ['Package', 'Before', 'After'].map((data) => ({ data, header: true })), diff --git a/examples/kitchen-sink-of-fsd-issues/src/app/ui/App.tsx b/examples/kitchen-sink-of-fsd-issues/src/app/ui/App.tsx new file mode 100644 index 00000000..8a3c0704 --- /dev/null +++ b/examples/kitchen-sink-of-fsd-issues/src/app/ui/App.tsx @@ -0,0 +1 @@ +export const App = {} diff --git a/examples/kitchen-sink-of-fsd-issues/src/app/ui/index.ts b/examples/kitchen-sink-of-fsd-issues/src/app/ui/index.ts new file mode 100644 index 00000000..5bfcd166 --- /dev/null +++ b/examples/kitchen-sink-of-fsd-issues/src/app/ui/index.ts @@ -0,0 +1 @@ +export { App } from './App' diff --git a/examples/kitchen-sink-of-fsd-issues/src/entities/user/api/getUser.ts b/examples/kitchen-sink-of-fsd-issues/src/entities/user/api/getUser.ts index e69de29b..299155c1 100644 --- a/examples/kitchen-sink-of-fsd-issues/src/entities/user/api/getUser.ts +++ b/examples/kitchen-sink-of-fsd-issues/src/entities/user/api/getUser.ts @@ -0,0 +1,3 @@ +import { App } from '@/app/ui/App' + +console.log(App) diff --git a/examples/kitchen-sink-of-fsd-issues/tsconfig.app.json b/examples/kitchen-sink-of-fsd-issues/tsconfig.app.json new file mode 100644 index 00000000..65fcfb5f --- /dev/null +++ b/examples/kitchen-sink-of-fsd-issues/tsconfig.app.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "module": "ESNext", + "jsx": "react-jsx", + "moduleResolution": "Bundler", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src"] +} diff --git a/examples/kitchen-sink-of-fsd-issues/tsconfig.json b/examples/kitchen-sink-of-fsd-issues/tsconfig.json index 0967ef42..82a8007e 100644 --- a/examples/kitchen-sink-of-fsd-issues/tsconfig.json +++ b/examples/kitchen-sink-of-fsd-issues/tsconfig.json @@ -1 +1,4 @@ -{} +{ + "files": [], + "references": [{ "path": "./tsconfig.app.json" }] +} diff --git a/integration-tests/README.md b/integration-tests/README.md new file mode 100644 index 00000000..df5b65ad --- /dev/null +++ b/integration-tests/README.md @@ -0,0 +1,10 @@ +# How to write integration tests + +> [!NOTE] +> You should develop tests on either Mac or Linux. If you have a Windows machine, consider using a [devcontainer](containers.dev). +> +> This is mainly because the Unicode symbols used in the output are always replaced by fallbacks on Windows, so converting outputs from Windows to POSIX isn't practical. + +Create a new file with the `.test.ts` extension in the `tests/` folder. Use `tests/smoke.test.ts` as a reference on how to set up a temporary folder for the project and execute Steiger. + +Store your output snapshots in `__snapshots__` with the `-posix.txt` extension. After you wrote your test, run `pnpm update-windows-snapshots` to copy over the changes in snapshots. diff --git a/integration-tests/eslint.config.mjs b/integration-tests/eslint.config.mjs new file mode 100644 index 00000000..0cab0553 --- /dev/null +++ b/integration-tests/eslint.config.mjs @@ -0,0 +1 @@ +export { default } from '@steiger/eslint-config' diff --git a/integration-tests/package.json b/integration-tests/package.json new file mode 100644 index 00000000..3efd065a --- /dev/null +++ b/integration-tests/package.json @@ -0,0 +1,37 @@ +{ + "private": true, + "name": "@steiger/integration-tests", + "description": "Integration tests for Steiger", + "version": "0.1.0", + "scripts": { + "test": "vitest run", + "update-windows-snapshots": "node ./scripts/update-windows-snapshots.mjs" + }, + "exports": { + ".": "./src/index.ts" + }, + "type": "module", + "authors": [ + { + "name": "Lev Chelyadinov", + "email": "leva181777@gmail.com", + "url": "https://github.com/illright" + } + ], + "devDependencies": { + "@steiger/eslint-config": "workspace:*", + "@steiger/tsconfig": "workspace:*", + "@total-typescript/ts-reset": "^0.6.1", + "@types/node": "^18.11.9", + "eslint": "^9.16.0", + "figures": "^6.1.0", + "get-bin-path": "^11.0.0", + "prettier": "^3.4.2", + "tinyexec": "^0.3.1", + "typescript": "^5.7.2", + "vitest": "^3.0.0-beta.2" + }, + "dependencies": { + "steiger": "workspace:*" + } +} diff --git a/integration-tests/reset.d.ts b/integration-tests/reset.d.ts new file mode 100644 index 00000000..e3f32cd1 --- /dev/null +++ b/integration-tests/reset.d.ts @@ -0,0 +1,2 @@ +// Do not add any other lines of code to this file! +import '@total-typescript/ts-reset' diff --git a/integration-tests/scripts/update-windows-snapshots.mjs b/integration-tests/scripts/update-windows-snapshots.mjs new file mode 100644 index 00000000..8755a54e --- /dev/null +++ b/integration-tests/scripts/update-windows-snapshots.mjs @@ -0,0 +1,23 @@ +/** + * Run this script on Mac or Linux when you update test snapshots to port these changes over to Windows snapshots. + * + * $ pnpm run update-windows-snapshots + */ + +import * as fs from 'node:fs/promises' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { replaceSymbols } from 'figures' + +const snapshotsFolder = join(dirname(fileURLToPath(import.meta.url)), '../tests/__snapshots__') + +// Go through each POSIX snapshot and replace the forward slashes in diagnostic paths with backslashes +for (const file of await fs.readdir(snapshotsFolder)) { + if (file.endsWith('-posix.txt')) { + const windowsSnapshotName = file.slice(0, -'-posix.txt'.length) + '-windows.txt' + const updatedSnapshot = replaceSymbols(await fs.readFile(join(snapshotsFolder, file), 'utf8'), { + useFallback: true, + }).replace(/(?<=β”Œ.+)\//gm, '\\') + await fs.writeFile(join(snapshotsFolder, windowsSnapshotName), updatedSnapshot) + } +} diff --git a/integration-tests/tests/__snapshots__/smoke-stderr-posix.txt b/integration-tests/tests/__snapshots__/smoke-stderr-posix.txt new file mode 100644 index 00000000..01ebdfbc --- /dev/null +++ b/integration-tests/tests/__snapshots__/smoke-stderr-posix.txt @@ -0,0 +1,45 @@ + +β”Œ src/entities/user/api/getUser.ts +✘ Forbidden import from higher layer "app". +β”‚ +β”” fsd/forbidden-imports (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/forbidden-imports​) + +β”Œ src/entities +✘ Inconsistent pluralization of slice names. Prefer all plural names +βœ” Auto-fixable +β”‚ +β”” fsd/inconsistent-naming (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/inconsistent-naming​) + +β”Œ src/entities/user +✘ This slice has no references. Consider removing it. +β”‚ +β”” fsd/insignificant-slice (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/insignificant-slice​) + +β”Œ src/entities/users +✘ This slice has no references. Consider removing it. +β”‚ +β”” fsd/insignificant-slice (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/insignificant-slice​) + +β”Œ src/entities/user/api/getUser.ts +✘ Forbidden sidestep of public API when importing from "@/app/ui/App". +β”‚ +β”” fsd/no-public-api-sidestep (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/no-public-api-sidestep​) + +β”Œ src/entities/user/ui/api +✘ Having a folder with the name "api" inside a segment could be confusing because that name is commonly used for segments. Consider renaming it. +β”‚ +β”” fsd/no-reserved-folder-names (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/no-reserved-folder-names​) + +β”Œ src/app/ui +✘ Layer "app" should not have "ui" segment. +β”‚ +β”” fsd/no-ui-in-app (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/no-ui-in-app​) + +β”Œ src/processes +✘ Layer "processes" is deprecated, avoid using it +β”‚ +β”” fsd/no-processes (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/no-processes​) + +──────────────────────────────────────────────────────── + Found 8 errors (1 can be fixed automatically with --fix) + diff --git a/integration-tests/tests/__snapshots__/smoke-stderr-windows.txt b/integration-tests/tests/__snapshots__/smoke-stderr-windows.txt new file mode 100644 index 00000000..8f942e48 --- /dev/null +++ b/integration-tests/tests/__snapshots__/smoke-stderr-windows.txt @@ -0,0 +1,45 @@ + +β”Œ src\entities\user\api\getUser.ts +Γ— Forbidden import from higher layer "app". +β”‚ +β”” fsd/forbidden-imports (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/forbidden-imports​) + +β”Œ src\entities +Γ— Inconsistent pluralization of slice names. Prefer all plural names +√ Auto-fixable +β”‚ +β”” fsd/inconsistent-naming (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/inconsistent-naming​) + +β”Œ src\entities\user +Γ— This slice has no references. Consider removing it. +β”‚ +β”” fsd/insignificant-slice (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/insignificant-slice​) + +β”Œ src\entities\users +Γ— This slice has no references. Consider removing it. +β”‚ +β”” fsd/insignificant-slice (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/insignificant-slice​) + +β”Œ src\entities\user\api\getUser.ts +Γ— Forbidden sidestep of public API when importing from "@/app/ui/App". +β”‚ +β”” fsd/no-public-api-sidestep (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/no-public-api-sidestep​) + +β”Œ src\entities\user\ui\api +Γ— Having a folder with the name "api" inside a segment could be confusing because that name is commonly used for segments. Consider renaming it. +β”‚ +β”” fsd/no-reserved-folder-names (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/no-reserved-folder-names​) + +β”Œ src\app\ui +Γ— Layer "app" should not have "ui" segment. +β”‚ +β”” fsd/no-ui-in-app (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/no-ui-in-app​) + +β”Œ src\processes +Γ— Layer "processes" is deprecated, avoid using it +β”‚ +β”” fsd/no-processes (​https://github.com/feature-sliced/steiger/tree/master/packages/steiger-plugin-fsd/src/no-processes​) + +──────────────────────────────────────────────────────── + Found 8 errors (1 can be fixed automatically with --fix) + diff --git a/integration-tests/tests/smoke.test.ts b/integration-tests/tests/smoke.test.ts new file mode 100644 index 00000000..c077c623 --- /dev/null +++ b/integration-tests/tests/smoke.test.ts @@ -0,0 +1,24 @@ +import * as fs from 'node:fs/promises' +import os from 'node:os' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { exec } from 'tinyexec' + +import { expect, test } from 'vitest' + +import { getSteigerBinPath } from '../utils/get-bin-path.js' + +const temporaryDirectory = await fs.realpath(os.tmpdir()) +const steiger = await getSteigerBinPath() +const kitchenSinkExample = join(dirname(fileURLToPath(import.meta.url)), '../../examples/kitchen-sink-of-fsd-issues') +const pathPlatform = os.platform() === 'win32' ? 'windows' : 'posix' + +test('basic functionality in the kitchen sink example project', async () => { + const project = join(temporaryDirectory, 'smoke') + await fs.rm(project, { recursive: true, force: true }) + await fs.cp(kitchenSinkExample, project, { recursive: true }) + + const { stderr } = await exec('node', [steiger, 'src'], { nodeOptions: { cwd: project, env: { NO_COLOR: '1' } } }) + + await expect(stderr).toMatchFileSnapshot(join('__snapshots__', `smoke-stderr-${pathPlatform}.txt`)) +}) diff --git a/integration-tests/tsconfig.json b/integration-tests/tsconfig.json new file mode 100644 index 00000000..6c65b29b --- /dev/null +++ b/integration-tests/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@steiger/tsconfig/base.json", + "include": ["./tests", "./utils", "./scripts", "./reset.d.ts"], + "compilerOptions": { + "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" + } +} diff --git a/integration-tests/utils/get-bin-path.ts b/integration-tests/utils/get-bin-path.ts new file mode 100644 index 00000000..7bc8a84d --- /dev/null +++ b/integration-tests/utils/get-bin-path.ts @@ -0,0 +1,22 @@ +import { promises as fs } from 'node:fs' +import * as process from 'node:process' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { getBinPath } from 'get-bin-path' + +/** + * Resolve the full path to the built JS file of Steiger. + * + * Rejects if the file doesn't exist. + */ +export async function getSteigerBinPath() { + const steiger = (await getBinPath({ cwd: join(dirname(fileURLToPath(import.meta.url)), '../../packages/steiger') }))! + try { + await fs.stat(steiger) + } catch { + console.error('Run `turbo build` before running integration tests') + process.exit(1) + } + + return steiger +} diff --git a/packages/steiger/src/app.ts b/packages/steiger/src/app.ts index c44a8246..05687d34 100644 --- a/packages/steiger/src/app.ts +++ b/packages/steiger/src/app.ts @@ -21,12 +21,7 @@ async function runRules({ vfs, rules }: { vfs: Folder; rules: Array }) { const vfsWithoutGlobalIgnores = removeGlobalIgnoreFromVfs(vfs, getGlobalIgnores()) const ruleResults = await Promise.all(rules.map((rule) => runRule(vfsWithoutGlobalIgnores, rule))) - return ruleResults.flatMap((r, ruleResultsIndex) => { - const { diagnostics } = r - if (diagnostics.length === 0) { - return [] - } - + return ruleResults.flatMap(({ diagnostics }, ruleResultsIndex) => { const ruleName = rules[ruleResultsIndex].name const severities = calculateFinalSeverities( vfsWithoutGlobalIgnores, @@ -34,12 +29,14 @@ async function runRules({ vfs, rules }: { vfs: Folder; rules: Array }) { diagnostics.map((d) => d.location.path), ) - return diagnostics.map((d, index) => ({ - ...d, - ruleName, - getRuleDescriptionUrl, - severity: severities[index], - })) + return diagnostics + .sort((a, b) => a.location.path.localeCompare(b.location.path)) + .map((d, index) => ({ + ...d, + ruleName, + getRuleDescriptionUrl, + severity: severities[index], + })) }) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b5f32af1..d318df70 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,6 +33,46 @@ importers: specifier: ^2.3.3 version: 2.3.3 + integration-tests: + dependencies: + steiger: + specifier: workspace:* + version: link:../packages/steiger + devDependencies: + '@steiger/eslint-config': + specifier: workspace:* + version: link:../tooling/eslint-config + '@steiger/tsconfig': + specifier: workspace:* + version: link:../tooling/tsconfig + '@total-typescript/ts-reset': + specifier: ^0.6.1 + version: 0.6.1 + '@types/node': + specifier: ^18.11.9 + version: 18.19.67 + eslint: + specifier: ^9.16.0 + version: 9.16.0 + figures: + specifier: ^6.1.0 + version: 6.1.0 + get-bin-path: + specifier: ^11.0.0 + version: 11.0.0 + prettier: + specifier: ^3.4.2 + version: 3.4.2 + tinyexec: + specifier: ^0.3.1 + version: 0.3.1 + typescript: + specifier: ^5.7.2 + version: 5.7.2 + vitest: + specifier: ^3.0.0-beta.2 + version: 3.0.0-beta.2(@types/node@18.19.67) + packages/pretty-reporter: dependencies: chalk: @@ -1857,6 +1897,10 @@ packages: resolution: {integrity: sha512-hFM7oivtlgJ3d6XWD6G47l8Wyh/C6vFw5G24Kk1Tbq85yh5gcM8Fne5/lFhiuxB+RT6+SI7I1ThB9lG4FBh3jw==} engines: {node: '>=18'} + get-bin-path@11.0.0: + resolution: {integrity: sha512-hvX/hynZJ6sxeItamADFBZo0WmLoG/qZBlRCLRv+J+oN8USw1ZxefIGJSFPu1GGd3OHWVFJKvCCN970wmpiHzg==} + engines: {node: '>=18.18.0'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -3845,7 +3889,7 @@ snapshots: debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 + minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.7.2) optionalDependencies: @@ -3895,6 +3939,14 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 + '@vitest/mocker@3.0.0-beta.2(vite@5.4.11(@types/node@18.19.67))': + dependencies: + '@vitest/spy': 3.0.0-beta.2 + estree-walker: 3.0.3 + magic-string: 0.30.15 + optionalDependencies: + vite: 5.4.11(@types/node@18.19.67) + '@vitest/mocker@3.0.0-beta.2(vite@5.4.11(@types/node@22.10.1))': dependencies: '@vitest/spy': 3.0.0-beta.2 @@ -4538,6 +4590,10 @@ snapshots: ast-module-types: 6.0.0 node-source-walk: 7.0.0 + get-bin-path@11.0.0: + dependencies: + escalade: 3.1.2 + get-caller-file@2.0.5: {} get-east-asian-width@1.3.0: {} @@ -5479,6 +5535,24 @@ snapshots: validate-npm-package-name@5.0.1: {} + vite-node@3.0.0-beta.2(@types/node@18.19.67): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.5.4 + pathe: 1.1.2 + vite: 5.4.11(@types/node@18.19.67) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-node@3.0.0-beta.2(@types/node@22.10.1): dependencies: cac: 6.7.14 @@ -5497,6 +5571,15 @@ snapshots: - supports-color - terser + vite@5.4.11(@types/node@18.19.67): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.28.1 + optionalDependencies: + '@types/node': 18.19.67 + fsevents: 2.3.3 + vite@5.4.11(@types/node@22.10.1): dependencies: esbuild: 0.21.5 @@ -5506,6 +5589,41 @@ snapshots: '@types/node': 22.10.1 fsevents: 2.3.3 + vitest@3.0.0-beta.2(@types/node@18.19.67): + dependencies: + '@vitest/expect': 3.0.0-beta.2 + '@vitest/mocker': 3.0.0-beta.2(vite@5.4.11(@types/node@18.19.67)) + '@vitest/pretty-format': 3.0.0-beta.2 + '@vitest/runner': 3.0.0-beta.2 + '@vitest/snapshot': 3.0.0-beta.2 + '@vitest/spy': 3.0.0-beta.2 + '@vitest/utils': 3.0.0-beta.2 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.15 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.11(@types/node@18.19.67) + vite-node: 3.0.0-beta.2(@types/node@18.19.67) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 18.19.67 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vitest@3.0.0-beta.2(@types/node@22.10.1): dependencies: '@vitest/expect': 3.0.0-beta.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7104d705..ca6439c9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: - 'packages/*' - 'tooling/*' + - 'integration-tests'