{
  "name": "ethan-blog",
  "version": "0.0.1",
  "private": true,
  "description": "My blog implemented in different tech stacks.",
  "keywords": [
    "blog",
    "react"
  ],
  "author": "Ethan",
  "license": "MIT",
  "engines": {
    "node": ">=24",
    "pnpm": ">=10"
  },
  "scripts": {
    "postinstall": "husky install",
    "lint": "eslint src/react --ext .ts,.tsx",
    "lint:fix": "npm run lint -- --fix",
    "test": "jest",
    "test:watch": "npm test -- --watch",
    "sanity": "npm run lint && npm test -- --coverage --verbose",
    "minify:images": "node scripts/minify-images.js",
    "start:mock-server": "node mock-server/server.js",
    "start": "NODE_ENV=development webpack serve -c webpack.dev.config.js --progress --history-api-fallback",
    "dev": "npm start & npm run start:mock-server",
    "debug": "npm run build:release & npm run start:release & wait",
    "build:release": "onchange 'src/react/**/*.js' -e 'dist' -v -i -- npm run build:react",
    "start:release": "http-server dist -c-1 -i",
    "build:react": "NODE_ENV=production webpack -c webpack.prod.config.js --progress",
    "publish:dev": "node deploy/index.js"
  },
  "devDependencies": {
    "@testing-library/dom": "^8.19.1",
    "@testing-library/jest-dom": "^5.16.5",
    "@testing-library/react": "^13.4.0",
    "@testing-library/user-event": "^14.4.3",
    "@types/hast": "^2.3.4",
    "@types/jest": "^29.2.5",

    "@types/node": "^18.11.18",
    "@types/react": "^18.0.26",
    "@types/react-dom": "^18.0.10",
    "@types/react-router-dom": "^5.3.3",
    "@types/react-syntax-highlighter": "^15.5.6",

    "@types/testing-library__jest-dom": "^5.14.5",
    "@types/unist": "^2.0.6",
    "@typescript-eslint/eslint-plugin": "^5.48.0",
    "@typescript-eslint/parser": "^5.48.0",
    "copy-webpack-plugin": "^11.0.0",
    "css-loader": "^6.7.3",
    "dotenv": "^16.3.1",
    "dotenv-webpack": "^8.0.1",
    "eslint": "^8.25.0",
    "eslint-config-javascript-the-good-parts": "^1.7.1",
    "eslint-config-prettier": "^8.5.0",
    "eslint-plugin-import": "^2.26.0",
    "eslint-plugin-jsx-control-statements": "^2.2.1",
    "eslint-plugin-prettier": "^3.1.0",
    "eslint-plugin-react": "^7.31.10",
    "eslint-plugin-react-hooks": "^4.6.0",
    "html-webpack-plugin": "^5.5.0",
    "http-server": "^0.11.1",
    "husky": "^8.0.3",
    "identity-obj-proxy": "^3.0.0",
    "jest": "^29.3.1",
    "jest-environment-jsdom": "^29.3.1",
    "json-server": "0.17.4",
    "onchange": "^4.1.0",
    "prettier": "^1.18.2",
    "process": "^0.11.10",
    "prop-types": "^15.6.2",
    "redux-devtools-extension": "^2.13.5",
    "selenium-webdriver": "^4.0.0-alpha.1",
    "style-loader": "^3.3.1",
    "stylus": "^0.59.0",
    "stylus-loader": "^7.1.0",
    "tinify": "^1.7.1",
    "ts-jest": "^29.0.3",
    "ts-loader": "^9.4.1",
    "tslib": "^2.4.1",
    "typescript": "^4.9.4",
    "webpack": "^5.106.0",
    "webpack-assets-manifest": "^5.1.0",
    "webpack-bundle-analyzer": "^4.6.1",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^5.2.3",
    "webpack-merge": "^5.8.0"
  },
  "dependencies": {
    "axios": "^0.18.1",
    "github-markdown-css": "^2.10.0",
    "katex": "^0.16.11",

    "mermaid": "~10.3.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-markdown": "^8.0.4",
    "react-redux": "^8.0.5",
    "react-router-dom": "^6.4.2",
    "react-syntax-highlighter": "^8.0.1",
    "redux": "^4.0.0",
    "rehype-katex": "^7.0.1",
    "rehype-raw": "^6.1.1",
    "remark-gfm": "^3.0.1",
    "remark-math": "^6.0.0"
  },
  "jest": {
    "testMatch": [
      "<rootDir>/src/react/**/*.test.ts",
      "<rootDir>/src/react/**/*.test.tsx",
      "<rootDir>/src/utils/**/*.test.ts"
    ],
    "setupFiles": [],
    "transformIgnorePatterns": [
      "node_modules",
      "dist"
    ],
    "preset": "ts-jest",
    "testEnvironment": "jsdom",
    "moduleNameMapper": {
      "\\.(styl|css)$": "identity-obj-proxy",
      "github-markdown-css": "identity-obj-proxy",
      "react-markdown": "identity-obj-proxy",
      "rehype-raw": "identity-obj-proxy",
      "rehype-katex": "identity-obj-proxy",
      "remark-gfm": "identity-obj-proxy",
      "remark-math": "identity-obj-proxy",
      "mermaid": "identity-obj-proxy"
    },
    "verbose": false,
    "collectCoverage": false,
    "collectCoverageFrom": [
      "<rootDir>/src/react/**/*.ts",
      "<rootDir>/src/utils/**/*.ts"
    ],
    "coverageThreshold": {
      "global": {
        "statements": 20,
        "branches": 10,
        "functions": 40
      }
    },
    "coverageReporters": [
      "text"
    ],
    "coverageDirectory": "<rootDir>/coverage/react"
  },
  "prettier": {
    "printWidth": 80,
    "tabWidth": 2,
    "semi": false,
    "singleQuote": true,
    "trailingComma": "es5",
    "arrowParens": "always"
  },
  "eslintConfig": {
    "parser": "@typescript-eslint/parser",
    "plugins": [
      "prettier",
      "jsx-control-statements",
      "import"
    ],
    "extends": [
      "prettier",
      "javascript-the-good-parts",
      "plugin:jsx-control-statements/recommended",
      "plugin:react/recommended"
    ],
    "env": {
      "jest": true,
      "node": true,
      "browser": true,
      "es2023": true
    },
    "globals": {
      "__DEV__": true
    },
    "rules": {
      "prettier/prettier": "error",
      "import/order": [
        "error",
        {
          "groups": [
            "builtin",
            "external",
            "internal",
            "parent",
            "sibling",
            "index"
          ],
          "newlines-between": "always"
        }
      ],
      "no-empty": [
        "error",
        {
          "allowEmptyCatch": true
        }
      ],
      "react/no-unescaped-entities": "off",
      "react/no-deprecated": "off",
      "react/no-string-refs": "off",
      "react/display-name": "off",
      "react/jsx-no-undef": [
        2,
        {
          "allowGlobals": true
        }
      ]
    },
    "settings": {
      "react": {
        "version": "16.4"
      }
    }
  }
}
