Files
coder/site/package.json
T
Mathias Fredriksson 3ef13f54ab feat(site): add @storybook/addon-vitest for local story testing (#23303)
There are 333 stories with play functions but no local way to run them.
CI uses Chromatic, which means broken play functions aren't caught until
after push. For agents, the feedback loop is even worse since they can't
open a browser.

This adds the `@storybook/addon-vitest` integration so play functions
can run locally via vitest + Playwright:

```sh
pnpm test:storybook
pnpm test:storybook src/path/to/component.stories.tsx
```

The vitest config is restructured into two projects (`unit` and
`storybook`).
2026-03-19 20:27:40 +02:00

237 lines
7.8 KiB
JSON

{
"name": "coder-v2",
"description": "Coder V2 (Workspaces V2)",
"repository": "https://github.com/coder/coder",
"private": true,
"license": "AGPL-3.0",
"packageManager": "pnpm@10.14.0+sha512.ad27a79641b49c3e481a16a805baa71817a04bbe06a38d17e60e2eaee83f6a146c6a688125f5792e48dd5ba30e7da52a5cda4c3992b9ccf333f9ce223af84748",
"scripts": {
"build": "NODE_ENV=production pnpm vite build",
"check": "biome check --error-on-warnings .",
"check:fix": "biome check --error-on-warnings --fix .",
"check:all": "pnpm check && pnpm test",
"chromatic": "chromatic",
"dev": "vite",
"format": "biome format --write .",
"format:check": "biome format .",
"lint": "pnpm run lint:check && pnpm run lint:types && pnpm run lint:circular-deps && knip",
"lint:check": "biome lint --error-on-warnings .",
"lint:circular-deps": "dpdm --no-tree --no-warning -T ./src/App.tsx",
"lint:knip": "knip",
"lint:fix": "biome lint --error-on-warnings --write . && knip --fix",
"lint:types": "tsc -p .",
"playwright:install": "playwright install --with-deps chromium",
"playwright:test": "playwright test --config=e2e/playwright.config.ts",
"playwright:test-ui": "playwright test --config=e2e/playwright.config.ts --ui $([[ \"$CODER\" == \"true\" ]] && echo --ui-port=7500 --ui-host=0.0.0.0)",
"gen:provisioner": "protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_out=./e2e/ --ts_proto_opt=outputJsonMethods=false,outputEncodeMethods=encode-no-creation,outputClientImpl=false,nestJs=false,outputPartialMethods=false,fileSuffix=Generated,suffix=hey -I ../provisionersdk/proto ../provisionersdk/proto/provisioner.proto",
"storybook": "STORYBOOK=true storybook dev -p 6006",
"storybook:build": "storybook build",
"storybook:ci": "storybook build --test",
"test": "vitest run --project=unit && jest",
"test:storybook": "vitest --project=storybook",
"test:ci": "vitest run --project=unit && jest --silent",
"test:watch": "vitest --project=unit",
"test:watch-jest": "jest --watch",
"stats": "STATS=true pnpm build && npx http-server ./stats -p 8081 -c-1",
"update-emojis": "cp -rf ./node_modules/emoji-datasource-apple/img/apple/64/* ./static/emojis && cp -f ./node_modules/emoji-datasource-apple/img/apple/sheets-256/64.png ./static/emojis/spritesheet.png"
},
"dependencies": {
"@emoji-mart/data": "1.2.1",
"@emoji-mart/react": "1.1.1",
"@emotion/cache": "11.14.0",
"@emotion/css": "11.13.5",
"@emotion/react": "11.14.0",
"@emotion/styled": "11.14.1",
"@fontsource-variable/geist": "5.2.8",
"@fontsource-variable/geist-mono": "5.2.7",
"@fontsource/fira-code": "5.2.7",
"@fontsource/ibm-plex-mono": "5.2.7",
"@fontsource/jetbrains-mono": "5.2.8",
"@fontsource/source-code-pro": "5.2.7",
"@lexical/react": "0.41.0",
"@lexical/utils": "0.41.0",
"@monaco-editor/react": "4.7.0",
"@mui/material": "5.18.0",
"@mui/system": "5.18.0",
"@mui/x-tree-view": "7.29.10",
"@novnc/novnc": "^1.5.0",
"@pierre/diffs": "1.1.0-beta.19",
"@radix-ui/react-avatar": "1.1.11",
"@radix-ui/react-checkbox": "1.3.3",
"@radix-ui/react-collapsible": "1.1.12",
"@radix-ui/react-dialog": "1.1.15",
"@radix-ui/react-dropdown-menu": "2.1.16",
"@radix-ui/react-label": "2.1.8",
"@radix-ui/react-popover": "1.1.15",
"@radix-ui/react-radio-group": "1.3.8",
"@radix-ui/react-scroll-area": "1.2.10",
"@radix-ui/react-select": "2.2.6",
"@radix-ui/react-separator": "1.1.8",
"@radix-ui/react-slider": "1.3.6",
"@radix-ui/react-slot": "1.2.4",
"@radix-ui/react-switch": "1.2.6",
"@radix-ui/react-tooltip": "1.2.8",
"@tanstack/react-query-devtools": "5.77.0",
"@xterm/addon-canvas": "0.7.0",
"@xterm/addon-fit": "0.10.0",
"@xterm/addon-unicode11": "0.8.0",
"@xterm/addon-web-links": "0.11.0",
"@xterm/addon-webgl": "0.18.0",
"@xterm/xterm": "5.5.0",
"ansi-to-html": "0.7.2",
"axios": "1.13.2",
"chroma-js": "2.6.0",
"class-variance-authority": "0.7.1",
"clsx": "2.1.1",
"cmdk": "1.1.1",
"color-convert": "2.0.1",
"cron-parser": "4.9.0",
"cronstrue": "2.59.0",
"dayjs": "1.11.19",
"diff": "8.0.3",
"emoji-mart": "5.6.0",
"file-saver": "2.0.5",
"formik": "2.4.9",
"front-matter": "4.0.2",
"humanize-duration": "3.33.1",
"jszip": "3.10.1",
"lexical": "0.41.0",
"lodash": "4.17.21",
"lucide-react": "0.555.0",
"monaco-editor": "0.55.1",
"motion": "12.34.1",
"pretty-bytes": "6.1.1",
"react": "19.2.2",
"react-color": "2.19.3",
"react-confetti": "6.4.0",
"react-date-range": "1.4.0",
"react-dom": "19.2.2",
"react-markdown": "9.1.0",
"react-query": "npm:@tanstack/react-query@5.77.0",
"react-resizable-panels": "3.0.6",
"react-router": "7.9.6",
"react-syntax-highlighter": "15.6.6",
"react-textarea-autosize": "8.5.9",
"react-virtualized-auto-sizer": "1.0.26",
"react-window": "1.8.11",
"recharts": "2.15.4",
"remark-gfm": "4.0.1",
"resize-observer-polyfill": "1.5.1",
"semver": "7.7.3",
"sonner": "2.0.7",
"streamdown": "2.2.0",
"tailwind-merge": "2.6.0",
"tailwindcss-animate": "1.0.7",
"tzdata": "1.0.46",
"ua-parser-js": "1.0.41",
"ufuzzy": "npm:@leeoniya/ufuzzy@1.0.10",
"undici": "6.22.0",
"unique-names-generator": "4.7.1",
"uuid": "9.0.1",
"websocket-ts": "2.2.1",
"yup": "1.7.1"
},
"devDependencies": {
"@biomejs/biome": "2.2.4",
"@chromatic-com/storybook": "5.0.1",
"@octokit/types": "12.6.0",
"@playwright/test": "1.50.1",
"@storybook/addon-a11y": "10.2.10",
"@storybook/addon-docs": "10.2.10",
"@storybook/addon-links": "10.2.10",
"@storybook/addon-themes": "10.2.10",
"@storybook/addon-vitest": "10.2.10",
"@storybook/react-vite": "10.2.10",
"@swc/core": "1.3.38",
"@swc/jest": "0.2.37",
"@tailwindcss/typography": "0.5.19",
"@testing-library/jest-dom": "6.9.1",
"@testing-library/react": "14.3.1",
"@testing-library/user-event": "14.6.1",
"@types/chroma-js": "2.4.0",
"@types/color-convert": "2.0.4",
"@types/express": "4.17.17",
"@types/file-saver": "2.0.7",
"@types/humanize-duration": "3.27.4",
"@types/jest": "29.5.14",
"@types/lodash": "4.17.21",
"@types/node": "20.19.25",
"@types/novnc__novnc": "1.5.0",
"@types/react": "19.2.7",
"@types/react-color": "3.0.13",
"@types/react-date-range": "1.4.4",
"@types/react-dom": "19.2.3",
"@types/react-syntax-highlighter": "15.5.13",
"@types/react-virtualized-auto-sizer": "1.0.8",
"@types/react-window": "1.8.8",
"@types/semver": "7.7.1",
"@types/ssh2": "1.15.5",
"@types/ua-parser-js": "0.7.36",
"@types/uuid": "9.0.2",
"@vitejs/plugin-react": "5.1.1",
"@vitest/browser-playwright": "4.0.14",
"autoprefixer": "10.4.22",
"chromatic": "11.29.0",
"dpdm": "3.14.0",
"express": "4.21.2",
"jest": "29.7.0",
"jest-canvas-mock": "2.5.2",
"jest-environment-jsdom": "29.5.0",
"jest-fixed-jsdom": "0.0.11",
"jest-location-mock": "2.0.0",
"jest-websocket-mock": "2.5.0",
"jest_workaround": "0.1.14",
"jsdom": "27.2.0",
"knip": "5.71.0",
"msw": "2.4.8",
"postcss": "8.5.6",
"protobufjs": "7.5.4",
"rollup-plugin-visualizer": "5.14.0",
"rxjs": "7.8.2",
"ssh2": "1.17.0",
"storybook": "10.2.10",
"storybook-addon-remix-react-router": "6.0.0",
"tailwindcss": "3.4.18",
"ts-proto": "1.181.2",
"typescript": "5.6.3",
"vite": "7.2.6",
"vite-plugin-checker": "0.11.0",
"vitest": "4.0.14"
},
"browserslist": [
"chrome 110",
"firefox 111",
"safari 16.0"
],
"resolutions": {
"optionator": "0.9.3",
"semver": "7.7.3"
},
"engines": {
"pnpm": ">=10.0.0 <11.0.0",
"node": ">=18.0.0 <23.0.0"
},
"pnpm": {
"overrides": {
"@babel/runtime": "7.26.10",
"@babel/helpers": "7.26.10",
"esbuild": "^0.25.0",
"form-data": "4.0.4",
"prismjs": "1.30.0",
"dompurify": "3.2.6",
"brace-expansion": "1.1.12"
},
"ignoredBuiltDependencies": [
"cpu-features",
"msw",
"protobufjs",
"storybook-addon-remix-react-router"
],
"onlyBuiltDependencies": [
"@swc/core",
"esbuild",
"ssh2"
]
}
}