{ "name": "appflowy_web_app", "private": true, "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "dev:coverage": "cross-env COVERAGE=true vite", "build": "vite build", "clean": "rm -rf dist storybook-static coverage .nyc_output node_modules/.vite node_modules/.cache", "type-check": "tsc --noEmit --project tsconfig.web.json", "type-check:watch": "tsc --build --watch", "lint": "pnpm type-check && eslint --quiet --ext .js,.ts,.tsx . --ignore-path .eslintignore.web", "start": "vite preview --port 3000", "css:variables": "node scripts/generateTailwindColors.cjs", "analyze": "cross-env ANALYZE_MODE=true vite build", "cypress:open": "cypress open", "test": "pnpm run test:unit && pnpm run test:components", "test:components": "cypress run --component --browser chrome --headless", "test:unit": "jest --coverage", "test:unit:coverage": "cross-env COVERAGE=true jest --coverage", "test:http-api": "jest src/application/services/js-services/http/__tests__/*.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:coverage": "jest src/application/services/js-services/http/__tests__/*.integration.test.ts --coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:auth": "jest src/application/services/js-services/http/__tests__/auth.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:workspace": "jest src/application/services/js-services/http/__tests__/workspace.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:user-profile": "jest src/application/services/js-services/http/__tests__/user-profile.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:page": "jest src/application/services/js-services/http/__tests__/page.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:view": "jest src/application/services/js-services/http/__tests__/view.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:trash": "jest src/application/services/js-services/http/__tests__/trash.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:publish": "jest src/application/services/js-services/http/__tests__/publish.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:template": "jest src/application/services/js-services/http/__tests__/template.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:invitation": "jest src/application/services/js-services/http/__tests__/invitation.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:collab": "jest src/application/services/js-services/http/__tests__/collab.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:subscription": "jest src/application/services/js-services/http/__tests__/subscription.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:file-import": "jest src/application/services/js-services/http/__tests__/file-import.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:http-api:quick-note": "jest src/application/services/js-services/http/__tests__/quick-note.integration.test.ts --no-coverage --maxWorkers=1 --testPathIgnorePatterns=/node_modules/", "test:components:coverage": "cross-env COVERAGE=true cypress run --component --browser chrome --headless", "test:cy": "cypress run", "test:cy:chrome": "cypress run --browser chrome --headed", "test:cy:chrome:windowed": "ELECTRON_EXTRA_LAUNCH_ARGS='--window-size=1440,900 --window-position=100,100' cypress run --browser chrome --headed", "test:integration": "cypress run --spec 'cypress/e2e/**/*.cy.ts'", "coverage": "cross-env COVERAGE=true pnpm run test:unit && cross-env COVERAGE=true pnpm run test:components", "generate-tokens": "node scripts/system-token/convert-tokens.cjs", "generate-protobuf": "pbjs -t static-module -w es6 -o ./src/proto/messages.js ./src/proto/messages.proto & pbts -o ./src/proto/messages.d.ts ./src/proto/messages.js", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build" }, "dependencies": { "@appflowyinc/editor": "^0.1.13", "@atlaskit/pragmatic-drag-and-drop": "1.5.2", "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "2.1.0", "@atlaskit/pragmatic-drag-and-drop-flourish": "2.0.2", "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.0.3", "@atlaskit/pragmatic-drag-and-drop-live-region": "1.3.0", "@atlaskit/pragmatic-drag-and-drop-react-accessibility": "2.0.3", "@atlaskit/pragmatic-drag-and-drop-react-drop-indicator": "3.1.0", "@atlaskit/primitives": "^5.5.3", "@emoji-mart/data": "^1.1.2", "@emoji-mart/react": "^1.1.1", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", "@floating-ui/react": "^0.26.27", "@fullcalendar/core": "^6.1.19", "@fullcalendar/daygrid": "^6.1.19", "@fullcalendar/interaction": "^6.1.19", "@fullcalendar/multimonth": "^6.1.19", "@fullcalendar/react": "^6.1.19", "@fullcalendar/timegrid": "^6.1.19", "@jest/globals": "^29.7.0", "@mui/icons-material": "^5.11.11", "@mui/material": "^6.0.0", "@mui/x-date-pickers-pro": "^6.18.2", "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-avatar": "^1.1.3", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-label": "^2.1.2", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-radio-group": "^1.3.8", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-separator": "^1.1.2", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-switch": "^1.2.2", "@radix-ui/react-tabs": "^1.1.9", "@radix-ui/react-tooltip": "^1.1.8", "@reduxjs/toolkit": "2.0.0", "@slate-yjs/core": "^1.0.2", "@tanstack/react-virtual": "^3.13.6", "@types/big.js": "^6.2.2", "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "@types/react-swipeable-views": "^0.13.4", "async-retry": "^1.3.3", "axios": "^1.9.0", "big.js": "^7.0.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "colorthief": "^2.4.0", "cypress-file-upload": "^5.0.8", "cypress-plugin-api": "^2.11.2", "date-fns": "^4.1.0", "date-fns-tz": "^3.2.0", "dayjs": "^1.11.9", "dexie": "^4.0.7", "dexie-react-hooks": "^1.1.7", "dompurify": "^3.1.7", "downloadjs": "^1.4.7", "emoji-mart": "^5.5.2", "emoji-regex": "^10.2.1", "escape-string-regexp": "^5.0.0", "events": "^3.3.0", "framer-motion": "^12.6.3", "google-protobuf": "^3.15.12", "hast-util-to-mdast": "^10.1.0", "highlight.js": "^11.10.0", "html-parse-stringify": "^3.0.1", "i18next": "^22.4.10", "i18next-browser-languagedetector": "^7.0.1", "i18next-resources-to-backend": "^1.1.4", "is-hotkey": "^0.2.0", "isomorphic-dompurify": "^2.32.0", "jest": "^29.5.0", "js-base64": "^3.7.5", "js-md5": "^0.8.3", "katex": "^0.16.7", "lib0": "^0.2.109", "lightgallery": "^2.7.2", "lodash-es": "^4.17.21", "lucide-react": "^0.485.0", "mdast-util-to-hast": "^13.2.0", "mermaid": "^11.4.1", "nanoid": "^4.0.0", "next-themes": "^0.4.6", "notistack": "^3.0.1", "numeral": "^2.0.6", "prismjs": "^1.29.0", "protobufjs": "^7.5.3", "protoc-gen-ts": "0.8.7", "quill": "^1.3.7", "quill-delta": "^5.1.0", "react": "^18.2.0", "react-beautiful-dnd": "^13.1.1", "react-big-calendar": "^1.8.5", "react-color": "^2.19.3", "react-colorful": "^5.6.1", "react-custom-scrollbars": "^4.2.1", "react-custom-scrollbars-2": "^4.5.0", "react-datepicker": "^4.23.0", "react-day-picker": "8.10.1", "react-dom": "^18.2.0", "react-error-boundary": "^4.0.13", "react-grid-dnd": "^2.1.2", "react-helmet": "^6.1.0", "react-hook-form": "^7.52.2", "react-hot-toast": "^2.4.1", "react-i18next": "^14.1.0", "react-infinite-scroll-component": "^6.1.0", "react-katex": "^3.0.1", "react-measure": "^2.5.2", "react-player": "^2.16.0", "react-redux": "^8.0.5", "react-router-dom": "^6.22.3", "react-swipeable-views": "^0.14.0", "react-transition-group": "^4.4.5", "react-use-websocket": "^4.13.0", "react-virtualized-auto-sizer": "^1.0.20", "react-vtree": "^2.0.4", "react-window": "^1.8.10", "react-zoom-pan-pinch": "^3.6.1", "react18-input-otp": "^1.1.2", "redux": "^4.2.1", "rehype-parse": "^9.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "rxjs": "^7.8.0", "sass": "^1.70.0", "slate": "^0.101.4", "slate-history": "^0.100.0", "slate-react": "^0.101.3", "smooth-scroll-into-view-if-needed": "^2.0.2", "sonner": "^2.0.3", "tailwind-merge": "^3.0.2", "ts-results": "^3.3.0", "tw-animate-css": "^1.2.5", "unified": "^11.0.5", "unist": "^0.0.1", "unist-util-visit": "^5.0.0", "unsplash-js": "^7.0.19", "utf8": "^3.0.0", "validator": "^13.11.0", "vite-plugin-wasm": "^3.3.0", "y-indexeddb": "9.0.12", "y-protocols": "^1.0.6", "yjs": "14.0.0-1" }, "devDependencies": { "@babel/preset-env": "^7.24.7", "@babel/preset-react": "^7.24.7", "@babel/preset-typescript": "^7.24.7", "@chromatic-com/storybook": "^4.1.2", "@cypress/code-coverage": "^3.12.39", "@istanbuljs/nyc-config-babel": "^3.0.0", "@istanbuljs/nyc-config-typescript": "^1.0.2", "@storybook/addon-a11y": "^10.0.7", "@storybook/addon-docs": "^10.0.7", "@storybook/addon-onboarding": "^10.0.7", "@storybook/addon-vitest": "^10.0.7", "@storybook/react": "^10.0.7", "@storybook/react-vite": "^10.0.7", "@svgr/plugin-svgo": "^8.0.1", "@testing-library/react": "^16.0.0", "@types/cypress-image-snapshot": "^3.1.9", "@types/dompurify": "^3.0.5", "@types/downloadjs": "^1.4.6", "@types/google-protobuf": "^3.15.12", "@types/is-hotkey": "^0.1.7", "@types/jest": "^29.5.3", "@types/katex": "^0.16.0", "@types/lodash-es": "^4.17.11", "@types/node": "^20.11.30", "@types/numeral": "^2.0.5", "@types/prismjs": "^1.26.0", "@types/quill": "^2.0.10", "@types/react": "^18.2.66", "@types/react-beautiful-dnd": "^13.1.3", "@types/react-big-calendar": "^1.8.9", "@types/react-color": "^3.0.6", "@types/react-custom-scrollbars": "^4.0.13", "@types/react-datepicker": "^4.19.3", "@types/react-dom": "^18.2.22", "@types/react-helmet": "^6.1.11", "@types/react-katex": "^3.0.0", "@types/react-measure": "^2.0.12", "@types/react-transition-group": "^4.4.6", "@types/react-window": "^1.8.8", "@types/utf8": "^3.0.1", "@types/uuid": "^9.0.1", "@types/validator": "^13.11.9", "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.13", "axios-mock-adapter": "^2.0.0", "babel-jest": "^29.6.2", "chalk": "^4.1.2", "cheerio": "1.0.0-rc.12", "cross-env": "^7.0.3", "cypress": "^13.7.2", "cypress-image-snapshot": "^4.0.1", "cypress-real-events": "^1.13.0", "dotenv": "^17.2.1", "eslint": "^8.57.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", "eslint-plugin-unused-imports": "^4.1.4", "istanbul-lib-coverage": "^3.2.2", "jest-environment-jsdom": "^29.6.2", "jest-node-exports-resolver": "^1.1.6", "nyc": "^15.1.0", "pino": "^9.2.0", "pino-pretty": "^11.2.1", "postcss": "^8.4.21", "prettier": "2.8.4", "prettier-plugin-tailwindcss": "^0.2.2", "protobufjs-cli": "^1.1.3", "rollup-plugin-visualizer": "^5.12.0", "storybook": "^10.0.7", "style-dictionary": "^3.9.2", "tailwindcss": "^3.2.7", "ts-jest": "^29.1.1", "ts-node-dev": "^2.0.0", "tsconfig-paths-jest": "^0.0.1", "typescript": "4.9.5", "uuid": "^9.0.0", "vite": "^5.2.0", "vite-plugin-compression2": "^1.0.0", "vite-plugin-externals": "^0.6.2", "vite-plugin-html": "^3.2.2", "vite-plugin-importer": "^0.2.5", "vite-plugin-istanbul": "^6.0.2", "vite-plugin-svgr": "^3.2.0", "vite-plugin-terminal": "^1.2.0", "vite-plugin-total-bundle-size": "^1.0.7" }, "engines": { "node": ">=20.0.0", "npm": ">=8.0.0", "pnpm": "^10.9.0" }, "packageManager": "pnpm@10.9.0+sha512.0486e394640d3c1fb3c9d43d49cf92879ff74f8516959c235308f5a8f62e2e19528a65cdc2a3058f587cde71eba3d5b56327c8c33a97e4c4051ca48a10ca2d5f" }