Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
This project manages its dependencies using yarn. Learn more
package.json 21.46 KiB
{
  "name": "metabase",
  "private": true,
  "version": "0.0.0",
  "description": "Metabase Analytics Report Server",
  "repository": "https://github.com/metabase/metabase",
  "license": "private",
  "engines": {
    "node": ">=18",
    "yarn": "^1.12.3"
  },
  "dependencies": {
    "@dnd-kit/core": "^6.0.8",
    "@dnd-kit/modifiers": "^6.0.1",
    "@dnd-kit/sortable": "^8.0.0",
    "@emotion/cache": "^11.11.0",
    "@emotion/is-prop-valid": "^1.1.1",
    "@emotion/react": "^11.11.0",
    "@emotion/styled": "^11.11.0",
    "@juggle/resize-observer": "^3.4.0",
    "@mantine/core": "^6.0.13",
    "@mantine/dates": "^6.0.13",
    "@mantine/hooks": "^6.0.13",
    "@react-oauth/google": "^0.11.1",
    "@reduxjs/toolkit": "^2.2.5",
    "@snowplow/browser-tracker": "^3.1.6",
    "@tanstack/react-virtual": "^3.1.2",
    "@tippyjs/react": "^4.2.6",
    "@types/react-router": "3.0.27",
    "@types/redux-auth-wrapper": "^2.0.16",
    "@visx/axis": "^3.10.1",
    "@visx/clip-path": "^3.3.0",
    "@visx/grid": "^3.5.0",
    "@visx/group": "^3.3.0",
    "@visx/scale": "^3.5.0",
    "@visx/shape": "^3.5.0",
    "@visx/text": "^3.3.0",
    "ace-builds": "^1.4.14",
    "buffer": "^6.0.3",
    "classnames": "^2.1.3",
    "clipboardy": "^4.0.0",
    "color": "^4.2.3",
    "crc-32": "^1.2.2",
    "cron-expression-validator": "^1.0.20",
    "cronstrue": "^2.11.0",
    "crossfilter": "^1.3.12",
    "crypto-browserify": "^3.12.0",
    "csv-parse": "^5.5.6",
    "csv-stringify": "^6.5.0",
    "d3": "^7.9.0",
    "d3-scale": "^4.0.2",
    "dayjs": "^1.10.4",
    "detect-package-manager": "^3.0.2",
    "diff": "^3.2.0",
    "echarts": "^5.5.1-rc.1",
    "fast-text-encoding": "^1.0.6",
    "formik": "^2.4.5",
    "hast-util-from-html": "^2.0.1",
    "hast-util-to-html": "^9.0.0",
    "history": "3",
    "html2canvas-pro": "^1.5.0",
    "humanize-plus": "^1.8.1",
    "icepick": "2.4.0",
    "iframe-resizer": "~4.3.2",
    "immer": "^9.0.17",
    "inflection": "^1.7.1",
    "inquirer-toggle": "^1.0.1",
    "js-cookie": "^2.1.2",
    "jspdf": "^2.5.2",
    "jsrsasign": "^11.0.0",
    "kbar": "^0.1.0-beta.45",
    "leaflet": "^1.2.0",
    "leaflet-draw": "^0.4.9",
    "leaflet.heat": "^0.2.0",
    "lodash.debounce": "^4.0.8",
    "lodash.orderby": "^4.6.0",
    "merge-refs": "^1.3.0",
    "moment-timezone": "^0.5.38",
    "mustache": "^2.3.2",
    "normalizr": "^3.0.2",
    "ora": "^8.0.1",
    "password-generator": "^2.0.1",
    "process": "^0.11.10",
    "prop-types": "^15.5.7",
    "re-reselect": "^4.0.1",
    "react": "^18.2.0",
    "react-ace": "^10.1.0",
    "react-ansi-style": "^1.0.0",
    "react-beautiful-dnd": "^13.1.1",
    "react-color": "^2.14.1",
    "react-copy-to-clipboard": "^5.0.1",
    "react-dnd": "4",
    "react-dnd-html5-backend": "4",
    "react-dom": "^18.2.0",
    "react-draggable": "^4.4.5",
    "react-dropzone": "^14.2.3",
    "react-grid-layout": "^1.2.5",
    "react-innertext": "^1.1.5",
    "react-is": "^18.2.0",
    "react-markdown": "^8.0.7",
    "react-redux": "^9.1.2",
    "react-resizable": "^3.0.5",
    "react-router": "3",
    "react-router-redux": "^4.0.8",
    "react-transition-group": "^4.4.5",
    "react-use": "^17.5.1",
    "react-virtualized": "^9.22.3",
    "reduce-reducers": "^1.0.4",
    "redux-actions": "^2.0.1",
    "redux-auth-wrapper": "^2.1.0",
    "redux-promise": "^0.6.0",
    "regenerator-runtime": "^0.14.1",
    "rehype-external-links": "^2.0.1",
    "remark-gfm": "1.0.0",
    "reselect": "^5.1.0",
    "resize-observer-polyfill": "^1.5.1",
    "screenfull": "^6.0.2",
    "scroll-into-view-if-needed": "^3.1.0",
    "server-text-width": "^1.0.2",
    "simple-statistics": "^3.0.0",
    "slugg": "^1.2.1",
    "sql-formatter": "^15.1.2",
    "stream-browserify": "^3.0.0",
    "tether": "^1.2.0",
    "tippy.js": "^6.3.5",
    "ts-pattern": "^5.1.2",
    "ttag": "1.7.21",
    "typescript": "^5.4.5",
    "underscore": "~1.13.3",
    "use-debounce": "^10.0.0",
    "yup": "^0.32.11"
  },
  "devDependencies": {
    "@babel/cli": "^7.23.0",
    "@babel/core": "^7.23.3",
    "@babel/node": "^7.22.19",
    "@babel/preset-env": "^7.24.8",
    "@babel/preset-react": "^7.23.3",
    "@babel/preset-typescript": "^7.24.7",
    "@bahmutov/cypress-esbuild-preprocessor": "^2.2.0",
    "@cypress/grep": "^4.0.1",
    "@cypress/skip-test": "^2.6.1",
    "@emotion/babel-plugin": "^11.11.0",
    "@esbuild-plugins/node-modules-polyfill": "^0.2.2",
    "@inquirer/prompts": "^5.3.8",
    "@loki/create-async-callback": "^0.35.0",
    "@pmmmwh/react-refresh-webpack-plugin": "0.5.10",
    "@rspack/cli": "^1.0.7",
    "@rspack/core": "^1.0.7",
    "@rspack/plugin-react-refresh": "^1.0.0",
    "@sinonjs/fake-timers": "^9.1.2",
    "@storybook/addon-a11y": "^6.5.16",
    "@storybook/addon-actions": "6.5.16",
    "@storybook/addon-essentials": "6.5.16",
    "@storybook/addon-interactions": "^6.5.16",
    "@storybook/addon-links": "6.5.16",
    "@storybook/blocks": "^7.0.18",
    "@storybook/builder-webpack5": "6.5.16",
    "@storybook/jest": "^0.2.3",
    "@storybook/manager-webpack5": "6.5.16",
    "@storybook/react": "6.5.16",
    "@storybook/testing-library": "^0.2.2",
    "@svgr/webpack": "^8.0.1",
    "@swc/core": "^1.7.0",
    "@swc/plugin-emotion": "^3.0.10",
    "@testing-library/cypress": "^10.0.2",
    "@testing-library/jest-dom": "^6.4.8",
    "@testing-library/react": "^16.0.0",
    "@testing-library/react-hooks": "^8.0.0",
    "@testing-library/user-event": "^14.5.2",
    "@types/babel__core": "^7.20.4",
    "@types/babel__preset-env": "^7.9.5",
    "@types/color": "^3.0.2",
    "@types/crossfilter": "^0.0.34",
    "@types/d3": "^7.4.3",
    "@types/d3-array": "^3.2.1",
    "@types/d3-scale": "^4.0.8",
    "@types/d3-time": "^3.0.3",
    "@types/d3-time-format": "^4.0.3",
    "@types/dc": "0.0.29",
    "@types/diff": "^3.5.4",
    "@types/eslint": "7.29.0",
    "@types/glob": "^7.1.4",
    "@types/hast": "^3.0.2",
    "@types/history": "3.2.5",
    "@types/humanize-plus": "^1.8.0",
    "@types/icepick": "2.3.0",
    "@types/iframe-resizer": "^3.5.9",
    "@types/inflection": "^1.13.0",
    "@types/jest": "^29.2.3",
    "@types/js-cookie": "^2.2.7",
    "@types/jsonwebtoken": "^9.0.1",
    "@types/jsrsasign": "^10.5.12",
    "@types/leaflet": "^1.7.5",
    "@types/leaflet-draw": "^0.4.14",
    "@types/leaflet.heat": "^0.2.1",
    "@types/lodash.clonedeep": "^4.5.9",
    "@types/lodash.debounce": "^4.0.9",
    "@types/lodash.orderby": "^4.6.9",
    "@types/mustache": "^4.1.2",
    "@types/postcss-import": "^12.0.1",
    "@types/postcss-url": "^8.0.2",
    "@types/prettier": "1.19.1",
    "@types/prop-types": "^15.7.4",
    "@types/raf": "^3.4.0",
    "@types/react": "^18.3.3",
    "@types/react-beautiful-dnd": "^13.1.3",
    "@types/react-color": "^2.17.6",
    "@types/react-copy-to-clipboard": "^5.0.2",
    "@types/react-dom": "^18.2.17",
    "@types/react-grid-layout": "^1.1.3",
    "@types/react-is": "^18.2.4",
    "@types/react-resizable": "^3.0.4",
    "@types/react-router-redux": "^4.0.53",
    "@types/react-textarea-autosize": "^4.3.6",
    "@types/react-transition-group": "^4.4.5",
    "@types/react-virtualized": "^9.21.13",
    "@types/redux-actions": "^2.6.5",
    "@types/redux-promise": "^0.5.32",
    "@types/tether": "^1.4.6",
    "@types/underscore": "^1.11.3",
    "@typescript-eslint/eslint-plugin": "^6.21.0",
    "@typescript-eslint/parser": "^6.21.0",
    "arg": "^5.0.0",
    "babel-eslint": "10.1.0",
    "babel-loader": "^9.1.2",
    "babel-plugin-ttag": "^1.7.26",
    "chalk": "^4",
    "chromatic": "^10.2.0",
    "commander": "^12.1.0",
    "concurrently": "^8.2.2",
    "conventional-changelog-cli": "^5.0.0",
    "cross-fetch": "^3.1.5",
    "css-loader": "^6.10.0",
    "cypress": "^13.9.0",
    "cypress-multi-reporters": "^1.6.4",
    "cypress-real-events": "^1.12.0",
    "cypress-terminal-report": "^6.1.2",
    "esbuild": "^0.21.1",
    "eslint": "7.32.0",
    "eslint-import-resolver-webpack": "^0.8.3",
    "eslint-plugin-cypress": "^2.12.1",
    "eslint-plugin-depend": "^0.9.0",
    "eslint-plugin-import": "^2.29.1",
    "eslint-plugin-jest": "^27.2.0",
    "eslint-plugin-jest-dom": "^5.4.0",
    "eslint-plugin-jest-formatting": "^3.1.0",
    "eslint-plugin-no-only-tests": "^2.4.0",
    "eslint-plugin-postcss-modules": "^2.0.0",
    "eslint-plugin-react": "^7.32.2",
    "eslint-plugin-react-hooks": "^4.6.0",
    "eslint-plugin-storybook": "^0.9.0",
    "eslint-plugin-testing-library": "^5.11.0",
    "fetch-mock": "^9.11.0",
    "fetch-mock-jest": "^1.5.1",
    "fork-ts-checker-webpack-plugin": "^9.0.2",
    "get-nonce": "^1.0.1",
    "glob": "^7.1.1",
    "html-webpack-plugin": "5.5.0",
    "http-server": "^14.1.1",
    "husky": "^8.0.2",
    "inquirer-file-selector": "^0.2.1",
    "jest": "^29.7.0",
    "jest-canvas-mock": "^2.5.2",
    "jest-environment-jsdom": "^29.7.0",
    "jest-junit": "^16.0.0",
    "jest-localstorage-mock": "^2.4.22",
    "jest-watch-typeahead": "^2.2.1",
    "jose": "^5.6.3",
    "json-to-pretty-yaml": "^1.2.2",
    "jsonwebtoken": "^9.0.0",
    "knex": "^2.4.2",
    "lint-staged": "^13.1.2",
    "loki": "^0.35.0",
    "markdown-link-check": "^3.10.2",
    "mini-css-extract-plugin": "2.7.2",
    "mocha": "^10.2.0",
    "mocha-junit-reporter": "^2.2.1",
    "mochawesome": "^7.1.3",
    "mochawesome-merge": "^4.2.1",
    "mochawesome-report-generator": "^6.2.0",
    "mockdate": "^2.0.2",
    "mutationobserver-shim": "^0.3.7",
    "mysql2": "^3.9.8",
    "node-polyfill-webpack-plugin": "^3.0.0",
    "null-loader": "^4.0.1",
    "open": "^10.1.0",
    "open-cli": "^8.0.0",
    "patch-package": "^8.0.0",
    "pg": "^8.8.0",
    "postcss": "^8.4.19",
    "postcss-discard-comments": "^7.0.1",
    "postcss-import": "15.1.0",
    "postcss-loader": "7.0.2",
    "postcss-preset-env": "^6.7.0",
    "postcss-styled-syntax": "^0.6.4",
    "postcss-url": "^10.1.3",
    "postinstall-postinstall": "^2.1.0",
    "prettier": "^3.3.3",
    "promise-loader": "^1.0.0",
    "raf": "^3.4.0",
    "react-docgen-typescript-plugin": "^1.0.6",
    "react-refresh": "^0.14.2",
    "reg-cli": "^0.17.7",
    "semver": "^7.6.3",
    "shadow-cljs": "^2.28.12",
    "source-map-loader": "^4.0.1",
    "storybook-addon-pseudo-states": "^3.1.1",
    "stylelint": "^16.2.1",
    "stylelint-config-css-modules": "^4.4.0",
    "stylelint-config-standard": "^36.0.0",
    "swc-loader": "^0.2.6",
    "terser-webpack-plugin": "^5.3.9",
    "webpack": "^5.94.0",
    "webpack-bundle-analyzer": "^4.10.1",
    "webpack-cli": "^5.1.1",
    "webpack-dev-server": "^5.0.4",
    "webpack-notifier": "1.15.0",
    "webpack-stats-plugin": "^1.1.3",
    "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz",
    "yaml-lint": "~1.6.0",
    "yarn-deduplicate": "^6.0.2"
  },
  "resolutions": {
    "ansi-html": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
    "ansi-regex": "5.0.1",
    "cookie": "^0.7.0",
    "d3-color": "^3.1.0",
    "elliptic": "^6.6.0",
    "debug": "^4.3.4",
    "follow-redirects": "^1.15.5",
    "jsdom": "^22.1.0",
    "json5": "2.2.2",
    "nth-check": "2.0.1",
    "@types/react": "^18.2.42",
    "@types/react-dom": "^18.2.17",
    "set-value": "4.0.1",
    "source-map-js": "1.2.0",
    "unset-value": "2.0.1",
    "webpack-dev-middleware": "^5.3.4"
  },
  "scripts": {
    "build": "yarn build:cljs && yarn build:js",
    "build-embedding-sdk": "yarn && yarn build-release:cljs && yarn embedding-sdk:generate-package && yarn build-release:sdk && yarn build-embedding-sdk-cli && yarn embedding-sdk:fixup-types-imports",
    "build-embedding-sdk:pure": "WEBPACK_BUNDLE=development webpack --config webpack.embedding-sdk.config.js",
    "build-embedding-sdk:watch": "yarn embedding-sdk:generate-package && yarn build-embedding-sdk:pure --watch",
    "build-embedding-sdk-cli": "webpack --config webpack.embedding-sdk-cli.config.js",
    "build-embedding-sdk-cli:watch": "yarn build-embedding-sdk-cli --watch",
    "build-hot": "rm -f target/cljs_dev/cljs.core.js && yarn concurrently -n 'cljs,js' -c 'yellow,green' 'yarn build-hot:cljs' 'yarn build-hot:js-wait'",
    "build-hot:cljs": "yarn && shadow-cljs watch app",
    "build-hot:js": "yarn && yarn clean-dev:js && NODE_OPTIONS=--max-old-space-size=8196 WEBPACK_BUNDLE=hot rspack serve",
    "build-hot:js-wait": "yarn wait:cljs; yarn build-hot:js",
    "build-pure:cljs": "yarn clean-dev:cljs && shadow-cljs compile app",
    "build-release": "yarn build-release:cljs && yarn build-release:js",
    "build-release:cljs": "yarn clean-release:cljs && shadow-cljs release app",
    "build-release:js": "WEBPACK_BUNDLE=production NODE_OPTIONS=--max-old-space-size=8196 rspack build",
    "build-release:sdk": "WEBPACK_BUNDLE=production webpack --config webpack.embedding-sdk.config.js",
    "build-release:static-viz": "WEBPACK_BUNDLE=production webpack --config webpack.static-viz.config.js",
    "build-shared": "yarn && webpack --config webpack.shared.config.js",
    "build-static-viz": "yarn && yarn build-release:cljs && WEBPACK_BUNDLE=production webpack --config webpack.static-viz.config.js",
    "build-static-viz:watch": "webpack --config webpack.static-viz.config.js --watch",
    "build-static-viz:watch-wait": "yarn wait:cljs; yarn build-static-viz:watch",
    "build-stats": "yarn && webpack --json > stats.json",
    "build-storybook": "NODE_ENV=development yarn build:cljs && NODE_OPTIONS=--max-old-space-size=8196 build-storybook",
    "build-storybook-embedding-sdk": "NODE_OPTIONS=--max-old-space-size=8196 IS_EMBEDDING_SDK=true build-storybook --quiet",
    "build-watch": "yarn concurrently -n 'cljs,js' 'yarn build-watch:cljs' 'yarn build-watch:js'",
    "build-watch:cljs": "yarn && shadow-cljs watch app",
    "build-watch:js": "yarn && NODE_OPTIONS=--max-old-space-size=8196 rspack serve --watch",
    "build:cljs": "yarn && yarn build-pure:cljs",
    "build:js": "yarn && NODE_OPTIONS=--max-old-space-size=8196 rspack build",
    "chromatic": "yarn build:cljs && NODE_OPTIONS=--max-old-space-size=8196 chromatic",
    "ci": "yarn ci-frontend && yarn ci-backend",
    "ci-backend": "clojure -X:dev:ee:ee-dev:drivers:drivers-dev:eastwood && clojure -X:dev:test",
    "ci-frontend": "yarn lint && yarn test",
    "clean-cypress-artifacts": "rm -R -f cypress/",
    "clean-dev:cljs": "rm -rf target/cljs_dev/*",
    "clean-dev:js": "rm -rf resources/frontend_client/app/dist target/classes/frontend_client/app/dist",
    "clean-release:cljs": "rm -rf target/cljs_release/*",
    "clean:cljs": "yarn && yarn clean-dev:cljs && yarn clean-release:cljs",
    "cljs-nrepl": "yarn && shadow-cljs node-repl -d cider/cider-nrepl:0.45.0 -d cider/piggieback:0.5.3 -d refactor-nrepl/refactor-nrepl:3.9.1",
    "cljs-server-restart": "yarn && shadow-cljs restart",
    "cljs-server-start": "yarn && shadow-cljs start",
    "cljs-server-stop": "yarn && shadow-cljs stop",
    "concurrently": "yarn && concurrently --kill-others -p name",
    "dev": "yarn && yarn clean-dev:cljs && concurrently -n 'backend,frontend,cljs,static-viz' -c 'blue,green,yellow,magenta,red' 'clojure -M:run' 'yarn build-hot:js-wait' 'yarn build-hot:cljs' 'yarn build-static-viz:watch-wait'",
    "dev-ee": "yarn && yarn clean-dev:cljs && concurrently -n 'backend,frontend,cljs,static-viz' -c 'blue,green,yellow,magenta,red' 'clojure -M:run:ee' 'MB_EDITION=ee yarn build-hot:js-wait' 'MB_EDITION=ee yarn build-hot:cljs' 'yarn build-static-viz:watch-wait'",
    "docs-lint-links": "find docs -type f -name '*.md' -print0 | xargs -0 markdown-link-check --quiet --config .mlc_config.json",
    "embedding-sdk:fixup-types-imports": "node ./bin/embedding-sdk/fixup-types-after-compilation.js",
    "embedding-sdk:generate-package": "node ./bin/embedding-sdk/generate-sdk-package-files.js",
    "embedding-sdk:generate-changelog": "yarn conventional-changelog -p angular --pkg enterprise/frontend/src/embedding-sdk/package.template.json --config enterprise/frontend/src/embedding-sdk/conventional-changelog-config.js --tagPrefix embedding-sdk-",
    "embedding-sdk:publish": "cd ./resources/embedding-sdk && npm publish",
    "embedding-sdk:test-unit": "yarn test-unit enterprise/frontend/src/embedding-sdk/",
    "embedding-sdk:tsc": "tsc --project tsconfig.sdk.json",
    "embedding-sdk:clean": "rm -rf resources/embedding-sdk/dist && rm -rf resources/embedding-sdk/.tsbuildinfo",
    "embedding-sdk:dev": "concurrently -n 'tsc,webpack,fix-types' -c 'blue,green,yellow' 'npm:embedding-sdk:dev:dts' 'npm:embedding-sdk:dev:webpack' 'npm:embedding-sdk:dev:fixup'",
    "embedding-sdk:dev:dts": "yarn embedding-sdk:tsc --watch --preserveWatchOutput",
    "embedding-sdk:dev:webpack": "SKIP_DTS=true yarn build-embedding-sdk:watch",
    "embedding-sdk:dev:fixup": "yarn embedding-sdk:fixup-types-imports --watch",
    "eslint-fix": "yarn lint-eslint --fix",
    "generate-cypress-html-report": "mochawesome-merge cypress/reports/mochareports/*.json > cypress/reports/cypress-test-report.json && marge cypress/reports/cypress-test-report.json -o cypress/reports/mochareports --inline",
    "lint": "yarn lint-eslint && yarn lint-prettier && yarn lint-docs-links && yarn lint-yaml && yarn type-check",
    "lint-docs-links": "yarn && ./bin/verify-doc-links",
    "lint-eslint": "yarn build:cljs && yarn lint-eslint-pure",
    "lint-eslint-pure": "eslint --ext .js,.jsx,.ts,.tsx --rulesdir frontend/lint/eslint-rules --max-warnings 0 --report-unused-disable-directives enterprise/frontend frontend e2e",
    "lint-prettier": "yarn && yarn lint-prettier-pure",
    "lint-prettier-pure": "prettier --check '{frontend,enterprise/frontend,e2e}/**/*.{js,jsx,ts,tsx,css}'",
    "lint-yaml": "yamllint **/*.{yaml,yml} --ignore=node_modules/**/*.{yaml,yml}",
    "postinstall": "yarn yarn-deduplicate --scopes @babel && patch-package",
    "precommit": "lint-staged --shell",
    "preinstall": "echo $npm_execpath | grep -q yarn || echo '\\033[0;33mSorry, npm is not supported. Please use Yarn (https://yarnpkg.com/).\\033[0m'",
    "prepare": "husky install",
    "prettier": "prettier --write '{frontend,enterprise/frontend,e2e}/**/*.{js,jsx,ts,tsx,css}'",
    "remove-webpack-cache": "rm -rf ./node_modules/.cache",
    "storybook": "yarn build:cljs && start-storybook -p 6006",
    "storybook-embedding-sdk": "yarn build:cljs && IS_EMBEDDING_SDK=true start-storybook -p 6006",
    "test": "yarn test-unit && yarn test-timezones && yarn test-cypress",
    "test-cljs": "yarn && shadow-cljs compile test && node target/node-tests.js",
    "test-cypress": "yarn build && ./bin/build-for-test && yarn test-cypress-run",
    "test-cypress-open": "./bin/build-for-test && CYPRESS_FE_HEALTHCHECK=false yarn test-cypress-run --e2e --open",
    "test-cypress-open-no-backend": "E2E_HOST='http://localhost:3000' yarn test-cypress-run --e2e --open",
    "test-cypress-open-qa": "yarn test-qa-dbs:up && QA_DB_ENABLED=true TZ='US/Pacific' yarn test-cypress-open",
    "test-cypress-open-sdk": "CYPRESS_IS_EMBEDDING_SDK=true yarn test-cypress-open --e2e --open --folder 'embedding-sdk'",
    "test-cypress-run": "node ./e2e/runner/run_cypress_tests.js",
    "test-debug": "yarn build:cljs && node --inspect-brk node_modules/.bin/jest --runInBand --detectOpenHandles",
    "test-qa-dbs:down": "docker compose -f ./e2e/test/scenarios/docker-compose.yml down",
    "test-qa-dbs:up": "docker compose -f ./e2e/test/scenarios/docker-compose.yml up -d",
    "test-timezones": "yarn && ./frontend/test/__runner__/run_timezone_tests",
    "test-timezones-unit": "yarn build:cljs && jest --silent --maxWorkers=4 --config jest.tz.unit.conf.json",
    "test-unit": "yarn build:cljs && jest --maxWorkers=4",
    "test-unit-keep-cljs": "jest --maxWorkers=4",
    "test-unit-watch": "yarn test-unit --watch",
    "test-unit-watch:cljs": "yarn concurrently -n 'cljs,tests' 'yarn build-watch:cljs' 'yarn test-unit-keep-cljs --watch'",
    "test-visual": "yarn build && ./bin/build-for-test && yarn test-visual-run",
    "test-visual:loki": "yarn loki test --chromeFlags='--headless --disable-gpu'",
    "test-visual:loki-approve-diff": "ls .loki/difference | xargs -I _ find .loki/current -name _ | xargs -I _ cp _ .loki/reference/",
    "test-visual:loki-update": "yarn loki update --chromeFlags='--headless --disable-gpu'",
    "test-visual:loki-report": "node frontend/test/generate-loki-report-json.js && reg-cli --from .loki/report.json --report .loki/report.html",
    "test-visual:loki-report-open": "yarn test-visual:loki || (echo 'Visual test failed, opening report...' && yarn test-visual:loki-report && open-cli .loki/report.html)",
    "type-check": "yarn clean:cljs && yarn build:cljs && yarn type-check-pure",
    "type-check-pure": "tsc --noEmit",
    "validate-e2e-filenames": "node e2e/validate-e2e-test-files.js",
    "wait:cljs": "echo Waiting for first CLJS build; until [ -f target/cljs_dev/cljs.core.js ]; do sleep 1; done; echo CLJS build done"
  },
  "lint-staged": {
    "+(frontend|enterprise)/**/*.styled.tsx": [
      "stylelint --customSyntax postcss-styled-syntax --fix"
    ],
    "+(frontend|enterprise/frontend|e2e)/**/*.css": [
      "stylelint --fix",
      "prettier --write"
    ],
    "+(frontend|enterprise/frontend)/**/*.{js,jsx,ts,tsx}": [
      "LINT_CSS_MODULES=true eslint --rulesdir frontend/lint/eslint-rules --max-warnings 0 --fix",
      "prettier --write",
      "node ./bin/verify-doc-links"
    ],
    "e2e/**/*.{js,jsx,ts,jsx}": [
      "eslint --rulesdir frontend/lint/eslint-rules --max-warnings 0 --fix",
      "prettier --write"
    ],
    "e2e/test/scenarios/*/{*.(js|ts),!(helpers|shared)/*.(js|ts)}": [
      "node e2e/validate-e2e-test-files.js"
    ],
    "**/*.{clj,cljc,cljs,bb}": [
      "clj-kondo --config ./.clj-kondo/config.edn --config-dir ./.clj-kondo --parallel --lint",
      "./bin/whitespace_lint_staged.sh"
    ],
    "enterprise/frontend/src/embedding-sdk/README.md": [
      "prettier --write"
    ]
  },
  "browserslist": [
    "defaults"
  ]
}