{ "name": "overleaf", "private": true, "packageManager": "yarn@4.14.1", "devDependencies": { "@overleaf/eslint-plugin": "workspace:*", "@prettier/plugin-pug": "^3.4.0", "@types/chai": "^4.3.0", "@types/chai-as-promised": "^7.1.8", "@types/mocha": "^10.0.6", "@types/multer": "^2.1.0", "@typescript-eslint/eslint-plugin": "8.50.0", "@typescript-eslint/parser": "^8.50.0", "@vitest/eslint-plugin": "^1.5.0", "eslint": "^8.15.0", "eslint-config-prettier": "^8.5.0", "eslint-config-standard": "^17.0.0", "eslint-plugin-chai-expect": "^3.0.0", "eslint-plugin-chai-friendly": "^0.7.2", "eslint-plugin-cypress": "^2.15.1", "eslint-plugin-import": "^2.26.0", "eslint-plugin-mocha": "^10.1.0", "eslint-plugin-n": "^15.7.0", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-promise": "^6.0.0", "eslint-plugin-unicorn": "^56.0.0", "prettier": "3.7.4", "prettier-plugin-groovy": "0.2.1", "typescript": "^5.9.3" }, "engines": { "node": ">=20.0.0" }, "resolutions": { "sandboxed-module": "patch:sandboxed-module@npm%3A2.0.4#~/.yarn/patches/sandboxed-module-npm-2.0.4-f8b45aacc9.patch", "request/tough-cookie": "5.1.2", "request/form-data": "2.5.5", "request/qs": "6.14.1", "@cypress/request/qs": "6.14.1", "@opentelemetry/api": "1.9.0", "mocha/serialize-javascript": "7.0.5", "pprof/protobufjs": "7.5.5", "@google-cloud/profiler/protobufjs": "7.5.5", "mocha-multi-reporters": "patch:mocha-multi-reporters@npm%3A1.5.1#~/.yarn/patches/mocha-multi-reporters-npm-1.5.1-0a1088aed5.patch", "pdfjs-dist": "patch:pdfjs-dist@npm%3A5.1.91#~/.yarn/patches/pdfjs-dist-npm-5.1.91.patch", "referer-parser": "patch:referer-parser@npm%3A0.0.3#~/.yarn/patches/referer-parser-npm-0.0.3.patch", "sass": "1.77.1", "@codemirror/autocomplete": "patch:@codemirror/autocomplete@npm%3A6.18.4#~/.yarn/patches/@codemirror-autocomplete-npm-6.18.4.patch", "@codemirror/commands": "6.10.1", "@codemirror/language": "6.12.1", "@codemirror/lint": "6.9.2", "@codemirror/search": "patch:@codemirror/search@npm%3A6.5.8#~/.yarn/patches/@codemirror-search-npm-6.5.8.patch", "@codemirror/state": "6.5.4", "@codemirror/view": "6.38.6", "@lezer/common": "1.5.0", "@lezer/highlight": "1.2.3", "@lezer/lr": "1.4.7", "@types/react": "18.3.28", "@types/react-dom": "18.3.7", "@vitest/expect": "4.1.5", "@vitest/mocker": "4.1.5", "@vitest/pretty-format": "4.1.5", "@vitest/spy": "4.1.5", "@vitest/utils": "4.1.5", "cheerio": "1.0.0-rc.10", "react": "18.3.1", "react-dom": "18.3.1", "sinon-chai": "3.7.0", "i18next-scanner/i18next": "23.16.8", "downshift": "9.0.9", "body-parser@npm:1.20.4": "patch:body-parser@npm%3A1.20.4#~/.yarn/patches/body-parser-npm-1.20.4.patch", "cypress-multi-reporters": "patch:cypress-multi-reporters@npm%3A2.0.5#~/.yarn/patches/cypress-multi-reporters-npm-2.0.5.patch", "forwarded@npm:0.2.0": "patch:forwarded@npm%3A0.2.0#~/.yarn/patches/forwarded-npm-0.2.0.patch", "multer@npm:2.1.1": "patch:multer@npm%3A2.1.1#~/.yarn/patches/multer-npm-2.1.1.patch", "node-fetch": "patch:node-fetch@npm%3A2.7.0#~/.yarn/patches/node-fetch-npm-2.7.0.patch", "passport-oauth2": "patch:passport-oauth2@npm%3A1.6.1#~/.yarn/patches/passport-oauth2-npm-1.6.1.patch", "send": "patch:send@npm%3A0.19.0#~/.yarn/patches/send-npm-0.19.0.patch", "serve-static": "1.16.2", "@uppy/xhr-upload": "3.6.0", "recurly": "4.12.0", "mongoose": "8.9.5", "pg": "8.7.1", "pg-query-stream": "4.7.1", "@aws-sdk/client-s3": "3.994.0", "@aws-sdk/client-ses": "3.994.0", "@aws-sdk/s3-request-presigner": "3.994.0", "contentful": "10.8.5", "@contentful/rich-text-html-renderer": "16.0.2", "@contentful/rich-text-types": "16.0.2", "i18next": "23.10.0", "sanitize-html": "2.12.1", "lodash": "4.18.1", "express-session": "1.17.2", "ioredis": "4.27.11", "knip": "5.64.1", "eslint-plugin-testing-library": "7.5.3", "chart.js": "4.0.1", "mock-fs": "5.2.0", "@customerio/cdp-analytics-node": "0.3.9", "@google-cloud/bigquery": "8.1.1", "moment": "2.29.4", "sequelize-cli": "6.6.0", "async": "3.2.5", "dockerode": "4.0.9", "tar-fs": "3.1.1", "cluster-key-slot": "1.1.0", "@octokit/request": "9.2.2", "randomstring": "1.2.2", "vite": "7.3.1", "isomorphic-git": "1.33.1", "http-status": "1.5.0", "knex": "2.4.0", "utf-8-validate": "5.0.8", "samlp": "7.0.2", "compression": "1.7.4", "cookie-parser": "1.4.6", "react-cookie": "7.2.0", "react-dropzone": "14.2.3", "@babel/core": "7.28.5", "@babel/preset-env": "7.28.5", "@babel/register": "7.28.3", "@vitejs/plugin-react": "4.4.1", "cssnano": "7.1.4", "mini-css-extract-plugin": "2.7.6", "nodemon": "3.0.1", "postcss": "8.5.8", "postcss-reporter": "7.0.5", "zod": "4.1.11", "zod-validation-error": "4.0.1", "simple-oauth2": "5.0.0", "@types/simple-oauth2": "5.0.7", "@node-oauth/oauth2-server": "5.3.0", "@phosphor-icons/react": "2.1.7", "@slack/webhook": "7.0.2", "@stripe/react-stripe-js": "3.9.0", "@stripe/stripe-js": "7.7.0", "cache-flow": "1.9.0", "focus-trap-react": "11.0.4", "i18next-http-middleware": "3.5.0", "jose": "4.15.5", "nodemailer": "8.0.5", "on-headers": "1.0.2", "pug": "3.0.3", "rate-limiter-flexible": "2.4.1", "react-hook-form": "7.71.1", "stripe": "18.4.0", "@babel/plugin-proposal-decorators": "7.28.0", "@floating-ui/react": "0.27.16", "@juggle/resize-observer": "3.3.1", "@storybook/addon-a11y": "10.3.5", "@storybook/addon-essentials": "10.3.5", "@storybook/addon-interactions": "10.3.5", "@storybook/addon-links": "10.3.5", "@storybook/cli": "10.3.5", "@storybook/react": "10.3.5", "@storybook/react-webpack5": "10.3.5", "@storybook/theming": "10.3.5", "@streamdown/cjk": "1.0.2", "@testing-library/dom": "10.4.0", "@testing-library/user-event": "14.5.2", "@types/express": "4.17.23", "@types/recurly__recurly-js": "4.38.0", "@types/sanitize-html": "2.16.0", "@uppy/dashboard": "3.7.1", "@uppy/drag-drop": "3.0.3", "@uppy/file-input": "3.0.4", "@uppy/progress-bar": "3.0.4", "@uppy/react": "3.2.1", "autoprefixer": "10.4.16", "babel-plugin-module-resolver": "5.0.2", "backbone": "1.6.0", "dompurify": "3.4.0", "eventsource-client": "1.1.4", "fake-indexeddb": "6.0.0", "formik": "2.2.9", "katex": "0.16.28", "match-sorter": "6.3.1", "micromark": "4.0.0", "pirates": "4.0.6", "qrcode": "1.5.0", "react-chartjs-2": "5.0.1", "react-i18next": "13.3.1", "react-resizable-panels": "2.1.1", "rehype-harden": "1.1.7", "scroll-into-view-if-needed": "2.2.28", "storybook": "10.3.5", "streamdown": "2.2.0", "tailwindcss": "3.4.17", "thread-loader": "patch:thread-loader@npm%3A4.0.2#~/.yarn/patches/thread-loader-npm-4.0.2-dab5735f54.patch", "unist-util-visit": "5.0.0", "use-stick-to-bottom": "1.1.1", "zustand": "5.0.8", "retry-request@npm:^8.0.0": "patch:retry-request@npm%3A8.0.2#~/.yarn/patches/retry-request-npm-8.0.2-448ad084c8.patch", "retry-request@npm:^7.0.0": "patch:retry-request@npm%3A7.0.2#~/.yarn/patches/retry-request-npm-7.0.2-a41087680c.patch", "teeny-request@npm:^10.0.0": "patch:teeny-request@npm%3A10.1.0#~/.yarn/patches/teeny-request-npm-10.1.0.patch", "teeny-request@npm:^9.0.0": "patch:teeny-request@npm%3A9.0.0#~/.yarn/patches/teeny-request-npm-9.0.0-4d571e3c55.patch", "fast-xml-builder": "1.1.7", "ip-address": "10.1.1", "systeminformation": "5.31.6" }, "scripts": { "format": "prettier --cache --cache-location ./node_modules/.cache/prettier/.prettier-cache --check", "format:fix": "prettier --cache --cache-location ./node_modules/.cache/prettier/.prettier-cache --write --check", "format:styles": "prettier --cache --cache-location ./node_modules/.cache/prettier/.prettier-cache --check '**/*.{css,scss}'", "format:styles:fix": "prettier --cache --cache-location ./node_modules/.cache/prettier/.prettier-cache --write --check '**/*.{css,scss}'", "format:pug": "prettier --cache --cache-location ./node_modules/.cache/prettier/.prettier-cache --check '**/*.pug'", "format:pug:fix": "prettier --cache --cache-location ./node_modules/.cache/prettier/.prettier-cache --write --check '**/*.pug'", "format:jenkins": "prettier --cache --cache-location ./node_modules/.cache/prettier/.prettier-cache --check '**/Jenkinsfile'", "format:jenkins:fix": "prettier --cache --cache-location ./node_modules/.cache/prettier/.prettier-cache --write --check '**/Jenkinsfile'", "format:monorepo-check": "prettier --cache --cache-location ./node_modules/.cache/prettier/.prettier-cache --check '**/Jenkinsfile' '**/*.md' '**/docker-compose.yml' '**/docker-compose.*.yml' '.agents/**/*.js' '.agents/**/*.md'", "format:monorepo-check:fix": "prettier --cache --cache-location ./node_modules/.cache/prettier/.prettier-cache --write --check '**/Jenkinsfile' '**/*.md' '**/docker-compose.yml' '**/docker-compose.*.yml' '.agents/**/*.js' '.agents/**/*.md'", "lint": "eslint --cache --cache-location ./node_modules/.cache/eslint/ --max-warnings 0 --format unix .", "lint:fix": "eslint --cache --cache-location ./node_modules/.cache/eslint/ --fix ." }, "workspaces": [ "jobs/mirror-documentation", "libraries/*", "server-ce/test", "services/analytics", "services/chat", "services/clsi", "services/clsi-cache", "services/clsi-perf", "services/contacts", "services/docstore", "services/document-updater", "services/filestore", "services/freegeoip", "services/github-sync", "services/history-v1", "services/idp", "services/latexqc", "services/linked-url-proxy", "services/notifications", "services/project-history", "services/real-time", "services/templates", "services/third-party-datastore", "services/third-party-references", "services/tpdsworker", "services/web", "tools/dependency-management", "tools/npm-overrides-helper", "tools/saas-e2e", "tools/migrations" ] }