{ "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", "packageManager": "yarn@4.18.0", "engines": { "node": ">=22" }, "workspaces": [ ".", "streaming" ], "scripts": { "dev": "vite dev", "build:development": "cross-env RAILS_ENV=development NODE_ENV=development vite build --mode development", "build:production": "cross-env RAILS_ENV=production NODE_ENV=production vite build --mode production", "fix:js": "eslint . --cache --fix", "fix:css": "stylelint --fix \"**/*.{css,scss}\"", "fix": "yarn fix:js && yarn fix:css", "format": "oxfmt", "format:check": "oxfmt --check", "i18n:extract": "formatjs extract 'app/javascript/**/*.{js,jsx,ts,tsx}' config/vite/plugin-sw-locales.ts --ignore '**/*.d.ts' --out-file app/javascript/mastodon/locales/en.json --format config/formatjs-formatter.js", "lint:js": "cd $INIT_CWD && eslint --cache --report-unused-disable-directives", "lint:css": "stylelint \"**/*.{css,scss}\"", "lint": "yarn lint:js && yarn lint:css", "postversion": "git push --tags", "postinstall": "test -d node_modules/husky && husky || echo \"husky is not installed\"", "start": "node ./streaming/index.js", "test": "yarn lint && yarn run typecheck && yarn test:js run", "test:js": "vitest --project=legacy-tests", "test:storybook": "vitest --project=storybook", "typecheck": "tsc --noEmit", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "chromatic": "npx chromatic -d storybook-static", "msw:updateWorker": "msw init" }, "repository": { "type": "git", "url": "https://github.com/mastodon/mastodon.git" }, "private": true, "dependencies": { "@csstools/stylelint-formatter-github": "2.0.0", "@dnd-kit/core": "6.3.1", "@dnd-kit/modifiers": "9.0.0", "@dnd-kit/sortable": "10.0.0", "@dnd-kit/utilities": "3.2.2", "@floating-ui/react-dom": "2.1.9", "@formatjs/intl-pluralrules": "6.3.13", "@formatjs/unplugin": "1.2.8", "@gamestdio/websocket": "0.3.2", "@github/webauthn-json": "2.1.1", "@optimize-lodash/rollup-plugin": "6.0.0", "@phosphor-icons/react": "2.1.10", "@react-spring/web": "10.1.2", "@reduxjs/toolkit": "2.12.0", "@rolldown/plugin-babel": "0.2.3", "@unhead/react": "3.4.0", "@use-gesture/react": "10.3.1", "@vitejs/plugin-legacy": "8.2.3", "@vitejs/plugin-react": "6.1.1", "arrow-key-navigation": "1.2.0", "async-mutex": "0.5.0", "axios": "1.20.0", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "blurhash": "2.0.5", "classnames": "2.5.1", "cocoon-js-vanilla": "1.5.1", "color-blend": "4.0.0", "core-js": "3.50.0", "cross-env": "10.1.0", "debug": "4.4.3", "delegated-events": "1.1.2", "detect-passive-events": "2.0.3", "emoji-mart": "npm:emoji-mart-lazyload@latest", "emojibase": "16.0.0", "emojibase-data": "16.0.3", "emojibase-regex": "16.0.0", "escape-html": "1.0.3", "fast-glob": "3.3.3", "fuzzysort": "3.1.0", "history": "4.10.1", "hoist-non-react-statics": "3.3.2", "http-link-header": "1.1.4", "idb": "8.0.3", "immutable": "4.3.9", "intl-messageformat": "11.2.13", "js-yaml": "5.4.1", "lande": "1.0.10", "lodash": "4.18.1", "marky": "1.3.0", "path-complete-extname": "1.0.0", "postcss-preset-env": "11.5.1", "prop-types": "15.8.1", "punycode": "2.3.1", "react": "19.2.8", "react-dom": "19.2.8", "react-easy-crop": "6.2.3", "react-immutable-proptypes": "2.2.0", "react-immutable-pure-component": "2.2.2", "react-intl": "10.1.20", "react-redux": "9.3.0", "react-redux-loading-bar": "5.0.8", "react-router": "5.3.4", "react-router-dom": "5.3.4", "react-select": "5.10.2", "react-sparklines": "1.7.0", "react-textarea-autosize": "8.5.9", "redux-immutable": "4.0.0", "regenerator-runtime": "0.14.1", "requestidlecallback": "0.3.0", "rollup-plugin-gzip": "4.2.0", "rollup-plugin-visualizer": "7.1.1", "sass": "1.104.0", "scroll-behavior": "0.11.0", "stacktrace-js": "2.0.2", "stringz": "2.1.0", "substring-trie": "1.0.2", "terser": "5.51.2", "tesseract.js": "7.0.0", "tiny-queue": "0.2.1", "twitter-text": "3.1.0", "use-debounce": "10.1.1", "vite": "8.2.2", "vite-plugin-manifest-sri": "0.2.0", "vite-plugin-svgr": "5.2.0", "wicg-inert": "3.1.3" }, "devDependencies": { "@eslint/js": "9.39.5", "@formatjs/cli": "6.14.4", "@storybook/addon-a11y": "10.3.3", "@storybook/addon-docs": "10.3.3", "@storybook/addon-vitest": "10.3.3", "@storybook/react-vite": "10.3.3", "@testing-library/dom": "10.4.1", "@testing-library/react": "16.3.2", "@types/debug": "4.1.13", "@types/emoji-mart": "3.0.14", "@types/escape-html": "1.0.4", "@types/hoist-non-react-statics": "3.3.7", "@types/http-link-header": "1.0.7", "@types/intl": "1.2.2", "@types/js-yaml": "4.0.9", "@types/lodash": "4.17.25", "@types/object-assign": "4.0.33", "@types/prop-types": "15.7.15", "@types/punycode": "2.1.4", "@types/react": "19.2.18", "@types/react-dom": "19.2.4", "@types/react-immutable-proptypes": "2.1.3", "@types/react-router": "5.1.20", "@types/react-router-dom": "5.3.3", "@types/react-sparklines": "1.7.5", "@types/redux-immutable": "4.0.6", "@types/requestidlecallback": "0.3.7", "@typescript/native": "npm:typescript@7.0.2", "@vitest/browser": "4.1.10", "@vitest/browser-playwright": "4.1.10", "@vitest/coverage-v8": "4.1.9", "@vitest/ui": "4.1.9", "chromatic": "18.0.0", "eslint": "9.39.5", "eslint-import-resolver-typescript": "4.4.5", "eslint-plugin-formatjs": "6.4.20", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsdoc": "64.1.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-promise": "7.3.0", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "7.1.1", "eslint-plugin-storybook": "10.5.7", "fake-indexeddb": "6.2.5", "globals": "17.9.0", "husky": "9.1.7", "lint-staged": "17.0.5", "msw": "2.12.14", "msw-storybook-addon": "2.0.6", "oxfmt": "0.47.0", "playwright": "1.62.1", "storybook": "10.3.3", "stylelint": "17.10.0", "stylelint-config-standard-scss": "17.0.0", "type-fest": "5.7.0", "typescript": "npm:@typescript/typescript6@6.0.2", "typescript-eslint": "8.66.0", "vitest": "4.1.10" }, "peerDependenciesMeta": { "react": { "optional": true }, "react-dom": { "optional": true }, "react-router-dom": { "optional": true } }, "msw": { "workerDirectory": [ ".storybook/static" ] } }