test: consolidate external suites under e2e

This commit is contained in:
PerishCode
2026-04-30 09:35:30 +08:00
parent 4252dca451
commit b1f7b1082a
17 changed files with 134 additions and 152 deletions
+5 -1
View File
@@ -9,7 +9,8 @@
"scripts": {
"daemon": "node cli.js --no-open",
"dev": "node cli.js --no-open",
"start": "node cli.js"
"start": "node cli.js",
"test": "vitest run -c vitest.config.ts"
},
"dependencies": {
"better-sqlite3": "^11.10.0",
@@ -17,6 +18,9 @@
"jszip": "^3.10.1",
"multer": "^1.4.5-lts.1"
},
"devDependencies": {
"vitest": "^2.1.8"
},
"engines": {
"node": "~24"
}
+8
View File
@@ -0,0 +1,8 @@
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
environment: 'node',
include: ['**/*.test.{ts,tsx,js,mjs,cjs}'],
},
});
+4 -2
View File
@@ -6,7 +6,8 @@
"scripts": {
"dev": "next dev",
"build": "next build",
"typecheck": "tsc -b --noEmit"
"typecheck": "tsc -b --noEmit",
"test": "vitest run -c vitest.config.ts"
},
"dependencies": {
"@anthropic-ai/sdk": "^0.32.1",
@@ -19,7 +20,8 @@
"@types/node": "^20.17.10",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"typescript": "^5.6.3"
"typescript": "^5.6.3",
"vitest": "^2.1.8"
},
"engines": {
"node": "~24"
+8
View File
@@ -0,0 +1,8 @@
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
environment: 'node',
include: ['src/**/*.test.{ts,tsx,js,mjs,cjs}'],
},
});
+6
View File
@@ -94,6 +94,12 @@
pnpm run test:ui
```
也可以直接在独立测试包内运行:
```bash
pnpm --filter @open-design/e2e test:ui
```
运行完成后会自动生成:
- `e2e/reports/latest.md`
+26
View File
@@ -0,0 +1,26 @@
{
"name": "@open-design/e2e",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"test": "vitest run -c vitest.config.ts",
"test:ui:clean": "node scripts/reset-artifacts.mjs",
"test:ui": "pnpm run test:ui:clean && playwright test -c playwright.config.ts",
"test:ui:headed": "pnpm run test:ui:clean && playwright test -c playwright.config.ts --headed",
"test:e2e:live": "node --test scripts/runtime-adapter.e2e.live.test.mjs"
},
"devDependencies": {
"@playwright/test": "^1.59.1",
"@testing-library/react": "^16.3.2",
"@types/node": "^20.17.10",
"jsdom": "^29.1.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"typescript": "^5.6.3",
"vitest": "^2.1.8"
},
"engines": {
"node": "~24"
}
}
+3 -3
View File
@@ -26,14 +26,14 @@ export default defineConfig({
['html', { open: 'never', outputFolder: './reports/playwright-html-report' }],
['json', { outputFile: './reports/results.json' }],
['junit', { outputFile: './reports/junit.xml' }],
['./reporters/markdown-reporter.cjs', { outputFile: 'e2e/reports/latest.md' }],
['./reporters/markdown-reporter.cjs', { outputFile: './reports/latest.md' }],
]
: [
['list'],
['html', { open: 'never', outputFolder: './reports/playwright-html-report' }],
['json', { outputFile: './reports/results.json' }],
['junit', { outputFile: './reports/junit.xml' }],
['./reporters/markdown-reporter.cjs', { outputFile: 'e2e/reports/latest.md' }],
['./reporters/markdown-reporter.cjs', { outputFile: './reports/latest.md' }],
],
use: {
baseURL,
@@ -44,7 +44,7 @@ export default defineConfig({
command:
`OD_DATA_DIR=e2e/.od-data ` +
`OD_PORT=${daemonPort} OD_PORT_STRICT=1 ` +
`NEXT_PORT=${nextPort} NEXT_PORT_STRICT=1 pnpm run dev:all`,
`NEXT_PORT=${nextPort} NEXT_PORT_STRICT=1 pnpm --dir .. run dev:all`,
url: baseURL,
reuseExistingServer: !process.env.CI,
timeout: 120_000,
+1 -1
View File
@@ -11,7 +11,7 @@
- `junit.xml`:JUnit 格式结果,方便接 CI
- `test-results/`:失败用例的截图、trace、error-context 等原始附件
每次执行 `pnpm run test:ui` 前,系统会先自动清理旧的:
每次执行 `pnpm run test:ui`(或 `pnpm --filter @open-design/e2e test:ui`)前,系统会先自动清理旧的:
- `e2e/.od-data/`
- `e2e/reports/test-results/`
@@ -3,36 +3,36 @@ import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const rootDir = path.resolve(__dirname, '..');
const e2eDir = path.resolve(__dirname, '..');
const targets = [
path.join(rootDir, 'e2e', '.od-data'),
path.join(rootDir, 'e2e', 'test-results'),
path.join(rootDir, 'e2e', 'reports', 'test-results'),
path.join(rootDir, 'e2e', 'reports', 'html'),
path.join(rootDir, 'e2e', 'reports', 'playwright-html-report'),
path.join(rootDir, 'e2e', 'reports', 'results.json'),
path.join(rootDir, 'e2e', 'reports', 'junit.xml'),
path.join(rootDir, 'e2e', 'reports', 'latest.md'),
path.join(rootDir, 'e2e', '.DS_Store'),
path.join(e2eDir, '.od-data'),
path.join(e2eDir, 'test-results'),
path.join(e2eDir, 'reports', 'test-results'),
path.join(e2eDir, 'reports', 'html'),
path.join(e2eDir, 'reports', 'playwright-html-report'),
path.join(e2eDir, 'reports', 'results.json'),
path.join(e2eDir, 'reports', 'junit.xml'),
path.join(e2eDir, 'reports', 'latest.md'),
path.join(e2eDir, '.DS_Store'),
];
for (const target of targets) {
await rm(target, { recursive: true, force: true });
}
await mkdir(path.join(rootDir, 'e2e', 'reports'), { recursive: true });
await mkdir(path.join(e2eDir, 'reports'), { recursive: true });
// Recreate runtime roots so local inspection stays predictable even before
// Playwright or the daemon materializes them.
await mkdir(path.join(rootDir, 'e2e', '.od-data'), { recursive: true });
await mkdir(path.join(rootDir, 'e2e', 'reports', 'test-results'), {
await mkdir(path.join(e2eDir, '.od-data'), { recursive: true });
await mkdir(path.join(e2eDir, 'reports', 'test-results'), {
recursive: true,
});
// Best-effort removal of accidental empty directories directly under the
// test data root. This keeps old project ids from piling up across runs.
const projectsRoot = path.join(rootDir, 'e2e', '.od-data', 'projects');
const projectsRoot = path.join(e2eDir, '.od-data', 'projects');
try {
const entries = await readdir(projectsRoot, { withFileTypes: true });
await Promise.all(
@@ -22,8 +22,8 @@ let dataDir;
test.before(async () => {
dataDir = await fs.mkdtemp(path.join(os.tmpdir(), 'od-runtime-adapter-live-'));
process.env.OD_DATA_DIR = dataDir;
({ startServer } = await import('../apps/daemon/server.js'));
({ closeDatabase } = await import('../apps/daemon/db.js'));
({ startServer } = await import('../../apps/daemon/server.js'));
({ closeDatabase } = await import('../../apps/daemon/db.js'));
const started = await startServer({ port: 0, returnServer: true });
baseUrl = started.url;
server = started.server;
@@ -1,8 +1,7 @@
import '@testing-library/jest-dom/vitest';
import { cleanup, fireEvent, render, screen, within } from '@testing-library/react';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { AssistantMessage } from '../apps/web/src/components/AssistantMessage';
import type { AgentEvent, ChatMessage } from '../apps/web/src/types';
import { AssistantMessage } from '../../apps/web/src/components/AssistantMessage';
import type { AgentEvent, ChatMessage } from '../../apps/web/src/types';
function messageWithEvents(events: AgentEvent[]): ChatMessage {
return {
@@ -35,8 +34,8 @@ describe('AssistantMessage unfinished todo state', () => {
/>,
);
expect(screen.getByText('Done')).toBeInTheDocument();
expect(screen.queryByText('Stopped with unfinished work')).not.toBeInTheDocument();
expect(screen.getByText('Done')).toBeTruthy();
expect(screen.queryByText('Stopped with unfinished work')).toBeNull();
expect(screen.queryByRole('button', { name: 'Continue remaining tasks' })).toBeNull();
});
@@ -69,12 +68,12 @@ describe('AssistantMessage unfinished todo state', () => {
/>,
);
expect(screen.getByText('Stopped with unfinished work')).toBeInTheDocument();
expect(screen.getByText('2 task(s) remain')).toBeInTheDocument();
expect(screen.getByText('Stopped with unfinished work')).toBeTruthy();
expect(screen.getByText('2 task(s) remain')).toBeTruthy();
const remainingList = screen.getByText('2 task(s) remain').closest('.unfinished-todos');
expect(remainingList).not.toBeNull();
expect(within(remainingList as HTMLElement).getByText('Building components')).toBeInTheDocument();
expect(within(remainingList as HTMLElement).getByText('Run QA')).toBeInTheDocument();
expect(within(remainingList as HTMLElement).getByText('Building components')).toBeTruthy();
expect(within(remainingList as HTMLElement).getByText('Run QA')).toBeTruthy();
fireEvent.click(screen.getByRole('button', { name: 'Continue remaining tasks' }));
@@ -106,8 +105,8 @@ describe('AssistantMessage unfinished todo state', () => {
/>,
);
expect(screen.getByText('Stopped with unfinished work')).toBeInTheDocument();
expect(screen.getByText('1 task(s) remain')).toBeInTheDocument();
expect(screen.getByText('Stopped with unfinished work')).toBeTruthy();
expect(screen.getByText('1 task(s) remain')).toBeTruthy();
expect(screen.queryByRole('button', { name: 'Continue remaining tasks' })).toBeNull();
});
});
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest';
import { createClaudeStreamHandler } from '../apps/daemon/claude-stream.js';
import { createCopilotStreamHandler } from '../apps/daemon/copilot-stream.js';
import { createClaudeStreamHandler } from '../../apps/daemon/claude-stream.js';
import { createCopilotStreamHandler } from '../../apps/daemon/copilot-stream.js';
describe('structured agent stream fixtures', () => {
it('emits TodoWrite tool_use from Claude Code stream JSON', () => {
@@ -3,8 +3,8 @@ import {
latestTodosFromEvents,
parseTodoWriteInput,
unfinishedTodosFromEvents,
} from '../apps/web/src/runtime/todos';
import type { AgentEvent } from '../apps/web/src/types';
} from '../../apps/web/src/runtime/todos';
import type { AgentEvent } from '../../apps/web/src/types';
const firstTodoInput = {
todos: [
+1 -5
View File
@@ -7,10 +7,6 @@ export default defineConfig({
},
test: {
environment: 'jsdom',
include: [
'apps/web/src/**/*.test.{ts,tsx,js,mjs,cjs}',
'apps/daemon/**/*.test.{ts,tsx,js,mjs,cjs}',
'tests/**/*.test.{ts,tsx}',
],
include: ['tests/**/*.test.{ts,tsx}'],
},
});
+6 -17
View File
@@ -15,25 +15,14 @@
"dev:all": "node scripts/dev-all.mjs",
"build": "pnpm --filter @open-design/web build",
"preview": "pnpm run build && pnpm --filter @open-design/daemon daemon",
"test:e2e:live": "node --test scripts/runtime-adapter.e2e.live.test.mjs",
"test": "vitest run",
"test:ui:clean": "node scripts/reset-e2e-artifacts.mjs",
"test:ui": "pnpm run test:ui:clean && playwright test -c e2e/playwright.config.ts",
"test:ui:headed": "pnpm run test:ui:clean && playwright test -c e2e/playwright.config.ts --headed",
"test:e2e:live": "pnpm --filter @open-design/e2e test:e2e:live",
"test": "pnpm --filter @open-design/web test && pnpm --filter @open-design/daemon test && pnpm --filter @open-design/e2e test",
"test:ui:clean": "pnpm --filter @open-design/e2e test:ui:clean",
"test:ui": "pnpm --filter @open-design/e2e test:ui",
"test:ui:headed": "pnpm --filter @open-design/e2e test:ui:headed",
"typecheck": "pnpm --filter @open-design/web typecheck",
"start": "pnpm run build && pnpm --filter @open-design/daemon start",
"test:run": "vitest run"
},
"devDependencies": {
"@playwright/test": "^1.59.1",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2",
"@types/node": "^20.17.10",
"jsdom": "^29.1.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"typescript": "^5.6.3",
"vitest": "^2.1.8"
"test:run": "pnpm run test"
},
"engines": {
"node": "~24",
+35 -92
View File
@@ -6,35 +6,7 @@ settings:
importers:
.:
devDependencies:
'@playwright/test':
specifier: ^1.59.1
version: 1.59.1
'@testing-library/jest-dom':
specifier: ^6.9.1
version: 6.9.1
'@testing-library/react':
specifier: ^16.3.2
version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@types/node':
specifier: ^20.17.10
version: 20.19.39
jsdom:
specifier: ^29.1.0
version: 29.1.0
react:
specifier: ^18.3.1
version: 18.3.1
react-dom:
specifier: ^18.3.1
version: 18.3.1(react@18.3.1)
typescript:
specifier: ^5.6.3
version: 5.9.3
vitest:
specifier: ^2.1.8
version: 2.1.9(@types/node@20.19.39)(jsdom@29.1.0)
.: {}
apps/daemon:
dependencies:
@@ -50,6 +22,10 @@ importers:
multer:
specifier: ^1.4.5-lts.1
version: 1.4.5-lts.2
devDependencies:
vitest:
specifier: ^2.1.8
version: 2.1.9(@types/node@20.19.39)(jsdom@29.1.0)
apps/web:
dependencies:
@@ -81,12 +57,39 @@ importers:
typescript:
specifier: ^5.6.3
version: 5.9.3
vitest:
specifier: ^2.1.8
version: 2.1.9(@types/node@20.19.39)(jsdom@29.1.0)
e2e:
devDependencies:
'@playwright/test':
specifier: ^1.59.1
version: 1.59.1
'@testing-library/react':
specifier: ^16.3.2
version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@types/node':
specifier: ^20.17.10
version: 20.19.39
jsdom:
specifier: ^29.1.0
version: 29.1.0
react:
specifier: ^18.3.1
version: 18.3.1
react-dom:
specifier: ^18.3.1
version: 18.3.1(react@18.3.1)
typescript:
specifier: ^5.6.3
version: 5.9.3
vitest:
specifier: ^2.1.8
version: 2.1.9(@types/node@20.19.39)(jsdom@29.1.0)
packages:
'@adobe/css-tools@4.4.4':
resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==}
'@anthropic-ai/sdk@0.32.1':
resolution: {integrity: sha512-U9JwTrDvdQ9iWuABVsMLj8nJVwAyQz6QXvgLsVhryhCEPkLsbcP/MXxm+jYcAwLoV8ESbaTTjnD4kuAFa+Hyjg==}
@@ -668,10 +671,6 @@ packages:
resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
engines: {node: '>=18'}
'@testing-library/jest-dom@6.9.1':
resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==}
engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
'@testing-library/react@16.3.2':
resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==}
engines: {node: '>=18'}
@@ -768,10 +767,6 @@ packages:
aria-query@5.3.0:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
aria-query@5.3.2:
resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
engines: {node: '>= 0.4'}
array-flatten@1.1.1:
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
@@ -879,9 +874,6 @@ packages:
resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
css.escape@1.5.1:
resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
@@ -944,9 +936,6 @@ packages:
dom-accessibility-api@0.5.16:
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
dom-accessibility-api@0.6.3:
resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
@@ -1105,10 +1094,6 @@ packages:
immediate@3.0.6:
resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
indent-string@4.0.0:
resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
engines: {node: '>=8'}
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
@@ -1196,10 +1181,6 @@ packages:
resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
engines: {node: '>=10'}
min-indent@1.0.1:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
@@ -1403,10 +1384,6 @@ packages:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
redent@3.0.0:
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
engines: {node: '>=8'}
require-from-string@2.0.2:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
@@ -1504,10 +1481,6 @@ packages:
string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
strip-indent@3.0.0:
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
engines: {node: '>=8'}
strip-json-comments@2.0.1:
resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
engines: {node: '>=0.10.0'}
@@ -1726,8 +1699,6 @@ packages:
snapshots:
'@adobe/css-tools@4.4.4': {}
'@anthropic-ai/sdk@0.32.1':
dependencies:
'@types/node': 18.19.130
@@ -2093,15 +2064,6 @@ snapshots:
picocolors: 1.1.1
pretty-format: 27.5.1
'@testing-library/jest-dom@6.9.1':
dependencies:
'@adobe/css-tools': 4.4.4
aria-query: 5.3.2
css.escape: 1.5.1
dom-accessibility-api: 0.6.3
picocolors: 1.1.1
redent: 3.0.0
'@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@babel/runtime': 7.29.2
@@ -2203,8 +2165,6 @@ snapshots:
dependencies:
dequal: 2.0.3
aria-query@5.3.2: {}
array-flatten@1.1.1: {}
assertion-error@2.0.1: {}
@@ -2320,8 +2280,6 @@ snapshots:
mdn-data: 2.27.1
source-map-js: 1.2.1
css.escape@1.5.1: {}
csstype@3.2.3: {}
data-urls@7.0.0:
@@ -2361,8 +2319,6 @@ snapshots:
dom-accessibility-api@0.5.16: {}
dom-accessibility-api@0.6.3: {}
dunder-proto@1.0.1:
dependencies:
call-bind-apply-helpers: 1.0.2
@@ -2573,8 +2529,6 @@ snapshots:
immediate@3.0.6: {}
indent-string@4.0.0: {}
inherits@2.0.4: {}
ini@1.3.8: {}
@@ -2658,8 +2612,6 @@ snapshots:
mimic-response@3.1.0: {}
min-indent@1.0.1: {}
minimist@1.2.8: {}
mkdirp-classic@0.5.3: {}
@@ -2860,11 +2812,6 @@ snapshots:
string_decoder: 1.3.0
util-deprecate: 1.0.2
redent@3.0.0:
dependencies:
indent-string: 4.0.0
strip-indent: 3.0.0
require-from-string@2.0.2: {}
rollup@4.60.2:
@@ -3033,10 +2980,6 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
strip-indent@3.0.0:
dependencies:
min-indent: 1.0.1
strip-json-comments@2.0.1: {}
styled-jsx@5.1.6(react@18.3.1):
+1
View File
@@ -1,2 +1,3 @@
packages:
- apps/*
- e2e