{ "name": "@overleaf/web", "description": "The HTTP front end for Overleaf", "private": true, "main": "app.js", "directories": { "public": "./public" }, "scripts": { "test:acceptance:run_dir": "mocha --recursive --timeout 25000 --exit --grep=$MOCHA_GREP --require test/acceptance/bootstrap.js", "test:acceptance:app": "npm run test:acceptance:run_dir -- test/acceptance/src", "test:unit:run_dir": "mocha --recursive --timeout 25000 --exit --grep=$MOCHA_GREP --require test/unit/bootstrap.js", "test:unit:all": "npm run test:unit:run_dir -- test/unit/src modules/*/test/unit/src", "test:unit:all:silent": "npm run test:unit:all -- --reporter dot", "test:unit:app": "npm run test:unit:run_dir -- test/unit/src", "test:frontend": "NODE_ENV=test TZ=GMT mocha --recursive --timeout 5000 --exit --extension js,ts,tsx --grep=$MOCHA_GREP --require test/frontend/bootstrap.js --ignore '**/*.spec.{js,ts,tsx}' test/frontend modules/*/test/frontend", "test:frontend:coverage": "c8 --all --include 'frontend/js' --include 'modules/*/frontend/js' --exclude 'frontend/js/vendor' --reporter=lcov --reporter=text-summary npm run test:frontend", "test:karma": "karma start", "test:karma:single": "karma start --no-auto-watch --single-run", "start": "node $NODE_APP_OPTIONS app.js", "nodemon": "nodemon $NODE_APP_OPTIONS --config nodemon.json", "webpack": "webpack serve --config webpack.config.dev.js", "webpack:production": "webpack --config webpack.config.prod.js", "webpack:profile": "webpack --config webpack.config.prod.js --profile --json > stats.json", "format": "prettier --list-different $PWD/'**/*.{js,ts,tsx}'", "format:fix": "prettier --write $PWD/'**/*.{js,ts,tsx}'", "format:styles": "prettier --list-different $PWD/'**/*.less'", "format:styles:fix": "prettier --write $PWD/'**/*.less'", "lint": "eslint --max-warnings 0 --format unix --ext .js,.ts,.tsx .", "lint:fix": "eslint --fix --ext .js,.ts,.tsx .", "type-check": "tsc --noEmit", "extract-translations": "i18next-scanner", "migrations": "east", "convert-themes": "node modules/source-editor/frontend/js/themes/convert.js", "cypress:open-ct": "SHARELATEX_CONFIG=$PWD/config/settings.webpack.js cypress open-ct", "cypress:run-ct": "SHARELATEX_CONFIG=$PWD/config/settings.webpack.js cypress run-ct", "routes": "bin/routes" }, "browserslist": [ "last 1 year", "ie 11", "firefox esr" ], "dependencies": { "@babel/cli": "^7.14.5", "@babel/core": "^7.14.5", "@babel/preset-env": "^7.14.5", "@babel/preset-react": "^7.14.5", "@babel/preset-typescript": "^7.16.0", "@codemirror/autocomplete": "^0.20.0", "@codemirror/commands": "^0.20.0", "@codemirror/lang-markdown": "^0.20.0", "@codemirror/language": "^0.20.0", "@codemirror/lint": "^0.20.1", "@codemirror/search": "^0.20.1", "@codemirror/state": "^0.20.0", "@codemirror/view": "^0.20.2", "@lezer/highlight": "^0.16.0", "@overleaf/logger": "^3.1.0", "@overleaf/metrics": "^4.0.0", "@overleaf/o-error": "^3.4.0", "@overleaf/object-persistor": "^1.0.1", "@overleaf/redis-wrapper": "^2.0.0", "@overleaf/settings": "^3.0.0", "@pollyjs/adapter-node-http": "^4.2.1", "@pollyjs/core": "^4.2.1", "@pollyjs/persister-fs": "^4.2.1", "@reach/tabs": "^0.15.0", "@replit/codemirror-emacs": "^0.20.0", "@replit/codemirror-vim": "^0.20.0", "@sentry/browser": "^6.3.5", "@uppy/core": "^1.15.0", "@uppy/dashboard": "^1.11.0", "@uppy/react": "^1.11.0", "@uppy/xhr-upload": "^1.6.8", "abort-controller": "^3.0.0", "accepts": "^1.3.7", "ace-builds": "https://github.com/overleaf/ace-builds/archive/v1.4.12-69aace50e6796d42116f8f96e19d2468d8a88af9.tar.gz", "algoliasearch": "^3.35.1", "angular": "~1.8.0", "angular-sanitize": "~1.8.0", "archiver": "^5.3.0", "async": "0.6.2", "backbone": "^1.3.3", "basic-auth": "^2.0.1", "bcrypt": "^5.0.0", "body-parser": "^1.19.0", "bootstrap": "^3.4.1", "bowser": "^2.11.0", "bufferedstream": "1.6.0", "bull": "^3.18.0", "bunyan": "^1.8.15", "cache-flow": "^1.7.4", "celebrate": "^10.0.1", "classnames": "^2.2.6", "codemirror": "~5.33.0", "connect-redis": "^3.1.0", "contentful": "^6.1.1", "cookie": "^0.2.3", "cookie-parser": "1.3.5", "core-js": "^3.6.2", "crypto-js": "^3.1.9-1", "csurf": "^1.11.0", "d3": "^3.5.16", "dateformat": "1.0.4-1.2.3", "daterangepicker": "https://github.com/overleaf/daterangepicker/archive/e496d2d44ca53e208c930e4cb4bcf29bcefa4550.tar.gz", "downshift": "^6.1.0", "east": "^2.0.2", "events": "^3.3.0", "express": "4.17.1", "express-bearer-token": "^2.4.0", "express-http-proxy": "^1.6.0", "express-session": "^1.17.1", "formik": "^2.2.9", "fs-extra": "^4.0.2", "fuse.js": "^3.0.0", "globby": "^5.0.0", "handlebars": "^4.7.7", "helmet": "^3.22.0", "http-proxy": "^1.18.1", "i18next": "^19.6.3", "i18next-fs-backend": "^1.0.7", "i18next-http-middleware": "^3.0.2", "isomorphic-unfetch": "^3.0.0", "jose": "^4.3.8", "jquery": "^2.2.4", "json2csv": "^4.3.3", "jsonwebtoken": "^8.5.1", "ldapjs": "^0.7.1", "lodash": "^4.17.19", "lru-cache": "^6.0.0", "mailchimp-api-v3": "^1.12.0", "marked": "^0.3.5", "match-sorter": "^6.2.0", "mathjax": "^2.7.9", "method-override": "^2.3.3", "minimist": "1.2.5", "mmmagic": "^0.5.3", "moment": "^2.24.0", "mongodb": "~3.6.0", "mongoose": "^5.13.11", "multer": "https://github.com/overleaf/multer/archive/7a2928d7ea2da02dd92888ea1c9ba5704e07aeeb.tar.gz", "nocache": "^2.1.0", "nock": "^13.1.3", "nodemailer": "^6.7.0", "nodemailer-mandrill-transport": "^1.2.0", "nodemailer-ses-transport": "^1.5.1", "nvd3": "^1.8.6", "oauth2-server": "^3.0.1", "otplib": "^12.0.1", "p-limit": "^2.3.0", "parse-data-url": "^2.0.0", "passport": "^0.4.1", "passport-google-oauth20": "^2.0.0", "passport-ldapauth": "^2.1.4", "passport-local": "^1.0.0", "passport-oauth2": "^1.5.0", "passport-orcid": "0.0.4", "passport-saml": "https://github.com/overleaf/passport-saml/releases/download/v3.2.1-overleaf/passport-saml-3.2.1-overleaf.tar.gz", "passport-twitter": "^1.0.4", "pdfjs-dist210": "npm:pdfjs-dist@2.10.377", "pdfjs-dist213": "npm:pdfjs-dist@2.13.216", "prop-types": "^15.7.2", "pug": "^3.0.1", "pug-runtime": "^3.0.1", "qrcode": "^1.4.4", "react": "^17.0.2", "react-bootstrap": "^0.33.1", "react-dnd": "^11.1.3", "react-dnd-html5-backend": "^11.1.3", "react-dom": "^17.0.2", "react-error-boundary": "^2.3.1", "react-i18next": "^11.7.1", "react-linkify": "^1.0.0-alpha", "react2angular": "^4.0.6", "react2angular-shared-context": "^1.1.0", "recurly": "^4.0.0", "referer-parser": "0.0.3", "request": "^2.88.2", "request-promise-native": "^1.0.8", "requestretry": "^6.0.0", "rimraf": "2.2.6", "rolling-rate-limiter": "^0.2.10", "sanitize-html": "^1.27.1", "scroll-into-view-if-needed": "^2.2.25", "sysend": "^1.10.0", "tsscmp": "^1.0.6", "underscore": "^1.13.1", "unzipper": "^0.10.11", "utf-8-validate": "^5.0.2", "uuid": "^3.0.1", "valid-data-url": "^2.0.0", "valid-url": "^1.0.9", "xml-crypto": "^2.1.2", "xml2js": "^0.4.22", "xregexp": "^4.3.0", "yauzl": "^2.10.0", "yup": "^0.32.11" }, "devDependencies": { "@babel/register": "^7.14.5", "@cypress/react": "^5.12.1", "@cypress/webpack-dev-server": "^1.8.0", "@cypress/webpack-preprocessor": "^5.11.1", "@juggle/resize-observer": "^3.3.1", "@testing-library/cypress": "^8.0.2", "@testing-library/dom": "^7.31.2", "@testing-library/react": "^11.2.7", "@testing-library/react-hooks": "^7.0.0", "@testing-library/user-event": "^14.1.1", "@types/chai": "^4.3.0", "@types/events": "^3.0.0", "@types/mocha": "^9.1.0", "@types/react": "^17.0.40", "@types/react-bootstrap": "^0.32.29", "@types/react-dom": "^17.0.13", "@types/sinon-chai": "^3.2.8", "@typescript-eslint/eslint-plugin": "^5.12.1", "@typescript-eslint/parser": "^5.3.1", "acorn": "^7.1.1", "acorn-walk": "^7.1.1", "angular-mocks": "~1.8.0", "autoprefixer": "^9.7.6", "babel-loader": "^8.2.4", "babel-plugin-angularjs-annotate": "^0.10.0", "babel-plugin-macros": "^3.1.0", "c8": "^7.2.0", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", "chai-exclude": "^2.0.3", "chaid": "^1.0.2", "cheerio": "^1.0.0-rc.3", "content-disposition": "^0.5.0", "copy-webpack-plugin": "^10.2.4", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", "cypress": "^9.5.1", "es6-promise": "^4.2.8", "escodegen": "^2.0.0", "eslint": "^8.9.0", "eslint-config-prettier": "^8.3.0", "eslint-config-standard": "^16.0.3", "eslint-config-standard-jsx": "^11.0.0-0", "eslint-plugin-chai-expect": "^2.2.0", "eslint-plugin-chai-friendly": "^0.7.2", "eslint-plugin-cypress": "^2.12.1", "eslint-plugin-import": "^2.25.3", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.0.0", "eslint-plugin-react": "^7.27.0", "eslint-plugin-react-hooks": "^4.3.0", "eslint-plugin-standard": "^5.0.0", "expose-loader": "^3.1.0", "fetch-mock": "^9.10.2", "glob": "^7.1.6", "handlebars-loader": "^1.7.1", "html-webpack-plugin": "^5.5.0", "i18next-scanner": "^3.0.0", "jsdom": "^19.0.0", "jsdom-global": "^3.0.2", "karma": "^6.3.17", "karma-chai-sinon": "^0.1.5", "karma-chrome-launcher": "^3.1.0", "karma-mocha": "^2.0.0", "karma-mocha-reporter": "^2.2.5", "karma-requirejs": "^1.1.0", "karma-webpack": "^5.0.0", "less": "^3.11.1", "less-loader": "^10.2.0", "less-plugin-autoprefix": "^2.0.0", "mensch": "^0.3.4", "mini-css-extract-plugin": "^2.6.0", "mkdirp": "0.5.1", "mocha": "^8.4.0", "mock-fs": "^5.1.2", "nock": "^13.1.1", "node-fetch": "^2.6.7", "nodemon": "^2.0.6", "pirates": "^4.0.1", "postcss-loader": "^6.2.1", "prettier": "2.5.1", "requirejs": "^2.3.6", "samlp": "^3.4.1", "sandboxed-module": "https://github.com/overleaf/node-sandboxed-module/archive/cafa2d60f17ce75cc023e6f296eb8de79d92d35d.tar.gz", "sinon": "^7.5.0", "sinon-chai": "^3.7.0", "sinon-mongoose": "^2.3.0", "socket.io-mock": "^1.3.1", "terser-webpack-plugin": "^5.3.1", "timekeeper": "^2.2.0", "to-string-loader": "^1.2.0", "typescript": "^4.5.5", "val-loader": "^4.0.0", "webpack": "^5.71.0", "webpack-assets-manifest": "^5.1.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.7.4", "webpack-merge": "^5.8.0", "worker-loader": "^3.0.8" } }