From fb52bd45d5909be9fbef7d49e9736ba92c9c08d2 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Tue, 12 Mar 2024 19:28:11 +0700 Subject: [PATCH 01/48] setup client --- client-side/client/.eslintrc.cjs | 21 + client-side/client/.gitignore | 24 + client-side/client/README.md | 8 + client-side/client/index.html | 13 + client-side/client/package-lock.json | 3668 +++++++++++++++++++++++ client-side/client/package.json | 26 + client-side/client/public/vite.svg | 1 + client-side/client/src/App.css | 42 + client-side/client/src/App.jsx | 35 + client-side/client/src/assets/react.svg | 1 + client-side/client/src/index.css | 68 + client-side/client/src/main.jsx | 10 + client-side/client/vite.config.js | 7 + client-side/package-lock.json | 6 + 14 files changed, 3930 insertions(+) create mode 100644 client-side/client/.eslintrc.cjs create mode 100644 client-side/client/.gitignore create mode 100644 client-side/client/README.md create mode 100644 client-side/client/index.html create mode 100644 client-side/client/package-lock.json create mode 100644 client-side/client/package.json create mode 100644 client-side/client/public/vite.svg create mode 100644 client-side/client/src/App.css create mode 100644 client-side/client/src/App.jsx create mode 100644 client-side/client/src/assets/react.svg create mode 100644 client-side/client/src/index.css create mode 100644 client-side/client/src/main.jsx create mode 100644 client-side/client/vite.config.js create mode 100644 client-side/package-lock.json diff --git a/client-side/client/.eslintrc.cjs b/client-side/client/.eslintrc.cjs new file mode 100644 index 0000000..3e212e1 --- /dev/null +++ b/client-side/client/.eslintrc.cjs @@ -0,0 +1,21 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], + rules: { + 'react/jsx-no-target-blank': 'off', + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/client-side/client/.gitignore b/client-side/client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/client-side/client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/client-side/client/README.md b/client-side/client/README.md new file mode 100644 index 0000000..f768e33 --- /dev/null +++ b/client-side/client/README.md @@ -0,0 +1,8 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh diff --git a/client-side/client/index.html b/client-side/client/index.html new file mode 100644 index 0000000..0c589ec --- /dev/null +++ b/client-side/client/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
+ + + diff --git a/client-side/client/package-lock.json b/client-side/client/package-lock.json new file mode 100644 index 0000000..d4c02ca --- /dev/null +++ b/client-side/client/package-lock.json @@ -0,0 +1,3668 @@ +{ + "name": "client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.0.0", + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.64", + "@types/react-dom": "^18.2.21", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "vite": "^5.1.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", + "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", + "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", + "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", + "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", + "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", + "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", + "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", + "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", + "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", + "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", + "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", + "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", + "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.6.tgz", + "integrity": "sha512-A7iK9+1qzTCIuc3IYcS8gPHCm9bZVKUJrfNnwveZYyo6OFp3jLno4WOM2yBy5uqedgYATEiWgBYHKq37KrU6IA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.4.6", + "@swc/core-darwin-x64": "1.4.6", + "@swc/core-linux-arm-gnueabihf": "1.4.6", + "@swc/core-linux-arm64-gnu": "1.4.6", + "@swc/core-linux-arm64-musl": "1.4.6", + "@swc/core-linux-x64-gnu": "1.4.6", + "@swc/core-linux-x64-musl": "1.4.6", + "@swc/core-win32-arm64-msvc": "1.4.6", + "@swc/core-win32-ia32-msvc": "1.4.6", + "@swc/core-win32-x64-msvc": "1.4.6" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.6.tgz", + "integrity": "sha512-bpggpx/BfLFyy48aUKq1PsNUxb7J6CINlpAUk0V4yXfmGnpZH80Gp1pM3GkFDQyCfq7L7IpjPrIjWQwCrL4hYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.6.tgz", + "integrity": "sha512-vJn+/ZuBTg+vtNkcmgZdH6FQpa0hFVdnB9bAeqYwKkyqP15zaPe6jfC+qL2y/cIeC7ASvHXEKrnCZgBLxfVQ9w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.6.tgz", + "integrity": "sha512-hEmYcB/9XBAl02MtuVHszhNjQpjBzhk/NFulnU33tBMbNZpy2TN5yTsitezMq090QXdDz8sKIALApDyg07ZR8g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.6.tgz", + "integrity": "sha512-/UCYIVoGpm2YVvGHZM2QOA3dexa28BjcpLAIYnoCbgH5f7ulDhE8FAIO/9pasj+kixDBsdqewHfsNXFYlgGJjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.6.tgz", + "integrity": "sha512-LGQsKJ8MA9zZ8xHCkbGkcPSmpkZL2O7drvwsGKynyCttHhpwVjj9lguhD4DWU3+FWIsjvho5Vu0Ggei8OYi/Lw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.6.tgz", + "integrity": "sha512-10JL2nLIreMQDKvq2TECnQe5fCuoqBHu1yW8aChqgHUyg9d7gfZX/kppUsuimqcgRBnS0AjTDAA+JF6UsG/2Yg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.6.tgz", + "integrity": "sha512-EGyjFVzVY6Do89x8sfah7I3cuP4MwtwzmA6OlfD/KASqfCFf5eIaEBMbajgR41bVfMV7lK72lwAIea5xEyq1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.6.tgz", + "integrity": "sha512-gfW9AuXvwSyK07Vb8Y8E9m2oJZk21WqcD+X4BZhkbKB0TCZK0zk1j/HpS2UFlr1JB2zPKPpSWLU3ll0GEHRG2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.6.tgz", + "integrity": "sha512-ZuQm81FhhvNVYtVb9GfZ+Du6e7fZlkisWvuCeBeRiyseNt1tcrQ8J3V67jD2nxje8CVXrwG3oUIbPcybv2rxfQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.6.tgz", + "integrity": "sha512-UagPb7w5V0uzWSjrXwOavGa7s9iv3wrVdEgWy+/inm0OwY4lj3zpK9qDnMWAwYLuFwkI3UG4Q3dH8wD+CUUcjw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.65", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.65.tgz", + "integrity": "sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.21.tgz", + "integrity": "sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "dev": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz", + "integrity": "sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==", + "dev": true, + "dependencies": { + "@swc/core": "^1.3.107" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", + "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/es-abstract": { + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", + "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", + "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", + "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/client-side/client/package.json b/client-side/client/package.json new file mode 100644 index 0000000..a23cbc4 --- /dev/null +++ b/client-side/client/package.json @@ -0,0 +1,26 @@ +{ + "name": "client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.64", + "@types/react-dom": "^18.2.21", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "vite": "^5.1.6" + } +} diff --git a/client-side/client/public/vite.svg b/client-side/client/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/client-side/client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client-side/client/src/App.css b/client-side/client/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/client-side/client/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/client-side/client/src/App.jsx b/client-side/client/src/App.jsx new file mode 100644 index 0000000..b8b8473 --- /dev/null +++ b/client-side/client/src/App.jsx @@ -0,0 +1,35 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' +import './App.css' + +function App() { + const [count, setCount] = useState(0) + + return ( + <> +
+ + Vite logo + + + React logo + +
+

Vite + React

+
+ +

+ Edit src/App.jsx and save to test HMR +

+
+

+ Click on the Vite and React logos to learn more +

+ + ) +} + +export default App diff --git a/client-side/client/src/assets/react.svg b/client-side/client/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/client-side/client/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client-side/client/src/index.css b/client-side/client/src/index.css new file mode 100644 index 0000000..6119ad9 --- /dev/null +++ b/client-side/client/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/client-side/client/src/main.jsx b/client-side/client/src/main.jsx new file mode 100644 index 0000000..54b39dd --- /dev/null +++ b/client-side/client/src/main.jsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.jsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + , +) diff --git a/client-side/client/vite.config.js b/client-side/client/vite.config.js new file mode 100644 index 0000000..861b04b --- /dev/null +++ b/client-side/client/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react-swc' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/client-side/package-lock.json b/client-side/package-lock.json new file mode 100644 index 0000000..630fa5f --- /dev/null +++ b/client-side/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "client-side", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} From f49c10e94023678186aa77805a491d20e33c113a Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Tue, 12 Mar 2024 19:36:49 +0700 Subject: [PATCH 02/48] setup server --- server/.gitignore | 1 + server/config/config.json | 23 + server/models/index.js | 43 + server/package-lock.json | 2141 +++++++++++++++++++++++++++++++++++++ server/package.json | 10 + 5 files changed, 2218 insertions(+) create mode 100644 server/.gitignore create mode 100644 server/config/config.json create mode 100644 server/models/index.js create mode 100644 server/package-lock.json create mode 100644 server/package.json diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/server/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/server/config/config.json b/server/config/config.json new file mode 100644 index 0000000..0f858c6 --- /dev/null +++ b/server/config/config.json @@ -0,0 +1,23 @@ +{ + "development": { + "username": "root", + "password": null, + "database": "database_development", + "host": "127.0.0.1", + "dialect": "mysql" + }, + "test": { + "username": "root", + "password": null, + "database": "database_test", + "host": "127.0.0.1", + "dialect": "mysql" + }, + "production": { + "username": "root", + "password": null, + "database": "database_production", + "host": "127.0.0.1", + "dialect": "mysql" + } +} diff --git a/server/models/index.js b/server/models/index.js new file mode 100644 index 0000000..024200e --- /dev/null +++ b/server/models/index.js @@ -0,0 +1,43 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const Sequelize = require('sequelize'); +const process = require('process'); +const basename = path.basename(__filename); +const env = process.env.NODE_ENV || 'development'; +const config = require(__dirname + '/../config/config.json')[env]; +const db = {}; + +let sequelize; +if (config.use_env_variable) { + sequelize = new Sequelize(process.env[config.use_env_variable], config); +} else { + sequelize = new Sequelize(config.database, config.username, config.password, config); +} + +fs + .readdirSync(__dirname) + .filter(file => { + return ( + file.indexOf('.') !== 0 && + file !== basename && + file.slice(-3) === '.js' && + file.indexOf('.test.js') === -1 + ); + }) + .forEach(file => { + const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); + db[model.name] = model; + }); + +Object.keys(db).forEach(modelName => { + if (db[modelName].associate) { + db[modelName].associate(db); + } +}); + +db.sequelize = sequelize; +db.Sequelize = Sequelize; + +module.exports = db; diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..d7e1e79 --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,2141 @@ +{ + "name": "server", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "express": "^4.18.3", + "pg": "^8.11.3", + "sequelize": "^6.37.1" + }, + "devDependencies": { + "sequelize-cli": "^6.6.2" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "20.11.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz", + "integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/validator": { + "version": "13.11.9", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", + "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cli-color": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", + "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.64", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dev": true, + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dev": true, + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/express": { + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", + "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-beautify": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", + "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==", + "dev": true, + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.3.3", + "js-cookie": "^3.0.5", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/pg": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/sequelize": { + "version": "6.37.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.1.tgz", + "integrity": "sha512-vIKKzQ9dGp2aBOxQRD1FmUYViuQiKXSJ8yah8TsaBx4U3BokJt+Y2A0qz2C4pj08uX59qpWxRqSLEfRmVOEgQw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "dependencies": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-cli": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.2.tgz", + "integrity": "sha512-V8Oh+XMz2+uquLZltZES6MVAD+yEnmMfwfn+gpXcDiwE3jyQygLt4xoI0zG8gKt6cRcs84hsKnXAKDQjG/JAgg==", + "dev": true, + "dependencies": { + "cli-color": "^2.0.3", + "fs-extra": "^9.1.0", + "js-beautify": "^1.14.5", + "lodash": "^4.17.21", + "resolve": "^1.22.1", + "umzug": "^2.3.0", + "yargs": "^16.2.0" + }, + "bin": { + "sequelize": "lib/sequelize", + "sequelize-cli": "lib/sequelize" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sequelize/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/sequelize/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" + }, + "node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/umzug": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", + "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==", + "dev": true, + "dependencies": { + "bluebird": "^3.7.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..b9c585a --- /dev/null +++ b/server/package.json @@ -0,0 +1,10 @@ +{ + "dependencies": { + "express": "^4.18.3", + "pg": "^8.11.3", + "sequelize": "^6.37.1" + }, + "devDependencies": { + "sequelize-cli": "^6.6.2" + } +} From f104f2cc83ab331afb337fbbce54bfa45fd0d29e Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Wed, 13 Mar 2024 16:16:18 +0700 Subject: [PATCH 03/48] setup server and seeding --- client-side/client/package-lock.json | 1782 +++++- client-side/client/package.json | 4 +- server/config/config.json | 22 +- server/middlewares/bcrypt.js | 6 + .../migrations/20240313073852-create-user.js | 54 + .../migrations/20240313090416-create-tag.js | 34 + .../20240313090525-create-content.js | 53 + server/models/content.js | 26 + server/models/tag.js | 23 + server/models/user.js | 25 + server/package-lock.json | 5103 ++++++++++++++--- server/package.json | 8 +- server/seeders/20240313075506-seed-user.js | 44 + 13 files changed, 6444 insertions(+), 740 deletions(-) create mode 100644 server/middlewares/bcrypt.js create mode 100644 server/migrations/20240313073852-create-user.js create mode 100644 server/migrations/20240313090416-create-tag.js create mode 100644 server/migrations/20240313090525-create-content.js create mode 100644 server/models/content.js create mode 100644 server/models/tag.js create mode 100644 server/models/user.js create mode 100644 server/seeders/20240313075506-seed-user.js diff --git a/client-side/client/package-lock.json b/client-side/client/package-lock.json index d4c02ca..a3c959e 100644 --- a/client-side/client/package-lock.json +++ b/client-side/client/package-lock.json @@ -9,7 +9,8 @@ "version": "0.0.0", "dependencies": { "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "sequelize": "^6.37.1" }, "devDependencies": { "@types/react": "^18.2.64", @@ -19,6 +20,7 @@ "eslint-plugin-react": "^7.34.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", + "sequelize-cli": "^6.6.2", "vite": "^5.1.6" } }, @@ -488,6 +490,102 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -523,6 +621,22 @@ "node": ">= 8" } }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", @@ -902,12 +1016,33 @@ "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", "dev": true }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "20.11.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz", + "integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@types/prop-types": { "version": "15.7.11", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", @@ -940,6 +1075,11 @@ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", "dev": true }, + "node_modules/@types/validator": { + "version": "13.11.9", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", + "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -958,6 +1098,27 @@ "vite": "^4 || ^5" } }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -1041,6 +1202,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/array-includes": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", @@ -1171,6 +1337,15 @@ "has-symbols": "^1.0.3" } }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -1192,6 +1367,48 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1202,11 +1419,26 @@ "concat-map": "0.0.1" } }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1246,6 +1478,33 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cli-color": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", + "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.64", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1264,12 +1523,63 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1290,11 +1600,23 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1317,7 +1639,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1347,6 +1668,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1359,6 +1697,93 @@ "node": ">=6.0.0" } }, + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dev": true, + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/es-abstract": { "version": "1.22.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", @@ -1418,7 +1843,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -1430,7 +1854,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -1501,6 +1924,58 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dev": true, + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "node_modules/esbuild": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", @@ -1539,6 +2014,20 @@ "@esbuild/win32-x64": "0.19.12" } }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1699,6 +2188,21 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -1758,14 +2262,95 @@ "node": ">=0.10.0" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/express": { + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", + "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true @@ -1797,6 +2382,36 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -1842,6 +2457,53 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1866,7 +2528,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1898,11 +2559,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -2000,7 +2669,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -2008,6 +2676,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -2036,7 +2710,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -2048,7 +2721,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -2060,7 +2732,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -2087,7 +2758,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -2095,6 +2765,32 @@ "node": ">= 0.4" } }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -2129,6 +2825,14 @@ "node": ">=0.8.19" } }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ] + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2142,7 +2846,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "node_modules/internal-slot": { @@ -2159,6 +2868,14 @@ "node": ">= 0.4" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -2278,6 +2995,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -2353,6 +3079,12 @@ "node": ">=8" } }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -2506,6 +3238,100 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-beautify": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", + "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==", + "dev": true, + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.3.3", + "js-cookie": "^3.0.5", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2541,6 +3367,18 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -2593,6 +3431,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2610,6 +3453,93 @@ "loose-envify": "cli.js" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2622,11 +3552,38 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { "version": "3.3.7", @@ -2652,6 +3609,35 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2665,7 +3651,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2758,6 +3743,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2814,6 +3810,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2826,6 +3827,14 @@ "node": ">=6" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2859,27 +3868,140 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, - "funding": [ + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/pg": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" @@ -2902,6 +4024,41 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2922,6 +4079,24 @@ "react-is": "^16.13.1" } }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -2931,6 +4106,20 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -2951,6 +4140,28 @@ } ] }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -3019,6 +4230,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -3045,6 +4265,11 @@ "node": ">=4" } }, + "node_modules/retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -3143,6 +4368,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", @@ -3160,6 +4404,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -3177,11 +4426,187 @@ "semver": "bin/semver.js" } }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/sequelize": { + "version": "6.37.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.1.tgz", + "integrity": "sha512-vIKKzQ9dGp2aBOxQRD1FmUYViuQiKXSJ8yah8TsaBx4U3BokJt+Y2A0qz2C4pj08uX59qpWxRqSLEfRmVOEgQw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "dependencies": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-cli": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.2.tgz", + "integrity": "sha512-V8Oh+XMz2+uquLZltZES6MVAD+yEnmMfwfn+gpXcDiwE3jyQygLt4xoI0zG8gKt6cRcs84hsKnXAKDQjG/JAgg==", + "dev": true, + "dependencies": { + "cli-color": "^2.0.3", + "fs-extra": "^9.1.0", + "js-beautify": "^1.14.5", + "lodash": "^4.17.21", + "resolve": "^1.22.1", + "umzug": "^2.3.0", + "yargs": "^16.2.0" + }, + "bin": { + "sequelize": "lib/sequelize", + "sequelize-cli": "lib/sequelize" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sequelize-cli/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sequelize/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -3209,6 +4634,11 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3234,7 +4664,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -3248,6 +4677,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -3257,6 +4698,51 @@ "node": ">=0.10.0" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -3334,6 +4820,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3376,6 +4875,35 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" + }, + "node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3400,6 +4928,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", @@ -3473,6 +5013,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/umzug": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", + "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==", + "dev": true, + "dependencies": { + "bluebird": "^3.7.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -3488,6 +5040,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3497,6 +5071,38 @@ "punycode": "^2.1.0" } }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vite": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", @@ -3646,12 +5252,104 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/client-side/client/package.json b/client-side/client/package.json index a23cbc4..1891634 100644 --- a/client-side/client/package.json +++ b/client-side/client/package.json @@ -11,7 +11,8 @@ }, "dependencies": { "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "sequelize": "^6.37.1" }, "devDependencies": { "@types/react": "^18.2.64", @@ -21,6 +22,7 @@ "eslint-plugin-react": "^7.34.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", + "sequelize-cli": "^6.6.2", "vite": "^5.1.6" } } diff --git a/server/config/config.json b/server/config/config.json index 0f858c6..c770d33 100644 --- a/server/config/config.json +++ b/server/config/config.json @@ -1,23 +1,21 @@ { "development": { - "username": "root", - "password": null, - "database": "database_development", + "username": "postgres", + "password": "postgres", + "database": "Individual_Project", "host": "127.0.0.1", - "dialect": "mysql" + "dialect": "postgres", + "logging": false }, "test": { - "username": "root", - "password": null, + "username": "postgres", + "password": "postgres", "database": "database_test", "host": "127.0.0.1", - "dialect": "mysql" + "dialect": "postgres", + "logging": false }, "production": { - "username": "root", - "password": null, - "database": "database_production", - "host": "127.0.0.1", - "dialect": "mysql" + "use_env_variable" : "DATABASE_URL" } } diff --git a/server/middlewares/bcrypt.js b/server/middlewares/bcrypt.js new file mode 100644 index 0000000..7045855 --- /dev/null +++ b/server/middlewares/bcrypt.js @@ -0,0 +1,6 @@ +const bcrypt = require('bcryptjs') + +module.exports = { + hashPasswd: (password) => bcrypt.hashSync(password, 10), + comparepaswd: (password) => bcrypt.compareSync(password, this.hashPasswd) +} \ No newline at end of file diff --git a/server/migrations/20240313073852-create-user.js b/server/migrations/20240313073852-create-user.js new file mode 100644 index 0000000..c6dc914 --- /dev/null +++ b/server/migrations/20240313073852-create-user.js @@ -0,0 +1,54 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Users', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + username: { + type: Sequelize.STRING, + unique: { + args: true, + msg: 'username has been taken' + } + }, + email: { + type: Sequelize.STRING, + unique: { + args: true, + msg: 'Email has been registered' + }, + allowNull: false, + validate: { + notNull: { msg: 'Email is required' }, + notEmpty: { msg: 'Email is required' }, + isEmail: { msg: 'Email must be correct' } + } + }, + password: { + type: Sequelize.STRING, + allowNull: false, + validate: { + len: 8, + notNull: { msg: 'Password is required' }, + notEmpty: { msg: 'Password is required' } + }, + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Users'); + } +}; \ No newline at end of file diff --git a/server/migrations/20240313090416-create-tag.js b/server/migrations/20240313090416-create-tag.js new file mode 100644 index 0000000..a8a3efa --- /dev/null +++ b/server/migrations/20240313090416-create-tag.js @@ -0,0 +1,34 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Tags', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + title: { + type: Sequelize.STRING, + allowNull: false, + unique: true, + validate: { + notNull: { msg: 'Title is required' }, + notEmpty: { msg: 'Title is required' } + } + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Tags'); + } +}; \ No newline at end of file diff --git a/server/migrations/20240313090525-create-content.js b/server/migrations/20240313090525-create-content.js new file mode 100644 index 0000000..697f8cf --- /dev/null +++ b/server/migrations/20240313090525-create-content.js @@ -0,0 +1,53 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Contents', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + title: { + type: Sequelize.STRING, + allowNull: false, + validate: { + notNull: { msg: 'Title is required' }, + notEmpty: { msg: 'Title is required' } + } + }, + UserId: { + type: Sequelize.INTEGER, + references: { + model: 'Users' + } + }, + description: { + type: Sequelize.TEXT, + allowNull: false, + validate: { + notNull: { msg: 'Please fill description' }, + notEmpty: { msg: 'Please fill description' } + } + }, + TagId: { + type: Sequelize.INTEGER, + references: { + model: 'Tags' + } + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Contents'); + } +}; \ No newline at end of file diff --git a/server/models/content.js b/server/models/content.js new file mode 100644 index 0000000..e0c0069 --- /dev/null +++ b/server/models/content.js @@ -0,0 +1,26 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Content extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + } + Content.init({ + title: DataTypes.STRING, + UserId: DataTypes.STRING, + description: DataTypes.TEXT, + TagId: DataTypes.STRING + }, { + sequelize, + modelName: 'Content', + }); + return Content; +}; \ No newline at end of file diff --git a/server/models/tag.js b/server/models/tag.js new file mode 100644 index 0000000..b2405ca --- /dev/null +++ b/server/models/tag.js @@ -0,0 +1,23 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Tag extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + } + Tag.init({ + title: DataTypes.STRING + }, { + sequelize, + modelName: 'Tag', + }); + return Tag; +}; \ No newline at end of file diff --git a/server/models/user.js b/server/models/user.js new file mode 100644 index 0000000..634ba24 --- /dev/null +++ b/server/models/user.js @@ -0,0 +1,25 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class User extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + } + User.init({ + username: DataTypes.STRING, + email: DataTypes.STRING, + password: DataTypes.STRING + }, { + sequelize, + modelName: 'User', + }); + return User; +}; \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index d7e1e79..4aeeac4 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -5,947 +5,3747 @@ "packages": { "": { "dependencies": { + "bcryptjs": "^2.4.3", + "dotenv": "^16.4.5", "express": "^4.18.3", + "jest": "^29.7.0", + "jsonwebtoken": "^9.0.2", + "nodemon": "^3.1.0", "pg": "^8.11.3", - "sequelize": "^6.37.1" + "sequelize": "^6.37.1", + "supertest": "^6.3.4" }, "devDependencies": { "sequelize-cli": "^6.6.2" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/@one-ini/wasm": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", - "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", - "dev": true - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" } }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "@types/ms": "*" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/@types/node": { - "version": "20.11.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz", - "integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==", + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "undici-types": "~5.26.4" + "color-name": "1.1.3" } }, - "node_modules/@types/validator": { - "version": "13.11.9", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", - "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=0.8.0" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" } }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, + "node_modules/@babel/core": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">=12" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6.9.0" } }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { - "balanced-match": "^1.0.0" + "yallist": "^3.0.2" } }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "engines": { - "node": ">=4" + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { - "node": ">= 0.8" + "node": ">=6.9.0" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/cli-color": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", - "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", - "dev": true, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.64", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.15", - "timers-ext": "^0.1.7" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=0.10" + "node": ">=6.9.0" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "@babel/types": "^7.22.15" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "ansi-regex": "^5.0.1" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dependencies": { - "color-name": "~1.1.4" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" } }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "safe-buffer": "5.2.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/content-type": { + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { - "node": ">= 0.6" + "node": ">=0.8.0" } }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">= 0.6" + "node": ">=6.0.0" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "dev": true, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=0.12" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dependencies": { - "ms": "2.0.0" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "@babel/helper-plugin-utils": "^7.10.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/dottie": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", - "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", - "dev": true, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dependencies": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "9.0.1", - "semver": "^7.5.3" + "@babel/helper-plugin-utils": "^7.10.4" }, - "bin": { - "editorconfig": "bin/editorconfig" - }, - "engines": { - "node": ">=14" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dependencies": { - "get-intrinsic": "^1.2.4" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "dev": true, - "hasInstallScript": true, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=0.10" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dev": true, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "dev": true, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=0.12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "dev": true, + "node_modules/@babel/traverse": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { - "node": ">=0.10" + "node": ">=6.9.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">= 0.6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/event-emitter": { + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@jest/reporters/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" + "type-detect": "4.0.8" } }, - "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "20.11.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz", + "integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "node_modules/@types/validator": { + "version": "13.11.9", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", + "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "node_modules/cli-color": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", + "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.64", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dev": true, + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.701", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.701.tgz", + "integrity": "sha512-K3WPQ36bUOtXg/1+69bFlFOvdSm0/0bGqmsfPDLRXLanoKXdA+pIWuf/VbA9b+2CwBFuONgl4NEz4OEm+OJOKA==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dev": true, + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", + "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/jest-cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.10.0" + "node": "*" } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dev": true, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { - "type": "^2.7.2" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "detect-newline": "^3.0.0" }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, "engines": { - "node": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "engines": { - "node": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "engines": { + "node": ">=6" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dependencies": { - "get-intrinsic": "^1.1.3" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dependencies": { - "es-define-property": "^1.0.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">= 0.4" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "function-bind": "^1.1.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" + "node": "*" } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inflection": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", - "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", - "engines": [ - "node >= 0.4.0" - ] - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, "engines": { - "node": ">= 0.10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dependencies": { - "hasown": "^2.0.0" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/js-beautify": { @@ -978,6 +3778,50 @@ "node": ">=14" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -990,11 +3834,123 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -1015,6 +3971,28 @@ "es5-ext": "~0.10.2" } }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1044,6 +4022,11 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -1052,6 +4035,18 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -1082,6 +4077,14 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, "node_modules/minimatch": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", @@ -1130,6 +4133,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -1144,6 +4152,84 @@ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/nodemon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", + "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/nopt": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", @@ -1159,6 +4245,25 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -1178,11 +4283,97 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/packet-reader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1191,11 +4382,26 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -1203,8 +4409,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.10.1", @@ -1319,6 +4524,41 @@ "split2": "^4.1.0" } }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -1354,6 +4594,42 @@ "node": ">=0.10.0" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -1372,6 +4648,26 @@ "node": ">= 0.10" } }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -1399,20 +4695,35 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8.10.0" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1421,7 +4732,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -1434,6 +4744,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "engines": { + "node": ">=10" + } + }, "node_modules/retry-as-promised": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", @@ -1656,7 +4993,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -1668,7 +5004,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -1702,6 +5037,47 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -1710,6 +5086,22 @@ "node": ">= 10.x" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -1718,6 +5110,37 @@ "node": ">= 0.8" } }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -1814,11 +5237,112 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/supertest": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", + "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.1.2" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -1826,6 +5350,58 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -1836,6 +5412,30 @@ "next-tick": "1" } }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1849,12 +5449,61 @@ "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/type": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", "dev": true }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -1879,6 +5528,11 @@ "node": ">=6.0.0" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -1901,6 +5555,35 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -1917,6 +5600,19 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/validator": { "version": "13.11.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", @@ -1933,11 +5629,18 @@ "node": ">= 0.8" } }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -2047,6 +5750,28 @@ "node": ">=8" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -2059,7 +5784,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -2136,6 +5860,17 @@ "engines": { "node": ">=8" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/server/package.json b/server/package.json index b9c585a..aaaea3f 100644 --- a/server/package.json +++ b/server/package.json @@ -1,8 +1,14 @@ { "dependencies": { + "bcryptjs": "^2.4.3", + "dotenv": "^16.4.5", "express": "^4.18.3", + "jest": "^29.7.0", + "jsonwebtoken": "^9.0.2", + "nodemon": "^3.1.0", "pg": "^8.11.3", - "sequelize": "^6.37.1" + "sequelize": "^6.37.1", + "supertest": "^6.3.4" }, "devDependencies": { "sequelize-cli": "^6.6.2" diff --git a/server/seeders/20240313075506-seed-user.js b/server/seeders/20240313075506-seed-user.js new file mode 100644 index 0000000..9d0c7c3 --- /dev/null +++ b/server/seeders/20240313075506-seed-user.js @@ -0,0 +1,44 @@ +'use strict'; + +const { hashPasswd } = require('../middlewares/bcrypt'); + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + await queryInterface.bulkInsert('Users', [ + { + username: 'admin', + email: 'admin@mail.com', + password: hashPasswd('123456'), + createdAt: new Date(), + updatedAt: new Date() + }, + { + username: 'user', + email: 'user@mail.com', + password: hashPasswd('123456'), + createdAt: new Date(), + updatedAt: new Date() + }, + ]) + }, + + async down(queryInterface, Sequelize) { + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + await queryInterface.bulkDelete('Users') + } +}; From 8e58524372aedd31f870a02442cb2e3c9e5b979a Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Wed, 13 Mar 2024 16:44:50 +0700 Subject: [PATCH 04/48] setup app and routes --- server/app.js | 12 +++++ server/controllers/authController.js | 11 ++++ server/middlewares/errorHandler.js | 0 .../20240313090525-create-content.js | 6 --- .../20240313093156-create-conten-tag.js | 37 +++++++++++++ server/models/contentag.js | 24 +++++++++ server/routes/auth.js | 8 +++ server/routes/index.js | 12 +++++ server/routes/pub.js | 6 +++ server/seeders/20240313092054-seed-Tag.js | 53 +++++++++++++++++++ 10 files changed, 163 insertions(+), 6 deletions(-) create mode 100644 server/app.js create mode 100644 server/controllers/authController.js create mode 100644 server/middlewares/errorHandler.js create mode 100644 server/migrations/20240313093156-create-conten-tag.js create mode 100644 server/models/contentag.js create mode 100644 server/routes/auth.js create mode 100644 server/routes/index.js create mode 100644 server/routes/pub.js create mode 100644 server/seeders/20240313092054-seed-Tag.js diff --git a/server/app.js b/server/app.js new file mode 100644 index 0000000..75f6d7e --- /dev/null +++ b/server/app.js @@ -0,0 +1,12 @@ +const express = require('express') +const router = require('./routes') +const app = express() +const port = 3000 + +app.use(express.urlencoded({extended: true})) +app.use(express.json()) +app.use(router) + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`) +}) \ No newline at end of file diff --git a/server/controllers/authController.js b/server/controllers/authController.js new file mode 100644 index 0000000..afd5d01 --- /dev/null +++ b/server/controllers/authController.js @@ -0,0 +1,11 @@ +const { User } = require('../models') + +module.exports = class Controller { + static async register(req, res, next){ + try { + + } catch (error) { + + } + } +} \ No newline at end of file diff --git a/server/middlewares/errorHandler.js b/server/middlewares/errorHandler.js new file mode 100644 index 0000000..e69de29 diff --git a/server/migrations/20240313090525-create-content.js b/server/migrations/20240313090525-create-content.js index 697f8cf..36c9b5f 100644 --- a/server/migrations/20240313090525-create-content.js +++ b/server/migrations/20240313090525-create-content.js @@ -31,12 +31,6 @@ module.exports = { notEmpty: { msg: 'Please fill description' } } }, - TagId: { - type: Sequelize.INTEGER, - references: { - model: 'Tags' - } - }, createdAt: { allowNull: false, type: Sequelize.DATE diff --git a/server/migrations/20240313093156-create-conten-tag.js b/server/migrations/20240313093156-create-conten-tag.js new file mode 100644 index 0000000..bb6b870 --- /dev/null +++ b/server/migrations/20240313093156-create-conten-tag.js @@ -0,0 +1,37 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('ContenTags', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + ContentId: { + type: Sequelize.INTEGER, + references: { + model: 'Contents' + } + }, + TagId: { + type: Sequelize.INTEGER, + references: { + model: 'Tags' + } + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('ContenTags'); + } +}; \ No newline at end of file diff --git a/server/models/contentag.js b/server/models/contentag.js new file mode 100644 index 0000000..6911109 --- /dev/null +++ b/server/models/contentag.js @@ -0,0 +1,24 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class ContenTag extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + } + ContenTag.init({ + ContentId: DataTypes.INTEGER, + TagId: DataTypes.INTEGER + }, { + sequelize, + modelName: 'ContenTag', + }); + return ContenTag; +}; \ No newline at end of file diff --git a/server/routes/auth.js b/server/routes/auth.js new file mode 100644 index 0000000..a6d9db6 --- /dev/null +++ b/server/routes/auth.js @@ -0,0 +1,8 @@ +const express = require('express') +const { register } = require('../controllers/authController') +const router = express.Router() + +router.get('/register', register) +router.get('/login') + +module.exports = router \ No newline at end of file diff --git a/server/routes/index.js b/server/routes/index.js new file mode 100644 index 0000000..c927263 --- /dev/null +++ b/server/routes/index.js @@ -0,0 +1,12 @@ +const express = require('express') +const router = express.Router() + +router.get('/', (req, res) => { + res.status(200).json({ message: 'Server success' }) +}) + +router.use('/auth', require('./auth')) +router.use('/auth', require('./pub')) + + +module.exports = router \ No newline at end of file diff --git a/server/routes/pub.js b/server/routes/pub.js new file mode 100644 index 0000000..3014387 --- /dev/null +++ b/server/routes/pub.js @@ -0,0 +1,6 @@ +const express = require('express') +const router = express.Router() + +router.get('/') + +module.exports = router \ No newline at end of file diff --git a/server/seeders/20240313092054-seed-Tag.js b/server/seeders/20240313092054-seed-Tag.js new file mode 100644 index 0000000..2e5b152 --- /dev/null +++ b/server/seeders/20240313092054-seed-Tag.js @@ -0,0 +1,53 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + await queryInterface.bulkInsert('Tags', [ + { + title: "Tafsir of the Qur'an", + createdAt: new Date(), + updatedAt: new Date() + }, + { + title: 'Fiqh', + createdAt: new Date(), + updatedAt: new Date() + }, + { + title: 'Akhlaq', + createdAt: new Date(), + updatedAt: new Date() + }, + { + title: 'Aqidah', + createdAt: new Date(), + updatedAt: new Date() + }, + { + title: 'Hadith', + createdAt: new Date(), + updatedAt: new Date() + } + ]) + }, + + async down(queryInterface, Sequelize) { + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + await queryInterface.bulkDelete('Tags') + } +}; From d98d07bd0a1c23d4f6af88a5781b1d415a4cafa4 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Wed, 13 Mar 2024 17:43:54 +0700 Subject: [PATCH 05/48] feat routes register and login --- server/controllers/authController.js | 43 +++++++++++++++++++++-- server/{middlewares => helpers}/bcrypt.js | 0 server/helpers/jwt.js | 14 ++++++++ server/middlewares/errorHandler.js | 11 ++++++ server/models/content.js | 11 +++++- server/models/contentag.js | 2 ++ server/models/tag.js | 1 + server/models/user.js | 7 ++++ server/routes/auth.js | 4 +-- server/routes/index.js | 3 ++ 10 files changed, 90 insertions(+), 6 deletions(-) rename server/{middlewares => helpers}/bcrypt.js (100%) create mode 100644 server/helpers/jwt.js diff --git a/server/controllers/authController.js b/server/controllers/authController.js index afd5d01..c32c9be 100644 --- a/server/controllers/authController.js +++ b/server/controllers/authController.js @@ -1,11 +1,48 @@ +const { comparepaswd } = require('../helpers/bcrypt') +const { signToken } = require('../helpers/jwt') const { User } = require('../models') module.exports = class Controller { - static async register(req, res, next){ + static async register(req, res, next) { try { - + const { username, email, password } = req.body + + await User.create({ username, email, password }) + + res.status(201).json({ + username, + email + }) + } catch (error) { + console.log(error) + next(error) + } + } + + static async login(req, res, next) { + try { + const { email, password } = req.body + + if (!email) throw { status: 400, message: 'Email is required' } + if (!password) throw { status: 400, message: 'Password is required' } + + let user = await User.findOne({ + where: { + email + } + }) + + if (!user || !comparepaswd(password, user.password)) { + throw { status: 401, message: 'Invalid email or password' } + } + + let token = signToken({ + id: user.id + }) + + res.status(200).json({ access_token: token }) } catch (error) { - + next(error) } } } \ No newline at end of file diff --git a/server/middlewares/bcrypt.js b/server/helpers/bcrypt.js similarity index 100% rename from server/middlewares/bcrypt.js rename to server/helpers/bcrypt.js diff --git a/server/helpers/jwt.js b/server/helpers/jwt.js new file mode 100644 index 0000000..4f098ad --- /dev/null +++ b/server/helpers/jwt.js @@ -0,0 +1,14 @@ +const jwt = require('jsonwebtoken') +const secret = 'rahasia' + +function signToken(payload){ + return jwt.sign(payload, secret) +} + +function verifyToken(payload){ + return jwt.verify(payload, secret) +} + +module.exports = { + signToken, verifyToken +} \ No newline at end of file diff --git a/server/middlewares/errorHandler.js b/server/middlewares/errorHandler.js index e69de29..f5fb5d3 100644 --- a/server/middlewares/errorHandler.js +++ b/server/middlewares/errorHandler.js @@ -0,0 +1,11 @@ +module.exports = (error, req, res, next) => { + const status = error.status || 500 + const message = error.message || 'Internal server error' + + switch(error){ + case 'SequelizeValidationError': + case 'SequelizeUniqueConstraintError': + status = 400 + message = error.errors[0],message + } +} \ No newline at end of file diff --git a/server/models/content.js b/server/models/content.js index e0c0069..7d38372 100644 --- a/server/models/content.js +++ b/server/models/content.js @@ -11,10 +11,19 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Content.belongsTo(models.User) + Content.hasMany(models.Tag, {through: 'ContenTag'}) } } Content.init({ - title: DataTypes.STRING, + title: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notNull: {msg: 'Title is required'}, + notEmpty: {msg: 'Title is required'} + } + }, UserId: DataTypes.STRING, description: DataTypes.TEXT, TagId: DataTypes.STRING diff --git a/server/models/contentag.js b/server/models/contentag.js index 6911109..89e8b12 100644 --- a/server/models/contentag.js +++ b/server/models/contentag.js @@ -11,6 +11,8 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + ContenTag.belongsToMany(models.Content, { foreignKey: 'ContentId' }) + ContenTag.belongsToMany(models.Tag, { foreignKey: 'TagId' }) } } ContenTag.init({ diff --git a/server/models/tag.js b/server/models/tag.js index b2405ca..83334fc 100644 --- a/server/models/tag.js +++ b/server/models/tag.js @@ -11,6 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Tag.hasMany(models.Content, {through: 'ContenTag'}) } } Tag.init({ diff --git a/server/models/user.js b/server/models/user.js index 634ba24..4f39035 100644 --- a/server/models/user.js +++ b/server/models/user.js @@ -2,6 +2,7 @@ const { Model } = require('sequelize'); +const { hashPasswd } = require('../middlewares/bcrypt'); module.exports = (sequelize, DataTypes) => { class User extends Model { /** @@ -11,6 +12,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + User.hasMany(models.Content) } } User.init({ @@ -20,6 +22,11 @@ module.exports = (sequelize, DataTypes) => { }, { sequelize, modelName: 'User', + hooks: { + beforeCreate: (user, options) => { + user.password = hashPasswd(user.password) + } + } }); return User; }; \ No newline at end of file diff --git a/server/routes/auth.js b/server/routes/auth.js index a6d9db6..5a00b83 100644 --- a/server/routes/auth.js +++ b/server/routes/auth.js @@ -1,8 +1,8 @@ const express = require('express') -const { register } = require('../controllers/authController') +const { register, login } = require('../controllers/authController') const router = express.Router() router.get('/register', register) -router.get('/login') +router.get('/login', login) module.exports = router \ No newline at end of file diff --git a/server/routes/index.js b/server/routes/index.js index c927263..5e44449 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -1,4 +1,5 @@ const express = require('express') +const errorHandler = require('../middlewares/errorHandler') const router = express.Router() router.get('/', (req, res) => { @@ -9,4 +10,6 @@ router.use('/auth', require('./auth')) router.use('/auth', require('./pub')) +router.use(errorHandler) + module.exports = router \ No newline at end of file From a15e16142dbe56599287e12b4ad87529934690e5 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Wed, 13 Mar 2024 17:55:39 +0700 Subject: [PATCH 06/48] feat: authentication & getContent --- server/controllers/contentController.js | 17 +++++++++++++++ server/middlewares/authenticate.js | 28 +++++++++++++++++++++++++ server/routes/content.js | 6 ++++++ server/routes/index.js | 7 ++++++- server/routes/tag.js | 6 ++++++ 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 server/controllers/contentController.js create mode 100644 server/middlewares/authenticate.js create mode 100644 server/routes/content.js create mode 100644 server/routes/tag.js diff --git a/server/controllers/contentController.js b/server/controllers/contentController.js new file mode 100644 index 0000000..5dccaae --- /dev/null +++ b/server/controllers/contentController.js @@ -0,0 +1,17 @@ +const { Content } = require('../models') + +module.exports = class Controller{ + static async getContent(req, res, next){ + try { + let content = await Content.findAll({ + include: { + model: 'Tags' + } + }) + + res.status(200).json(content) + } catch (error) { + next(error) + } + } +} \ No newline at end of file diff --git a/server/middlewares/authenticate.js b/server/middlewares/authenticate.js new file mode 100644 index 0000000..cdb384d --- /dev/null +++ b/server/middlewares/authenticate.js @@ -0,0 +1,28 @@ +const { verifyToken } = require('../helpers/jwt') +const { User } = require('../models') + +module.exports = { + async authentication(req, res, next) { + try { + let access_token = req.headers.authorization + if (!access_token) throw { name: 'Unauthenticated' } + + let [type, token] = access_token.split(' ') + if(type !== 'Bearer') throw { name: 'Unauthenticated' } + + let payload = verifyToken(token) + + let user = await User.findByPk(payload.id) + + if(!user) throw { name: 'Unauthenticated' } + + req.user = { + id: user.id + } + + next() + } catch (error) { + next(error) + } + } +} \ No newline at end of file diff --git a/server/routes/content.js b/server/routes/content.js new file mode 100644 index 0000000..3014387 --- /dev/null +++ b/server/routes/content.js @@ -0,0 +1,6 @@ +const express = require('express') +const router = express.Router() + +router.get('/') + +module.exports = router \ No newline at end of file diff --git a/server/routes/index.js b/server/routes/index.js index 5e44449..c30bf2b 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -1,5 +1,6 @@ const express = require('express') const errorHandler = require('../middlewares/errorHandler') +const { authentication } = require('../middlewares/authenticate') const router = express.Router() router.get('/', (req, res) => { @@ -7,8 +8,12 @@ router.get('/', (req, res) => { }) router.use('/auth', require('./auth')) -router.use('/auth', require('./pub')) +router.use('/pub', require('./pub')) +router.use(authentication) + +router.use('/content', require('./content')) +router.use('/tag', require('./tag')) router.use(errorHandler) diff --git a/server/routes/tag.js b/server/routes/tag.js new file mode 100644 index 0000000..3014387 --- /dev/null +++ b/server/routes/tag.js @@ -0,0 +1,6 @@ +const express = require('express') +const router = express.Router() + +router.get('/') + +module.exports = router \ No newline at end of file From 501483ceba72fd9049c4e5554aa4c6b66afaf358 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Wed, 13 Mar 2024 20:34:08 +0700 Subject: [PATCH 07/48] stuck at association --- server/controllers/authController.js | 2 +- server/controllers/contentController.js | 10 ++++++---- server/{helpers => middlewares}/bcrypt.js | 0 server/models/content.js | 10 ++++++---- server/models/contentag.js | 12 ++++++------ server/models/tag.js | 4 +++- server/routes/content.js | 3 ++- server/routes/index.js | 2 +- 8 files changed, 25 insertions(+), 18 deletions(-) rename server/{helpers => middlewares}/bcrypt.js (100%) diff --git a/server/controllers/authController.js b/server/controllers/authController.js index c32c9be..897fc35 100644 --- a/server/controllers/authController.js +++ b/server/controllers/authController.js @@ -1,4 +1,4 @@ -const { comparepaswd } = require('../helpers/bcrypt') +const { comparepaswd } = require('../middlewares/bcrypt') const { signToken } = require('../helpers/jwt') const { User } = require('../models') diff --git a/server/controllers/contentController.js b/server/controllers/contentController.js index 5dccaae..0be3483 100644 --- a/server/controllers/contentController.js +++ b/server/controllers/contentController.js @@ -1,16 +1,18 @@ -const { Content } = require('../models') +const { Content, Tag, ContentTag } = require('../models') module.exports = class Controller{ static async getContent(req, res, next){ try { let content = await Content.findAll({ - include: { - model: 'Tags' - } + include: [{ + model: Tag, + through: ContentTag + }] }) res.status(200).json(content) } catch (error) { + console.log(error) next(error) } } diff --git a/server/helpers/bcrypt.js b/server/middlewares/bcrypt.js similarity index 100% rename from server/helpers/bcrypt.js rename to server/middlewares/bcrypt.js diff --git a/server/models/content.js b/server/models/content.js index 7d38372..4112ada 100644 --- a/server/models/content.js +++ b/server/models/content.js @@ -11,8 +11,10 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Content.belongsTo(models.User) - Content.hasMany(models.Tag, {through: 'ContenTag'}) + Content.belongsTo(models.User); + Content.belongsToMany(models.Tag, { + through: models.ContentTag + }); } } Content.init({ @@ -20,8 +22,8 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.STRING, allowNull: false, validate: { - notNull: {msg: 'Title is required'}, - notEmpty: {msg: 'Title is required'} + notNull: { msg: 'Title is required' }, + notEmpty: { msg: 'Title is required' } } }, UserId: DataTypes.STRING, diff --git a/server/models/contentag.js b/server/models/contentag.js index 89e8b12..dedecc9 100644 --- a/server/models/contentag.js +++ b/server/models/contentag.js @@ -3,7 +3,7 @@ const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { - class ContenTag extends Model { + class ContentTag extends Model { /** * Helper method for defining associations. * This method is not a part of Sequelize lifecycle. @@ -11,16 +11,16 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - ContenTag.belongsToMany(models.Content, { foreignKey: 'ContentId' }) - ContenTag.belongsToMany(models.Tag, { foreignKey: 'TagId' }) + ContentTag.belongsTo(models.Content, { foreignKey: 'ContentId' }); + ContentTag.belongsTo(models.Tag, { foreignKey: 'TagId' }); } } - ContenTag.init({ + ContentTag.init({ ContentId: DataTypes.INTEGER, TagId: DataTypes.INTEGER }, { sequelize, - modelName: 'ContenTag', + modelName: 'ContentTag', }); - return ContenTag; + return ContentTag; }; \ No newline at end of file diff --git a/server/models/tag.js b/server/models/tag.js index 83334fc..8624f41 100644 --- a/server/models/tag.js +++ b/server/models/tag.js @@ -11,7 +11,9 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Tag.hasMany(models.Content, {through: 'ContenTag'}) + Tag.belongsToMany(models.Content, { + through: models.ContentTag + }); } } Tag.init({ diff --git a/server/routes/content.js b/server/routes/content.js index 3014387..786c3c5 100644 --- a/server/routes/content.js +++ b/server/routes/content.js @@ -1,6 +1,7 @@ const express = require('express') +const { getContent } = require('../controllers/contentController') const router = express.Router() -router.get('/') +router.get('/', getContent) module.exports = router \ No newline at end of file diff --git a/server/routes/index.js b/server/routes/index.js index c30bf2b..9b23a01 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -10,7 +10,7 @@ router.get('/', (req, res) => { router.use('/auth', require('./auth')) router.use('/pub', require('./pub')) -router.use(authentication) +// router.use(authentication) router.use('/content', require('./content')) router.use('/tag', require('./tag')) From 1f500486a7e3c6c70e9e03ed9c921c401d9a7747 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 04:48:31 +0700 Subject: [PATCH 08/48] refactor migration & association --- server/config/config.json | 2 +- server/controllers/contentController.js | 12 ++--- ...-user.js => 20240313212310-create-user.js} | 0 ...nt.js => 20240313212326-create-content.js} | 12 ++--- ...te-tag.js => 20240313212342-create-tag.js} | 6 +-- ...s => 20240313212404-create-content-tag.js} | 4 +- server/models/content.js | 16 ++---- server/models/{contentag.js => contenttag.js} | 4 +- server/models/tag.js | 4 +- server/models/user.js | 6 --- server/seeders/20240313075506-seed-user.js | 44 --------------- server/seeders/20240313092054-seed-Tag.js | 53 ------------------- server/seeders/20240313205831-seed-user.js | 43 +++++++++++++++ server/seeders/20240313205840-seed-content.js | 35 ++++++++++++ server/seeders/20240313205848-seed-tag.js | 53 +++++++++++++++++++ 15 files changed, 157 insertions(+), 137 deletions(-) rename server/migrations/{20240313073852-create-user.js => 20240313212310-create-user.js} (100%) rename server/migrations/{20240313090525-create-content.js => 20240313212326-create-content.js} (100%) rename server/migrations/{20240313090416-create-tag.js => 20240313212342-create-tag.js} (85%) rename server/migrations/{20240313093156-create-conten-tag.js => 20240313212404-create-content-tag.js} (87%) rename server/models/{contentag.js => contenttag.js} (89%) delete mode 100644 server/seeders/20240313075506-seed-user.js delete mode 100644 server/seeders/20240313092054-seed-Tag.js create mode 100644 server/seeders/20240313205831-seed-user.js create mode 100644 server/seeders/20240313205840-seed-content.js create mode 100644 server/seeders/20240313205848-seed-tag.js diff --git a/server/config/config.json b/server/config/config.json index c770d33..f01ac62 100644 --- a/server/config/config.json +++ b/server/config/config.json @@ -18,4 +18,4 @@ "production": { "use_env_variable" : "DATABASE_URL" } -} +} \ No newline at end of file diff --git a/server/controllers/contentController.js b/server/controllers/contentController.js index 0be3483..96d30d5 100644 --- a/server/controllers/contentController.js +++ b/server/controllers/contentController.js @@ -3,12 +3,12 @@ const { Content, Tag, ContentTag } = require('../models') module.exports = class Controller{ static async getContent(req, res, next){ try { - let content = await Content.findAll({ - include: [{ - model: Tag, - through: ContentTag - }] - }) + let content = await Content.findAll({ + include: { + model: Tag, + // through: ContentTag + } + }) res.status(200).json(content) } catch (error) { diff --git a/server/migrations/20240313073852-create-user.js b/server/migrations/20240313212310-create-user.js similarity index 100% rename from server/migrations/20240313073852-create-user.js rename to server/migrations/20240313212310-create-user.js diff --git a/server/migrations/20240313090525-create-content.js b/server/migrations/20240313212326-create-content.js similarity index 100% rename from server/migrations/20240313090525-create-content.js rename to server/migrations/20240313212326-create-content.js index 36c9b5f..9f08c8d 100644 --- a/server/migrations/20240313090525-create-content.js +++ b/server/migrations/20240313212326-create-content.js @@ -17,12 +17,6 @@ module.exports = { notEmpty: { msg: 'Title is required' } } }, - UserId: { - type: Sequelize.INTEGER, - references: { - model: 'Users' - } - }, description: { type: Sequelize.TEXT, allowNull: false, @@ -31,6 +25,12 @@ module.exports = { notEmpty: { msg: 'Please fill description' } } }, + UserId: { + type: Sequelize.INTEGER, + references: { + model: 'Users' + } + }, createdAt: { allowNull: false, type: Sequelize.DATE diff --git a/server/migrations/20240313090416-create-tag.js b/server/migrations/20240313212342-create-tag.js similarity index 85% rename from server/migrations/20240313090416-create-tag.js rename to server/migrations/20240313212342-create-tag.js index a8a3efa..dc3469c 100644 --- a/server/migrations/20240313090416-create-tag.js +++ b/server/migrations/20240313212342-create-tag.js @@ -9,13 +9,13 @@ module.exports = { primaryKey: true, type: Sequelize.INTEGER }, - title: { + name: { type: Sequelize.STRING, allowNull: false, unique: true, validate: { - notNull: { msg: 'Title is required' }, - notEmpty: { msg: 'Title is required' } + notNull: { msg: 'Name tag is required' }, + notEmpty: { msg: 'Name tag is required' } } }, createdAt: { diff --git a/server/migrations/20240313093156-create-conten-tag.js b/server/migrations/20240313212404-create-content-tag.js similarity index 87% rename from server/migrations/20240313093156-create-conten-tag.js rename to server/migrations/20240313212404-create-content-tag.js index bb6b870..00509b3 100644 --- a/server/migrations/20240313093156-create-conten-tag.js +++ b/server/migrations/20240313212404-create-content-tag.js @@ -2,7 +2,7 @@ /** @type {import('sequelize-cli').Migration} */ module.exports = { async up(queryInterface, Sequelize) { - await queryInterface.createTable('ContenTags', { + await queryInterface.createTable('ContentTags', { id: { allowNull: false, autoIncrement: true, @@ -32,6 +32,6 @@ module.exports = { }); }, async down(queryInterface, Sequelize) { - await queryInterface.dropTable('ContenTags'); + await queryInterface.dropTable('ContentTags'); } }; \ No newline at end of file diff --git a/server/models/content.js b/server/models/content.js index 4112ada..f5d93d0 100644 --- a/server/models/content.js +++ b/server/models/content.js @@ -11,24 +11,16 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Content.belongsTo(models.User); + Content.belongsTo(models.User) Content.belongsToMany(models.Tag, { through: models.ContentTag - }); + }) } } Content.init({ - title: { - type: DataTypes.STRING, - allowNull: false, - validate: { - notNull: { msg: 'Title is required' }, - notEmpty: { msg: 'Title is required' } - } - }, - UserId: DataTypes.STRING, + title: DataTypes.STRING, description: DataTypes.TEXT, - TagId: DataTypes.STRING + UserId: DataTypes.INTEGER }, { sequelize, modelName: 'Content', diff --git a/server/models/contentag.js b/server/models/contenttag.js similarity index 89% rename from server/models/contentag.js rename to server/models/contenttag.js index dedecc9..362ba61 100644 --- a/server/models/contentag.js +++ b/server/models/contenttag.js @@ -11,8 +11,8 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - ContentTag.belongsTo(models.Content, { foreignKey: 'ContentId' }); - ContentTag.belongsTo(models.Tag, { foreignKey: 'TagId' }); + ContentTag.belongsTo(models.Content, { foreignKey: 'ContentId' }) + ContentTag.belongsTo(models.Tag, { foreignKey: 'TagId' }) } } ContentTag.init({ diff --git a/server/models/tag.js b/server/models/tag.js index 8624f41..0a3dbcc 100644 --- a/server/models/tag.js +++ b/server/models/tag.js @@ -13,11 +13,11 @@ module.exports = (sequelize, DataTypes) => { // define association here Tag.belongsToMany(models.Content, { through: models.ContentTag - }); + }) } } Tag.init({ - title: DataTypes.STRING + name: DataTypes.STRING }, { sequelize, modelName: 'Tag', diff --git a/server/models/user.js b/server/models/user.js index 4f39035..bb0c1ae 100644 --- a/server/models/user.js +++ b/server/models/user.js @@ -2,7 +2,6 @@ const { Model } = require('sequelize'); -const { hashPasswd } = require('../middlewares/bcrypt'); module.exports = (sequelize, DataTypes) => { class User extends Model { /** @@ -22,11 +21,6 @@ module.exports = (sequelize, DataTypes) => { }, { sequelize, modelName: 'User', - hooks: { - beforeCreate: (user, options) => { - user.password = hashPasswd(user.password) - } - } }); return User; }; \ No newline at end of file diff --git a/server/seeders/20240313075506-seed-user.js b/server/seeders/20240313075506-seed-user.js deleted file mode 100644 index 9d0c7c3..0000000 --- a/server/seeders/20240313075506-seed-user.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict'; - -const { hashPasswd } = require('../middlewares/bcrypt'); - -/** @type {import('sequelize-cli').Migration} */ -module.exports = { - async up(queryInterface, Sequelize) { - /** - * Add seed commands here. - * - * Example: - * await queryInterface.bulkInsert('People', [{ - * name: 'John Doe', - * isBetaMember: false - * }], {}); - */ - await queryInterface.bulkInsert('Users', [ - { - username: 'admin', - email: 'admin@mail.com', - password: hashPasswd('123456'), - createdAt: new Date(), - updatedAt: new Date() - }, - { - username: 'user', - email: 'user@mail.com', - password: hashPasswd('123456'), - createdAt: new Date(), - updatedAt: new Date() - }, - ]) - }, - - async down(queryInterface, Sequelize) { - /** - * Add commands to revert seed here. - * - * Example: - * await queryInterface.bulkDelete('People', null, {}); - */ - await queryInterface.bulkDelete('Users') - } -}; diff --git a/server/seeders/20240313092054-seed-Tag.js b/server/seeders/20240313092054-seed-Tag.js deleted file mode 100644 index 2e5b152..0000000 --- a/server/seeders/20240313092054-seed-Tag.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -/** @type {import('sequelize-cli').Migration} */ -module.exports = { - async up(queryInterface, Sequelize) { - /** - * Add seed commands here. - * - * Example: - * await queryInterface.bulkInsert('People', [{ - * name: 'John Doe', - * isBetaMember: false - * }], {}); - */ - await queryInterface.bulkInsert('Tags', [ - { - title: "Tafsir of the Qur'an", - createdAt: new Date(), - updatedAt: new Date() - }, - { - title: 'Fiqh', - createdAt: new Date(), - updatedAt: new Date() - }, - { - title: 'Akhlaq', - createdAt: new Date(), - updatedAt: new Date() - }, - { - title: 'Aqidah', - createdAt: new Date(), - updatedAt: new Date() - }, - { - title: 'Hadith', - createdAt: new Date(), - updatedAt: new Date() - } - ]) - }, - - async down(queryInterface, Sequelize) { - /** - * Add commands to revert seed here. - * - * Example: - * await queryInterface.bulkDelete('People', null, {}); - */ - await queryInterface.bulkDelete('Tags') - } -}; diff --git a/server/seeders/20240313205831-seed-user.js b/server/seeders/20240313205831-seed-user.js new file mode 100644 index 0000000..caa9a59 --- /dev/null +++ b/server/seeders/20240313205831-seed-user.js @@ -0,0 +1,43 @@ +'use strict'; + +const { hashPasswd } = require('../middlewares/bcrypt'); + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + await queryInterface.bulkInsert('Users', [ + { + username: 'admin', + email: 'admin@mail.com', + password: hashPasswd('123456'), + createdAt: new Date(), + updatedAt: new Date() + }, + { + username: 'user', + email: 'user@mail.com', + password: hashPasswd('123456'), + createdAt: new Date(), + updatedAt: new Date() + }, + ]) + }, + + async down(queryInterface, Sequelize) { + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + } +}; diff --git a/server/seeders/20240313205840-seed-content.js b/server/seeders/20240313205840-seed-content.js new file mode 100644 index 0000000..9ca81ab --- /dev/null +++ b/server/seeders/20240313205840-seed-content.js @@ -0,0 +1,35 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + await queryInterface.bulkInsert('Contents', [ + { + title: 'First education', + description: 'With the rapid times, Islamic education faces many challenges. The industrial era 4.0 and society 5.0 has shifted the development of world civilization. This research investigates the challenges of a shifting era for Islamic education. It includes aqidah and akhlaq, which must be prepared to enter the new era. These two things are guidelines that need to be prepared, especially for children as a generational advocates to fortify themselves from the currents of globalization that are not following the teachings of Islam. This research employed qualitative research with a normative approach. It used secondary sources such as books, journals, newspapers, and other documents. Those were valid. Data analysis used descriptive analysis to draw conclusions. This study found that Islamic education can adapt to the new era of society 5.0 by prioritizing critical and innovative thinking. Next, Islamic education must ensure the availability of reliable and competent human resources to strengthen the aqidah and morals of students, especially teachers and education staff.', + UserId: 1, + createdAt: new Date(), + updatedAt: new Date() + } + ]) + }, + + async down(queryInterface, Sequelize) { + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + await queryInterface.bulkDelete('Contents') + } +}; diff --git a/server/seeders/20240313205848-seed-tag.js b/server/seeders/20240313205848-seed-tag.js new file mode 100644 index 0000000..5de879b --- /dev/null +++ b/server/seeders/20240313205848-seed-tag.js @@ -0,0 +1,53 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + await queryInterface.bulkInsert('Tags', [ + { + name: "Tafsir of the Qur'an", + createdAt: new Date(), + updatedAt: new Date() + }, + { + name: 'Fiqh', + createdAt: new Date(), + updatedAt: new Date() + }, + { + name: 'Akhlaq', + createdAt: new Date(), + updatedAt: new Date() + }, + { + name: 'Aqidah', + createdAt: new Date(), + updatedAt: new Date() + }, + { + name: 'Hadith', + createdAt: new Date(), + updatedAt: new Date() + } + ]) + }, + + async down(queryInterface, Sequelize) { + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + await queryInterface.bulkDelete('Tags') + } +}; From 6c570d37eb3914029dca099ff5038ebbc64a22fa Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 08:11:03 +0700 Subject: [PATCH 09/48] refactor: data migration & seeding --- server/controllers/authController.js | 11 ++++-- server/controllers/contentController.js | 23 +++++++++++- server/{middlewares => helpers}/bcrypt.js | 0 server/middlewares/authenticate.js | 1 + server/middlewares/errorHandler.js | 16 ++++++-- .../20240313212404-create-content-tag.js | 37 ------------------- ...g.js => 20240314004808-create-category.js} | 8 ++-- ...nt.js => 20240314005241-create-content.js} | 6 +++ server/models/{tag.js => category.js} | 22 +++++++---- server/models/content.js | 27 ++++++++++---- server/models/contenttag.js | 26 ------------- server/routes/auth.js | 4 +- server/routes/content.js | 3 +- server/routes/index.js | 2 +- server/seeders/20240313205831-seed-user.js | 2 +- server/seeders/20240313205840-seed-content.js | 35 ------------------ ...tag.js => 20240314005003-seed-category.js} | 9 ++++- server/seeders/20240314005252-seed-content.js | 35 ++++++++++++++++++ 18 files changed, 133 insertions(+), 134 deletions(-) rename server/{middlewares => helpers}/bcrypt.js (100%) delete mode 100644 server/migrations/20240313212404-create-content-tag.js rename server/migrations/{20240313212342-create-tag.js => 20240314004808-create-category.js} (73%) rename server/migrations/{20240313212326-create-content.js => 20240314005241-create-content.js} (90%) rename server/models/{tag.js => category.js} (51%) delete mode 100644 server/models/contenttag.js delete mode 100644 server/seeders/20240313205840-seed-content.js rename server/seeders/{20240313205848-seed-tag.js => 20240314005003-seed-category.js} (83%) create mode 100644 server/seeders/20240314005252-seed-content.js diff --git a/server/controllers/authController.js b/server/controllers/authController.js index 897fc35..6babd62 100644 --- a/server/controllers/authController.js +++ b/server/controllers/authController.js @@ -1,4 +1,5 @@ -const { comparepaswd } = require('../middlewares/bcrypt') +const { compareSync } = require('bcryptjs') +const { comparepaswd, hashPasswd } = require('../helpers/bcrypt') const { signToken } = require('../helpers/jwt') const { User } = require('../models') @@ -21,6 +22,7 @@ module.exports = class Controller { static async login(req, res, next) { try { + // console.log(req.body) const { email, password } = req.body if (!email) throw { status: 400, message: 'Email is required' } @@ -31,17 +33,18 @@ module.exports = class Controller { email } }) - - if (!user || !comparepaswd(password, user.password)) { + console.log(user) + if (!user || !compareSync(password, user.password)) { throw { status: 401, message: 'Invalid email or password' } } let token = signToken({ id: user.id }) - + // console.log(token) res.status(200).json({ access_token: token }) } catch (error) { + // console.log(error) next(error) } } diff --git a/server/controllers/contentController.js b/server/controllers/contentController.js index 96d30d5..c463c33 100644 --- a/server/controllers/contentController.js +++ b/server/controllers/contentController.js @@ -1,11 +1,11 @@ -const { Content, Tag, ContentTag } = require('../models') +const { Content, Category } = require('../models') module.exports = class Controller{ static async getContent(req, res, next){ try { let content = await Content.findAll({ include: { - model: Tag, + model: Category, // through: ContentTag } }) @@ -16,4 +16,23 @@ module.exports = class Controller{ next(error) } } + + static async createContent(req, res, next){ + try { + const {title, description} = req.body + + // console.log(title, description) + + let newContent = await Content.create({title, description, UserId: req.user.id}, { + include: { + model: Tag + } + }) + + console.log(newContent.dataValues) + res.status(201).json(newContent) + } catch (error) { + next(error) + } + } } \ No newline at end of file diff --git a/server/middlewares/bcrypt.js b/server/helpers/bcrypt.js similarity index 100% rename from server/middlewares/bcrypt.js rename to server/helpers/bcrypt.js diff --git a/server/middlewares/authenticate.js b/server/middlewares/authenticate.js index cdb384d..c96bdc3 100644 --- a/server/middlewares/authenticate.js +++ b/server/middlewares/authenticate.js @@ -22,6 +22,7 @@ module.exports = { next() } catch (error) { + // console.log(error) next(error) } } diff --git a/server/middlewares/errorHandler.js b/server/middlewares/errorHandler.js index f5fb5d3..f765b45 100644 --- a/server/middlewares/errorHandler.js +++ b/server/middlewares/errorHandler.js @@ -1,11 +1,19 @@ module.exports = (error, req, res, next) => { - const status = error.status || 500 - const message = error.message || 'Internal server error' + let status = error.status || 500 + let message = error.message || 'Internal server error' - switch(error){ + switch(error.name){ case 'SequelizeValidationError': case 'SequelizeUniqueConstraintError': status = 400 - message = error.errors[0],message + message = error.errors[0].message + break + case 'JsonWebTokenError': + case 'Unauthenticated': + status = 401 + message = 'Invalid Token' + break } + + res.status(status).json({ message }) } \ No newline at end of file diff --git a/server/migrations/20240313212404-create-content-tag.js b/server/migrations/20240313212404-create-content-tag.js deleted file mode 100644 index 00509b3..0000000 --- a/server/migrations/20240313212404-create-content-tag.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; -/** @type {import('sequelize-cli').Migration} */ -module.exports = { - async up(queryInterface, Sequelize) { - await queryInterface.createTable('ContentTags', { - id: { - allowNull: false, - autoIncrement: true, - primaryKey: true, - type: Sequelize.INTEGER - }, - ContentId: { - type: Sequelize.INTEGER, - references: { - model: 'Contents' - } - }, - TagId: { - type: Sequelize.INTEGER, - references: { - model: 'Tags' - } - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE - } - }); - }, - async down(queryInterface, Sequelize) { - await queryInterface.dropTable('ContentTags'); - } -}; \ No newline at end of file diff --git a/server/migrations/20240313212342-create-tag.js b/server/migrations/20240314004808-create-category.js similarity index 73% rename from server/migrations/20240313212342-create-tag.js rename to server/migrations/20240314004808-create-category.js index dc3469c..efe9937 100644 --- a/server/migrations/20240313212342-create-tag.js +++ b/server/migrations/20240314004808-create-category.js @@ -2,7 +2,7 @@ /** @type {import('sequelize-cli').Migration} */ module.exports = { async up(queryInterface, Sequelize) { - await queryInterface.createTable('Tags', { + await queryInterface.createTable('Categories', { id: { allowNull: false, autoIncrement: true, @@ -14,8 +14,8 @@ module.exports = { allowNull: false, unique: true, validate: { - notNull: { msg: 'Name tag is required' }, - notEmpty: { msg: 'Name tag is required' } + notNull: { msg: 'Category name is required' }, + notEmpty: { msg: 'Category name is required' } } }, createdAt: { @@ -29,6 +29,6 @@ module.exports = { }); }, async down(queryInterface, Sequelize) { - await queryInterface.dropTable('Tags'); + await queryInterface.dropTable('Categories'); } }; \ No newline at end of file diff --git a/server/migrations/20240313212326-create-content.js b/server/migrations/20240314005241-create-content.js similarity index 90% rename from server/migrations/20240313212326-create-content.js rename to server/migrations/20240314005241-create-content.js index 9f08c8d..5241f42 100644 --- a/server/migrations/20240313212326-create-content.js +++ b/server/migrations/20240314005241-create-content.js @@ -31,6 +31,12 @@ module.exports = { model: 'Users' } }, + CategoryId: { + type: Sequelize.INTEGER, + references: { + model: 'Categories' + } + }, createdAt: { allowNull: false, type: Sequelize.DATE diff --git a/server/models/tag.js b/server/models/category.js similarity index 51% rename from server/models/tag.js rename to server/models/category.js index 0a3dbcc..5cbbafa 100644 --- a/server/models/tag.js +++ b/server/models/category.js @@ -3,7 +3,7 @@ const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { - class Tag extends Model { + class Category extends Model { /** * Helper method for defining associations. * This method is not a part of Sequelize lifecycle. @@ -11,16 +11,22 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Tag.belongsToMany(models.Content, { - through: models.ContentTag - }) + Category.hasMany(models.Content) } } - Tag.init({ - name: DataTypes.STRING + Category.init({ + name: { + type: DataTypes.STRING, + unique: true, + allowNull: false, + validate: { + notNull: { msg: 'Category name is required' }, + notEmpty: { msg: 'Category name is required' } + } + } }, { sequelize, - modelName: 'Tag', + modelName: 'Category', }); - return Tag; + return Category; }; \ No newline at end of file diff --git a/server/models/content.js b/server/models/content.js index f5d93d0..903f9af 100644 --- a/server/models/content.js +++ b/server/models/content.js @@ -11,16 +11,29 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Content.belongsTo(models.User) - Content.belongsToMany(models.Tag, { - through: models.ContentTag - }) + Content.belongsTo(models.User, { foreignKey: 'UserId' }) + Content.belongsTo(models.Category, { foreignKey: 'CategoryId' }) } } Content.init({ - title: DataTypes.STRING, - description: DataTypes.TEXT, - UserId: DataTypes.INTEGER + title: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notNull: { msg: 'Title is required' }, + notEmpty: { msg: 'Title is required' } + } + }, + description: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notNull: { msg: 'Description is required' }, + notEmpty: { msg: 'Description is required' } + } + }, + UserId: DataTypes.INTEGER, + CategoryId: DataTypes.INTEGER }, { sequelize, modelName: 'Content', diff --git a/server/models/contenttag.js b/server/models/contenttag.js deleted file mode 100644 index 362ba61..0000000 --- a/server/models/contenttag.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; -const { - Model -} = require('sequelize'); -module.exports = (sequelize, DataTypes) => { - class ContentTag extends Model { - /** - * Helper method for defining associations. - * This method is not a part of Sequelize lifecycle. - * The `models/index` file will call this method automatically. - */ - static associate(models) { - // define association here - ContentTag.belongsTo(models.Content, { foreignKey: 'ContentId' }) - ContentTag.belongsTo(models.Tag, { foreignKey: 'TagId' }) - } - } - ContentTag.init({ - ContentId: DataTypes.INTEGER, - TagId: DataTypes.INTEGER - }, { - sequelize, - modelName: 'ContentTag', - }); - return ContentTag; -}; \ No newline at end of file diff --git a/server/routes/auth.js b/server/routes/auth.js index 5a00b83..0684ea5 100644 --- a/server/routes/auth.js +++ b/server/routes/auth.js @@ -2,7 +2,7 @@ const express = require('express') const { register, login } = require('../controllers/authController') const router = express.Router() -router.get('/register', register) -router.get('/login', login) +router.post('/register', register) +router.post('/login', login) module.exports = router \ No newline at end of file diff --git a/server/routes/content.js b/server/routes/content.js index 786c3c5..3207dd2 100644 --- a/server/routes/content.js +++ b/server/routes/content.js @@ -1,7 +1,8 @@ const express = require('express') -const { getContent } = require('../controllers/contentController') +const { getContent, createContent } = require('../controllers/contentController') const router = express.Router() router.get('/', getContent) +router.post('/', createContent) module.exports = router \ No newline at end of file diff --git a/server/routes/index.js b/server/routes/index.js index 9b23a01..c30bf2b 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -10,7 +10,7 @@ router.get('/', (req, res) => { router.use('/auth', require('./auth')) router.use('/pub', require('./pub')) -// router.use(authentication) +router.use(authentication) router.use('/content', require('./content')) router.use('/tag', require('./tag')) diff --git a/server/seeders/20240313205831-seed-user.js b/server/seeders/20240313205831-seed-user.js index caa9a59..eb2b951 100644 --- a/server/seeders/20240313205831-seed-user.js +++ b/server/seeders/20240313205831-seed-user.js @@ -1,6 +1,6 @@ 'use strict'; -const { hashPasswd } = require('../middlewares/bcrypt'); +const { hashPasswd } = require('../helpers/bcrypt'); /** @type {import('sequelize-cli').Migration} */ module.exports = { diff --git a/server/seeders/20240313205840-seed-content.js b/server/seeders/20240313205840-seed-content.js deleted file mode 100644 index 9ca81ab..0000000 --- a/server/seeders/20240313205840-seed-content.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -/** @type {import('sequelize-cli').Migration} */ -module.exports = { - async up(queryInterface, Sequelize) { - /** - * Add seed commands here. - * - * Example: - * await queryInterface.bulkInsert('People', [{ - * name: 'John Doe', - * isBetaMember: false - * }], {}); - */ - await queryInterface.bulkInsert('Contents', [ - { - title: 'First education', - description: 'With the rapid times, Islamic education faces many challenges. The industrial era 4.0 and society 5.0 has shifted the development of world civilization. This research investigates the challenges of a shifting era for Islamic education. It includes aqidah and akhlaq, which must be prepared to enter the new era. These two things are guidelines that need to be prepared, especially for children as a generational advocates to fortify themselves from the currents of globalization that are not following the teachings of Islam. This research employed qualitative research with a normative approach. It used secondary sources such as books, journals, newspapers, and other documents. Those were valid. Data analysis used descriptive analysis to draw conclusions. This study found that Islamic education can adapt to the new era of society 5.0 by prioritizing critical and innovative thinking. Next, Islamic education must ensure the availability of reliable and competent human resources to strengthen the aqidah and morals of students, especially teachers and education staff.', - UserId: 1, - createdAt: new Date(), - updatedAt: new Date() - } - ]) - }, - - async down(queryInterface, Sequelize) { - /** - * Add commands to revert seed here. - * - * Example: - * await queryInterface.bulkDelete('People', null, {}); - */ - await queryInterface.bulkDelete('Contents') - } -}; diff --git a/server/seeders/20240313205848-seed-tag.js b/server/seeders/20240314005003-seed-category.js similarity index 83% rename from server/seeders/20240313205848-seed-tag.js rename to server/seeders/20240314005003-seed-category.js index 5de879b..1f2f796 100644 --- a/server/seeders/20240313205848-seed-tag.js +++ b/server/seeders/20240314005003-seed-category.js @@ -12,7 +12,7 @@ module.exports = { * isBetaMember: false * }], {}); */ - await queryInterface.bulkInsert('Tags', [ + await queryInterface.bulkInsert('Categories', [ { name: "Tafsir of the Qur'an", createdAt: new Date(), @@ -37,6 +37,11 @@ module.exports = { name: 'Hadith', createdAt: new Date(), updatedAt: new Date() + }, + { + name: 'Other', + createdAt: new Date(), + updatedAt: new Date() } ]) }, @@ -48,6 +53,6 @@ module.exports = { * Example: * await queryInterface.bulkDelete('People', null, {}); */ - await queryInterface.bulkDelete('Tags') + await queryInterface.bulkDelete('Categories') } }; diff --git a/server/seeders/20240314005252-seed-content.js b/server/seeders/20240314005252-seed-content.js new file mode 100644 index 0000000..b453933 --- /dev/null +++ b/server/seeders/20240314005252-seed-content.js @@ -0,0 +1,35 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + await queryInterface.bulkInsert('Contents', [ + { + title: 'Islamic Education', + description: 'With the rapid times, Islamic education faces many challenges. The industrial era 4.0 and society 5.0 has shifted the development of world civilization. This research investigates the challenges of a shifting era for Islamic education. It includes aqidah and akhlaq, which must be prepared to enter the new era. These two things are guidelines that need to be prepared, especially for children as a generational advocates to fortify themselves from the currents of globalization that are not following the teachings of Islam. This research employed qualitative research with a normative approach. It used secondary sources such as books, journals, newspapers, and other documents. Those were valid. Data analysis used descriptive analysis to draw conclusions. This study found that Islamic education can adapt to the new era of society 5.0 by prioritizing critical and innovative thinking. Next, Islamic education must ensure the availability of reliable and competent human resources to strengthen the aqidah and morals of students, especially teachers and education staff.', + UserId: 1, + CategoryId: 6, + createdAt: new Date(), + updatedAt: new Date() + } + ]) + }, + + async down (queryInterface, Sequelize) { + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + } +}; From 3bfc3dd8f819c8accbd97cc3d810b3d362b8988d Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 08:15:05 +0700 Subject: [PATCH 10/48] feat: error handler --- server/controllers/contentController.js | 8 ++------ server/middlewares/errorHandler.js | 8 ++++++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/server/controllers/contentController.js b/server/controllers/contentController.js index c463c33..23b0d16 100644 --- a/server/controllers/contentController.js +++ b/server/controllers/contentController.js @@ -19,15 +19,11 @@ module.exports = class Controller{ static async createContent(req, res, next){ try { - const {title, description} = req.body + const {title, description, CategoryId} = req.body // console.log(title, description) - let newContent = await Content.create({title, description, UserId: req.user.id}, { - include: { - model: Tag - } - }) + let newContent = await Content.create({title, description, CategoryId, UserId: req.user.id}) console.log(newContent.dataValues) res.status(201).json(newContent) diff --git a/server/middlewares/errorHandler.js b/server/middlewares/errorHandler.js index f765b45..8e182bf 100644 --- a/server/middlewares/errorHandler.js +++ b/server/middlewares/errorHandler.js @@ -13,6 +13,14 @@ module.exports = (error, req, res, next) => { status = 401 message = 'Invalid Token' break + case 'Unauthorized': + status = 403 + message = 'Forbiden access' + break + case 'Not Found': + status = 404 + message = 'Data not found' + break } res.status(status).json({ message }) From 99b8bfa1c18b8b16325cf0d8323deeb37dbe40e3 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 08:32:02 +0700 Subject: [PATCH 11/48] feat: routes category done --- server/controllers/categoryController.js | 59 ++++++++++++++++++++++++ server/routes/category.js | 10 ++++ server/routes/index.js | 6 +-- server/routes/tag.js | 6 --- 4 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 server/controllers/categoryController.js create mode 100644 server/routes/category.js delete mode 100644 server/routes/tag.js diff --git a/server/controllers/categoryController.js b/server/controllers/categoryController.js new file mode 100644 index 0000000..ce2e5d6 --- /dev/null +++ b/server/controllers/categoryController.js @@ -0,0 +1,59 @@ +const { Category, Content } = require('../models') + +module.exports = class Controller { + static async getCategory(req, res, next) { + try { + let category = await Category.findAll({ + include: Content + }) + + res.status(200).json(category) + } catch (error) { + next(error) + } + } + + static async getCategoryById(req, res, next) { + try { + const id = req.params.id + + let category = await Category.findByPk(id, { + include: Content + }) + + res.status(200).json(category) + } catch (error) { + next(error) + } + } + + static async updateCategoryById(req, res, next) { + try { + const id = req.params.id + + let category = await Category.findByPk(id) + + const { name } = req.body + + let updtCategory = await category.update({name}) + + res.status(201).json(updtCategory) + } catch (error) { + next(error) + } + } + + static async deleteCategoryById(req, res, next){ + try { + const id = req.params.id + + let category = await Category.findByPk(id) + + await category.destroy() + + res.status(201).json({message: `${category.name} successfully deleted`}) + } catch (error) { + next(error) + } + } +} \ No newline at end of file diff --git a/server/routes/category.js b/server/routes/category.js new file mode 100644 index 0000000..f086f80 --- /dev/null +++ b/server/routes/category.js @@ -0,0 +1,10 @@ +const express = require('express') +const { getCategory, getCategoryById, updateCategoryById, deleteCategoryById } = require('../controllers/categoryController') +const router = express.Router() + +router.get('/', getCategory) +router.get('/:id', getCategoryById) +router.put('/:id', updateCategoryById) +router.delete('/:id', deleteCategoryById) + +module.exports = router \ No newline at end of file diff --git a/server/routes/index.js b/server/routes/index.js index c30bf2b..5c86d0d 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -10,10 +10,10 @@ router.get('/', (req, res) => { router.use('/auth', require('./auth')) router.use('/pub', require('./pub')) -router.use(authentication) +// router.use(authentication) -router.use('/content', require('./content')) -router.use('/tag', require('./tag')) +router.use('/contents', require('./content')) +router.use('/categories', require('./category')) router.use(errorHandler) diff --git a/server/routes/tag.js b/server/routes/tag.js deleted file mode 100644 index 3014387..0000000 --- a/server/routes/tag.js +++ /dev/null @@ -1,6 +0,0 @@ -const express = require('express') -const router = express.Router() - -router.get('/') - -module.exports = router \ No newline at end of file From 2e374a3a2e7175ed03eb282f1c722dfb2452a8e2 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 08:46:36 +0700 Subject: [PATCH 12/48] feat: authorization --- server/middlewares/authenticate.js | 3 ++- server/middlewares/authorize.js | 19 +++++++++++++ .../20240314013956-add-role-to-user.js | 27 +++++++++++++++++++ server/models/user.js | 6 ++++- server/seeders/20240313205831-seed-user.js | 2 ++ 5 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 server/middlewares/authorize.js create mode 100644 server/migrations/20240314013956-add-role-to-user.js diff --git a/server/middlewares/authenticate.js b/server/middlewares/authenticate.js index c96bdc3..f279930 100644 --- a/server/middlewares/authenticate.js +++ b/server/middlewares/authenticate.js @@ -17,7 +17,8 @@ module.exports = { if(!user) throw { name: 'Unauthenticated' } req.user = { - id: user.id + id: user.id, + role: user.role } next() diff --git a/server/middlewares/authorize.js b/server/middlewares/authorize.js new file mode 100644 index 0000000..6e50ffc --- /dev/null +++ b/server/middlewares/authorize.js @@ -0,0 +1,19 @@ +const { Content } = require('../models') + +module.exports = { + async authorization(req, res, next){ + try { + const id = req.params.id + + const content = await Content.findByPk(id) + + if(!content) throw { name: 'Not Found' } + + if(content.UserId !== req.user.id && req.user.role !== 'admin') throw { name: 'Unauthorized' } + + next() + } catch (error) { + next(error) + } + } +} \ No newline at end of file diff --git a/server/migrations/20240314013956-add-role-to-user.js b/server/migrations/20240314013956-add-role-to-user.js new file mode 100644 index 0000000..281f27e --- /dev/null +++ b/server/migrations/20240314013956-add-role-to-user.js @@ -0,0 +1,27 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + /** + * Add altering commands here. + * + * Example: + * await queryInterface.createTable('users', { id: Sequelize.INTEGER }); + */ + await queryInterface.addColumn('Users', 'role', { + type: Sequelize.STRING, + defaultValue: 'user' + }) + }, + + async down (queryInterface, Sequelize) { + /** + * Add reverting commands here. + * + * Example: + * await queryInterface.dropTable('users'); + */ + await queryInterface.removeColumn('Users', 'role') + } +}; diff --git a/server/models/user.js b/server/models/user.js index bb0c1ae..a223ac5 100644 --- a/server/models/user.js +++ b/server/models/user.js @@ -17,7 +17,11 @@ module.exports = (sequelize, DataTypes) => { User.init({ username: DataTypes.STRING, email: DataTypes.STRING, - password: DataTypes.STRING + password: DataTypes.STRING, + role: { + type: DataTypes.STRING, + defaultValue: 'user' + } }, { sequelize, modelName: 'User', diff --git a/server/seeders/20240313205831-seed-user.js b/server/seeders/20240313205831-seed-user.js index eb2b951..31b1179 100644 --- a/server/seeders/20240313205831-seed-user.js +++ b/server/seeders/20240313205831-seed-user.js @@ -19,6 +19,7 @@ module.exports = { username: 'admin', email: 'admin@mail.com', password: hashPasswd('123456'), + role: 'admin', createdAt: new Date(), updatedAt: new Date() }, @@ -26,6 +27,7 @@ module.exports = { username: 'user', email: 'user@mail.com', password: hashPasswd('123456'), + role: 'user', createdAt: new Date(), updatedAt: new Date() }, From 96c39219546202ad34eb3014f1ce82bb64e900d8 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 10:32:13 +0700 Subject: [PATCH 13/48] feat: isAdmin guard --- server/middlewares/isAdmin.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 server/middlewares/isAdmin.js diff --git a/server/middlewares/isAdmin.js b/server/middlewares/isAdmin.js new file mode 100644 index 0000000..3a5a1ec --- /dev/null +++ b/server/middlewares/isAdmin.js @@ -0,0 +1,33 @@ +const { User } = require('../models') + +module.exports = { + async isAdmin(req, res, next) { + try { + let accessToken = req.headers.authorization + + if (!accessToken) throw { name: "Unauthenticated" } + + let [type, token] = accessToken.split(' ') + if (type !== 'Bearer') throw { name: "Unauthenticated" } + + let payload = verifyToken(token) + + let user = await User.findByPk(payload.id) + + if (!user) throw { name: "Unauthenticated" } + + req.user = { + role: user.role + } + + + if (req.user.role !== 'Admin') { + throw { name: "Unauthorized" } + } + + next() + } catch (error) { + next(error) + } + } +} \ No newline at end of file From 8f415f7db6f5d1f3980bd2b1923f2b52f554068b Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 10:43:17 +0700 Subject: [PATCH 14/48] feat: routes content --- server/controllers/contentController.js | 31 +++++++++++++++++++++++++ server/routes/content.js | 4 +++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/server/controllers/contentController.js b/server/controllers/contentController.js index 23b0d16..68d95cb 100644 --- a/server/controllers/contentController.js +++ b/server/controllers/contentController.js @@ -31,4 +31,35 @@ module.exports = class Controller{ next(error) } } + + static async updateContentById(req, res, next){ + try { + const id = req.params.id + + let content = await Content.findByPk(id) + + const { title, description, CategoryId } = req.body + + await content.update({title, description, CategoryId, UserId: req.user.id}) + + res.status(201).json(content) + + } catch (error) { + next(error) + } + } + + static async deleteContentById(req, res, next){ + try { + const id = req.params.id + + let content = await Content.findByPk(id) + + await content.destroy() + + res.status(201).json({message: `Deleted content ${content.title}`}) + } catch (error) { + next(error) + } + } } \ No newline at end of file diff --git a/server/routes/content.js b/server/routes/content.js index 3207dd2..356b416 100644 --- a/server/routes/content.js +++ b/server/routes/content.js @@ -1,8 +1,10 @@ const express = require('express') -const { getContent, createContent } = require('../controllers/contentController') +const { getContent, createContent, updateContentById, deleteContentById } = require('../controllers/contentController') const router = express.Router() router.get('/', getContent) router.post('/', createContent) +router.put('/:id', updateContentById) +router.delete('/:id', deleteContentById) module.exports = router \ No newline at end of file From 25769072dc4136da59dbd1e32e30bd0fd4da4068 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 10:46:45 +0700 Subject: [PATCH 15/48] refactor: routes category --- server/controllers/categoryController.js | 12 ++++++++++++ server/routes/category.js | 7 ++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/server/controllers/categoryController.js b/server/controllers/categoryController.js index ce2e5d6..437d452 100644 --- a/server/controllers/categoryController.js +++ b/server/controllers/categoryController.js @@ -13,6 +13,18 @@ module.exports = class Controller { } } + static async createCategory(req, res, next){ + try { + const { name } = req.body + + let newCategory = await Category.create({name}) + + res.status(201).json(newCategory) + } catch (error) { + next(error) + } + } + static async getCategoryById(req, res, next) { try { const id = req.params.id diff --git a/server/routes/category.js b/server/routes/category.js index f086f80..7344698 100644 --- a/server/routes/category.js +++ b/server/routes/category.js @@ -1,9 +1,14 @@ const express = require('express') -const { getCategory, getCategoryById, updateCategoryById, deleteCategoryById } = require('../controllers/categoryController') +const { getCategory, getCategoryById, updateCategoryById, deleteCategoryById, createCategory } = require('../controllers/categoryController') +const { isAdmin } = require('../middlewares/isAdmin') const router = express.Router() router.get('/', getCategory) router.get('/:id', getCategoryById) + +router.use(isAdmin) + +router.post('/', createCategory) router.put('/:id', updateCategoryById) router.delete('/:id', deleteCategoryById) From 19634ed6fb37a46416ac8655a4acf79194d6a7c9 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 11:12:17 +0700 Subject: [PATCH 16/48] feat: route pub with 3rd party api --- server/controllers/pubController.js | 29 ++++++++++++++++++++++++ server/package-lock.json | 35 +++++++++++++++++++++++++++++ server/package.json | 1 + server/routes/pub.js | 4 +++- 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 server/controllers/pubController.js diff --git a/server/controllers/pubController.js b/server/controllers/pubController.js new file mode 100644 index 0000000..dd0d848 --- /dev/null +++ b/server/controllers/pubController.js @@ -0,0 +1,29 @@ +const axios = require('axios') + +module.exports = class Controller{ + static async getData(req, res, next){ + try { + const response = await axios.get('https://hadeethenc.com/api/v1/hadeeths/list/?language=en&category_id=5&page=1') + + console.log(response.data) + + res.status(200).json(response.data) + + } catch (error) { + next(error) + } + } + + static async getDataById(req, res, next){ + try { + const id = req.params.id + const response = await axios.get(`https://hadeethenc.com/api/v1/hadeeths/one/?language=en&id=${id}`) + + console.log(response.data) + + res.status(200).json(response.data) + } catch (error) { + next(error) + } + } +} \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index 4aeeac4..00aa93e 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -5,6 +5,7 @@ "packages": { "": { "dependencies": { + "axios": "^1.6.7", "bcryptjs": "^2.4.3", "dotenv": "^16.4.5", "express": "^4.18.3", @@ -1309,6 +1310,16 @@ "node": ">= 4.0.0" } }, + "node_modules/axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -2443,6 +2454,25 @@ "node": ">=8" } }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -4648,6 +4678,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", diff --git a/server/package.json b/server/package.json index aaaea3f..9a7fc58 100644 --- a/server/package.json +++ b/server/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "axios": "^1.6.7", "bcryptjs": "^2.4.3", "dotenv": "^16.4.5", "express": "^4.18.3", diff --git a/server/routes/pub.js b/server/routes/pub.js index 3014387..512a8d0 100644 --- a/server/routes/pub.js +++ b/server/routes/pub.js @@ -1,6 +1,8 @@ const express = require('express') +const { getData, getDataById } = require('../controllers/pubController') const router = express.Router() -router.get('/') +router.get('/', getData) +router.get('/:id', getDataById) module.exports = router \ No newline at end of file From 6799902c89ab44a571a09c8238c09b333b273e7f Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 12:44:42 +0700 Subject: [PATCH 17/48] refactor: route pub 3rd party api --- server/controllers/pubController.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/server/controllers/pubController.js b/server/controllers/pubController.js index dd0d848..113f55d 100644 --- a/server/controllers/pubController.js +++ b/server/controllers/pubController.js @@ -1,7 +1,7 @@ const axios = require('axios') -module.exports = class Controller{ - static async getData(req, res, next){ +module.exports = class Controller { + static async getData(req, res, next) { try { const response = await axios.get('https://hadeethenc.com/api/v1/hadeeths/list/?language=en&category_id=5&page=1') @@ -14,10 +14,18 @@ module.exports = class Controller{ } } - static async getDataById(req, res, next){ + static async getDataById(req, res, next) { try { const id = req.params.id - const response = await axios.get(`https://hadeethenc.com/api/v1/hadeeths/one/?language=en&id=${id}`) + let { language } = req.query + + if (!language) { + language = `en` + // language translation: ar, en, fr, es, tr, ur, id, bs, ru, bn, zh, fa, hi, vi, si, ug + console.log(language) + } + + const response = await axios.get(`https://hadeethenc.com/api/v1/hadeeths/one/?language=${language}&id=${id}`) console.log(response.data) From 1efcefb222edcc4243c9b3aadfba5f8e511eef04 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 19:42:26 +0700 Subject: [PATCH 18/48] feat: test >80% --- server/__test__/auth-route.test.js | 116 ++++ server/__test__/category-route.test.js | 144 +++++ server/__test__/content-route.test.js | 161 ++++++ server/app.js | 8 +- server/bin/www | 6 + server/config/config.json | 2 +- server/controllers/authController.js | 4 +- server/controllers/categoryController.js | 4 +- server/controllers/contentController.js | 2 +- server/controllers/pubController.js | 4 +- server/coverage/clover.xml | 315 +++++++++++ server/coverage/coverage-final.json | 20 + server/coverage/lcov-report/base.css | 224 ++++++++ .../coverage/lcov-report/block-navigation.js | 87 +++ server/coverage/lcov-report/favicon.png | Bin 0 -> 445 bytes server/coverage/lcov-report/index.html | 191 +++++++ server/coverage/lcov-report/prettify.css | 1 + server/coverage/lcov-report/prettify.js | 2 + .../coverage/lcov-report/server/app.js.html | 124 +++++ .../server/controllers/authController.js.html | 235 ++++++++ .../controllers/categoryController.js.html | 295 ++++++++++ .../controllers/contentController.js.html | 277 ++++++++++ .../lcov-report/server/controllers/index.html | 161 ++++++ .../server/controllers/pubController.js.html | 193 +++++++ .../lcov-report/server/helpers/bcrypt.js.html | 100 ++++ .../lcov-report/server/helpers/index.html | 131 +++++ .../lcov-report/server/helpers/jwt.js.html | 124 +++++ server/coverage/lcov-report/server/index.html | 116 ++++ .../server/middlewares/authenticate.js.html | 172 ++++++ .../server/middlewares/errorHandler.js.html | 163 ++++++ .../lcov-report/server/middlewares/index.html | 146 +++++ .../server/middlewares/isAdmin.js.html | 184 +++++++ .../server/models/category.js.html | 178 ++++++ .../lcov-report/server/models/content.js.html | 208 +++++++ .../lcov-report/server/models/index.html | 161 ++++++ .../lcov-report/server/models/index.js.html | 214 ++++++++ .../lcov-report/server/models/user.js.html | 244 +++++++++ .../lcov-report/server/routes/auth.js.html | 106 ++++ .../server/routes/category.js.html | 127 +++++ .../lcov-report/server/routes/content.js.html | 112 ++++ .../lcov-report/server/routes/index.html | 176 ++++++ .../lcov-report/server/routes/index.js.html | 142 +++++ .../lcov-report/server/routes/pub.js.html | 106 ++++ .../lcov-report/sort-arrow-sprite.png | Bin 0 -> 138 bytes server/coverage/lcov-report/sorter.js | 196 +++++++ server/coverage/lcov.info | 509 ++++++++++++++++++ server/middlewares/isAdmin.js | 3 +- server/models/user.js | 30 +- server/package.json | 14 +- server/routes/index.js | 2 +- 50 files changed, 6223 insertions(+), 17 deletions(-) create mode 100644 server/__test__/auth-route.test.js create mode 100644 server/__test__/category-route.test.js create mode 100644 server/__test__/content-route.test.js create mode 100644 server/bin/www create mode 100644 server/coverage/clover.xml create mode 100644 server/coverage/coverage-final.json create mode 100644 server/coverage/lcov-report/base.css create mode 100644 server/coverage/lcov-report/block-navigation.js create mode 100644 server/coverage/lcov-report/favicon.png create mode 100644 server/coverage/lcov-report/index.html create mode 100644 server/coverage/lcov-report/prettify.css create mode 100644 server/coverage/lcov-report/prettify.js create mode 100644 server/coverage/lcov-report/server/app.js.html create mode 100644 server/coverage/lcov-report/server/controllers/authController.js.html create mode 100644 server/coverage/lcov-report/server/controllers/categoryController.js.html create mode 100644 server/coverage/lcov-report/server/controllers/contentController.js.html create mode 100644 server/coverage/lcov-report/server/controllers/index.html create mode 100644 server/coverage/lcov-report/server/controllers/pubController.js.html create mode 100644 server/coverage/lcov-report/server/helpers/bcrypt.js.html create mode 100644 server/coverage/lcov-report/server/helpers/index.html create mode 100644 server/coverage/lcov-report/server/helpers/jwt.js.html create mode 100644 server/coverage/lcov-report/server/index.html create mode 100644 server/coverage/lcov-report/server/middlewares/authenticate.js.html create mode 100644 server/coverage/lcov-report/server/middlewares/errorHandler.js.html create mode 100644 server/coverage/lcov-report/server/middlewares/index.html create mode 100644 server/coverage/lcov-report/server/middlewares/isAdmin.js.html create mode 100644 server/coverage/lcov-report/server/models/category.js.html create mode 100644 server/coverage/lcov-report/server/models/content.js.html create mode 100644 server/coverage/lcov-report/server/models/index.html create mode 100644 server/coverage/lcov-report/server/models/index.js.html create mode 100644 server/coverage/lcov-report/server/models/user.js.html create mode 100644 server/coverage/lcov-report/server/routes/auth.js.html create mode 100644 server/coverage/lcov-report/server/routes/category.js.html create mode 100644 server/coverage/lcov-report/server/routes/content.js.html create mode 100644 server/coverage/lcov-report/server/routes/index.html create mode 100644 server/coverage/lcov-report/server/routes/index.js.html create mode 100644 server/coverage/lcov-report/server/routes/pub.js.html create mode 100644 server/coverage/lcov-report/sort-arrow-sprite.png create mode 100644 server/coverage/lcov-report/sorter.js create mode 100644 server/coverage/lcov.info diff --git a/server/__test__/auth-route.test.js b/server/__test__/auth-route.test.js new file mode 100644 index 0000000..474a5fe --- /dev/null +++ b/server/__test__/auth-route.test.js @@ -0,0 +1,116 @@ +const app = require("../app") +const request = require('supertest') + +const { sequelize } = require('../models') +const { queryInterface } = sequelize +const { hashPasswd } = require("../helpers/bcrypt") + +const data1 = { + username: 'admin1', + email: 'admin1@mail.com', + password: '123456', + role: 'admin', + createdAt: new Date(), + updatedAt: new Date() +} + +const data2 = { + username: 'user1', + email: 'user1@mail.com', + password: '123456', + role: 'user', + createdAt: new Date(), + updatedAt: new Date() +} + +describe('POST /auth/register', () => { + describe('Success', () => { + test('Should return 201 when success register', async () => { + let { status, body } = await request(app).post('/auth/register').send(data1) + + expect(status).toBe(201) + }) + }) + + describe('Failure', () => { + test('Should return 400 when username/ email/ password blank', async () => { + let { status, body } = await request(app).post('/auth/register').send({ + username: '', + email: '', + password: '1234' + }) + + expect(status).toBe(400) + expect(body).toHaveProperty('message', expect.any(String)) + }) + }) +}) + +describe('POST /auth/login', () => { + describe('Success', () => { + test('Should return 200 when success login', async () => { + let { status, body } = await request(app).post('/auth/login').send(data2) + + expect(status).toBe(200) + }) + }) + + describe('Failure', () => { + test('Should return 401 when email/password invalid', async () => { + let {status, body} = await request(app).post('/auth/login').send({ + email: 'useeeerrrr@mail.com', + password: '123' + }) + + expect(status).toBe(401) + }), + test('Should return 401 when email is blank', async () => { + let {status, body} = await request(app).post('/auth/login').send({ + email: '', + password: '123' + }) + + expect(status).toBe(400) + }), + test('Should return 401 when password is blank', async () => { + let {status, body} = await request(app).post('/auth/login').send({ + email: 'user1@mail.com', + password: '' + }) + + expect(status).toBe(400) + }) + }) +}) + +beforeAll(async () => { + let data = [ + { + username: data1.username, + email: data1.email, + password: hashPasswd(data1.password), + role: data1.role, + createdAt: new Date(), + updatedAt: new Date() + }, + { + username: data2.username, + email: data2.email, + password: hashPasswd(data2.password), + role: data2.role, + createdAt: new Date(), + updatedAt: new Date() + } + ].map(each => { return each }) + + await queryInterface.bulkInsert('Users', data) +}) + + +afterAll(async () => { + await queryInterface.bulkDelete('Users', null, { + truncate: true, + cascade: true, + restartIdentity: true + }) +}) \ No newline at end of file diff --git a/server/__test__/category-route.test.js b/server/__test__/category-route.test.js new file mode 100644 index 0000000..1531994 --- /dev/null +++ b/server/__test__/category-route.test.js @@ -0,0 +1,144 @@ +const app = require('../app') +const request = require('supertest') + +const { sequelize } = require('../models') +const { queryInterface } = sequelize +const { Category } = require('../models') +const { hashPasswd } = require('../helpers/bcrypt') +const { signToken } = require('../helpers/jwt') + +let data1 = { + name: 'Hadith', + createdAt: new Date(), + updatedAt: new Date() +} + +let data2 = { + name: 'Akhlaq', + createdAt: new Date(), + updatedAt: new Date() +} + +let user = { + id: 1, + username: 'admin', + email: 'admin@mail.com', + password: '12345', + role: 'admin', + createdAt: new Date(), + updatedAt: new Date() +} + +let access_token +let idParams = 2 + +describe('GET /categories ', () => { + describe('Success', () => { + test('Should return 200 and return data', async () => { + let { status, body } = await request(app).get('/categories').set('Authorization', `Bearer ${access_token}`).send(data1) + + // console.log(status) + // console.log(body) + expect(status).toBe(200) + }) + }) +}) + +describe('GET /categories/:id ', () => { + describe('Success', () => { + test('Should return 200 and return data', async () => { + let { status, body } = await request(app).get(`/categories/${idParams}`).set('Authorization', `Bearer ${access_token}`).send(data1) + + // console.log(status) + // console.log(body) + expect(status).toBe(200) + }) + }) +}) + +describe('POST /categories ', () => { + describe('Success', () => { + test('Should return 200 and return data', async () => { + let { status, body } = await request(app).post(`/categories`).set('Authorization', `Bearer ${access_token}`).send({ + name: 'New Category' + }) + + // console.log(status) + // console.log(body) + expect(status).toBe(201) + }) + }) +}) + +describe('PUT /categories/:id ', () => { + describe('Success', () => { + test('Should return 200 when success update', async () => { + let { status, body } = await request(app).put(`/categories/${idParams}`).set('Authorization', `Bearer ${access_token}`).send({ + name: 'New Other Category' + }) + + // console.log(status) + // console.log(body) + expect(status).toBe(200) + }) + }) +}) + +describe('DELETE /categories/:id ', () => { + describe('Success', () => { + test('Should return 200 when success update', async () => { + let { status, body } = await request(app).delete(`/categories/${idParams}`).set('Authorization', `Bearer ${access_token}`).send(data1) + + // console.log(status) + // console.log(body) + expect(status).toBe(200) + }) + }) +}) + + +beforeAll(async () => { + let data = [ + { + name: data1.name, + createdAt: data1.createdAt, + updatedAt: data1.updatedAt + }, + { + name: data2.name, + createdAt: data2.createdAt, + updatedAt: data2.updatedAt + } + ].map(each => { return each }) + + await queryInterface.bulkInsert('Categories', data) + + await queryInterface.bulkInsert('Users', [ + { + username: user.username, + role: user.role, + email: user.email, + password: hashPasswd(user.password), + createdAt: user.createdAt, + updatedAt: user.updatedAt + } + ]) + + access_token = signToken({ + id: user.id + }) +}) + + +afterAll(async () => { + await queryInterface.bulkDelete('Categories', null, { + truncate: true, + cascade: true, + restartIdentity: true + }) + await queryInterface.bulkDelete('Users', null, { + truncate: true, + cascade: true, + restartIdentity: true + }) +}) \ No newline at end of file diff --git a/server/__test__/content-route.test.js b/server/__test__/content-route.test.js new file mode 100644 index 0000000..4c18728 --- /dev/null +++ b/server/__test__/content-route.test.js @@ -0,0 +1,161 @@ +const app = require('../app') +const request = require('supertest') + +const { sequelize } = require('../models') +const { signToken } = require('../helpers/jwt') +const { hashPasswd } = require('../helpers/bcrypt') +const { queryInterface } = sequelize + +let category = { + name: 'Hadith', + createdAt: new Date(), + updatedAt: new Date() +} + +let user = { + id: 1, + username: 'admin', + email: 'admin@mail.com', + password: '12345', + role: 'admin', + createdAt: new Date(), + updatedAt: new Date() +} + +const data1 = { + title: 'Islamic Education', + description: "In Arabic three terms are used for education. The most common term is ta'līm, from the root 'alima, which means knowing...", + CategoryId: 1, + UserId: 1, + createdAt: new Date(), + updatedAt: new Date() +} + +const data2 = { + title: 'Education', + description: "In Arabic three terms are used for education. The most common term is ta'līm, from the root 'alima, which means knowing...", + CategoryId: 1, + UserId: 1, + createdAt: new Date(), + updatedAt: new Date() +} + +let access_token +let idParams = 1 + +describe('GET /contents', () => { + describe('Success', () => { + test('Should return status 200 and return data', async () => { + let { status, body } = await request(app).get('/contents').set('Authorization', `Bearer ${access_token}`).send(data2) + + // console.log(status) + // console.log(body) + expect(status).toBe(200) + }) + }) +}) + +describe('POST /contents', () => { + describe('Success', () => { + test('Should return status 201 when success create content', async () => { + let { status, body } = await request(app).post('/contents').set('Authorization', `Bearer ${access_token}`).send(data1) + + // console.log(status) + // console.log(body) + expect(status).toBe(201) + }) + }) +}) + +describe('PUT /contents/:id', () => { + describe('Success', () => { + test('Should return status 201 when success create content', async () => { + let { status, body } = await request(app).put(`/contents/${idParams}`).set('Authorization', `Bearer ${access_token}`).send({ + title: 'New', + description: 'Test' + }) + + console.log(status) + console.log(body) + expect(status).toBe(201) + }) + }) +}) + +describe('DELETE /contents/:id', () => { + describe('Success', () => { + test('Should return status 201 when success delete content', async () => { + let { status, body } = await request(app).delete(`/contents/${idParams}`).set('Authorization', `Bearer ${access_token}`).send(data1) + + console.log(status) + console.log(body) + expect(status).toBe(201) + }) + }) +}) + +beforeAll(async () => { + await queryInterface.bulkInsert('Users', [ + { + username: user.username, + role: user.role, + email: user.email, + password: hashPasswd(user.password), + createdAt: user.createdAt, + updatedAt: user.updatedAt + } + ]) + + await queryInterface.bulkInsert('Categories', [ + { + name: category.name, + createdAt: category.createdAt, + updatedAt: category.updatedAt + } + ]) + + let data = [ + { + title: data1.title, + description: data1.description, + CategoryId: data1.CategoryId, + UserId: data1.UserId, + createdAt: data1.createdAt, + updatedAt: data1.updatedAt + }, + { + title: data2.title, + description: data2.description, + CategoryId: data2.CategoryId, + UserId: data2.UserId, + createdAt: data2.createdAt, + updatedAt: data2.updatedAt + } + ].map(each => { return each }) + + await queryInterface.bulkInsert('Contents', data) + + + + access_token = signToken({ + id: user.id + }) +}) + +afterAll(async () => { + await queryInterface.bulkDelete('Contents', null, { + truncate: true, + cascade: true, + restartIdentity: true + }) + await queryInterface.bulkDelete('Users', null, { + truncate: true, + cascade: true, + restartIdentity: true + }) + await queryInterface.bulkDelete('Categories', null, { + truncate: true, + cascade: true, + restartIdentity: true + }) +}) \ No newline at end of file diff --git a/server/app.js b/server/app.js index 75f6d7e..9acbbdc 100644 --- a/server/app.js +++ b/server/app.js @@ -7,6 +7,8 @@ app.use(express.urlencoded({extended: true})) app.use(express.json()) app.use(router) -app.listen(port, () => { - console.log(`Example app listening on port ${port}`) -}) \ No newline at end of file +// app.listen(port, () => { +// console.log(`Example app listening on port ${port}`) +// }) + +module.exports = app \ No newline at end of file diff --git a/server/bin/www b/server/bin/www new file mode 100644 index 0000000..1418f73 --- /dev/null +++ b/server/bin/www @@ -0,0 +1,6 @@ +const app = require('../app') +const port = process.env.port || 3000 + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`) + }) \ No newline at end of file diff --git a/server/config/config.json b/server/config/config.json index f01ac62..05e2712 100644 --- a/server/config/config.json +++ b/server/config/config.json @@ -10,7 +10,7 @@ "test": { "username": "postgres", "password": "postgres", - "database": "database_test", + "database": "database_test_IP", "host": "127.0.0.1", "dialect": "postgres", "logging": false diff --git a/server/controllers/authController.js b/server/controllers/authController.js index 6babd62..1bdf6f2 100644 --- a/server/controllers/authController.js +++ b/server/controllers/authController.js @@ -15,7 +15,7 @@ module.exports = class Controller { email }) } catch (error) { - console.log(error) + // console.log(error) next(error) } } @@ -33,7 +33,7 @@ module.exports = class Controller { email } }) - console.log(user) + // console.log(user) if (!user || !compareSync(password, user.password)) { throw { status: 401, message: 'Invalid email or password' } } diff --git a/server/controllers/categoryController.js b/server/controllers/categoryController.js index 437d452..e3ccfcf 100644 --- a/server/controllers/categoryController.js +++ b/server/controllers/categoryController.js @@ -49,7 +49,7 @@ module.exports = class Controller { let updtCategory = await category.update({name}) - res.status(201).json(updtCategory) + res.status(200).json(updtCategory) } catch (error) { next(error) } @@ -63,7 +63,7 @@ module.exports = class Controller { await category.destroy() - res.status(201).json({message: `${category.name} successfully deleted`}) + res.status(200).json({message: `${category.name} successfully deleted`}) } catch (error) { next(error) } diff --git a/server/controllers/contentController.js b/server/controllers/contentController.js index 68d95cb..6a19c18 100644 --- a/server/controllers/contentController.js +++ b/server/controllers/contentController.js @@ -25,7 +25,7 @@ module.exports = class Controller{ let newContent = await Content.create({title, description, CategoryId, UserId: req.user.id}) - console.log(newContent.dataValues) + // console.log(newContent.dataValues) res.status(201).json(newContent) } catch (error) { next(error) diff --git a/server/controllers/pubController.js b/server/controllers/pubController.js index 113f55d..ee546a0 100644 --- a/server/controllers/pubController.js +++ b/server/controllers/pubController.js @@ -22,12 +22,12 @@ module.exports = class Controller { if (!language) { language = `en` // language translation: ar, en, fr, es, tr, ur, id, bs, ru, bn, zh, fa, hi, vi, si, ug - console.log(language) + // console.log(language) } const response = await axios.get(`https://hadeethenc.com/api/v1/hadeeths/one/?language=${language}&id=${id}`) - console.log(response.data) + // console.log(response.data) res.status(200).json(response.data) } catch (error) { diff --git a/server/coverage/clover.xml b/server/coverage/clover.xml new file mode 100644 index 0000000..66310dc --- /dev/null +++ b/server/coverage/clover.xml @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/coverage/coverage-final.json b/server/coverage/coverage-final.json new file mode 100644 index 0000000..a155d7b --- /dev/null +++ b/server/coverage/coverage-final.json @@ -0,0 +1,20 @@ +{"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\app.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\app.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":34}},"2":{"start":{"line":3,"column":12},"end":{"line":3,"column":21}},"3":{"start":{"line":4,"column":13},"end":{"line":4,"column":17}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":45}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":23}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":15}},"7":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}}},"fnMap":{},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8f9554dbc06dab724dd799d4088cb178109e5e9b"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\controllers\\authController.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\controllers\\authController.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":43}},"1":{"start":{"line":2,"column":37},"end":{"line":2,"column":65}},"2":{"start":{"line":3,"column":22},"end":{"line":3,"column":47}},"3":{"start":{"line":4,"column":17},"end":{"line":4,"column":37}},"4":{"start":{"line":6,"column":0},"end":{"line":51,"column":1}},"5":{"start":{"line":8,"column":8},"end":{"line":20,"column":9}},"6":{"start":{"line":9,"column":50},"end":{"line":9,"column":58}},"7":{"start":{"line":11,"column":12},"end":{"line":11,"column":60}},"8":{"start":{"line":13,"column":12},"end":{"line":16,"column":14}},"9":{"start":{"line":19,"column":12},"end":{"line":19,"column":23}},"10":{"start":{"line":24,"column":8},"end":{"line":49,"column":9}},"11":{"start":{"line":26,"column":40},"end":{"line":26,"column":48}},"12":{"start":{"line":28,"column":12},"end":{"line":28,"column":75}},"13":{"start":{"line":28,"column":24},"end":{"line":28,"column":75}},"14":{"start":{"line":29,"column":12},"end":{"line":29,"column":81}},"15":{"start":{"line":29,"column":27},"end":{"line":29,"column":81}},"16":{"start":{"line":31,"column":23},"end":{"line":35,"column":14}},"17":{"start":{"line":37,"column":12},"end":{"line":39,"column":13}},"18":{"start":{"line":38,"column":16},"end":{"line":38,"column":75}},"19":{"start":{"line":41,"column":24},"end":{"line":43,"column":14}},"20":{"start":{"line":45,"column":12},"end":{"line":45,"column":57}},"21":{"start":{"line":48,"column":12},"end":{"line":48,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":4},"end":{"line":7,"column":5}},"loc":{"start":{"line":7,"column":42},"end":{"line":21,"column":5}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":4},"end":{"line":23,"column":5}},"loc":{"start":{"line":23,"column":39},"end":{"line":50,"column":5}},"line":23}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":12},"end":{"line":28,"column":75}},"type":"if","locations":[{"start":{"line":28,"column":12},"end":{"line":28,"column":75}},{"start":{},"end":{}}],"line":28},"1":{"loc":{"start":{"line":29,"column":12},"end":{"line":29,"column":81}},"type":"if","locations":[{"start":{"line":29,"column":12},"end":{"line":29,"column":81}},{"start":{},"end":{}}],"line":29},"2":{"loc":{"start":{"line":37,"column":12},"end":{"line":39,"column":13}},"type":"if","locations":[{"start":{"line":37,"column":12},"end":{"line":39,"column":13}},{"start":{},"end":{}}],"line":37},"3":{"loc":{"start":{"line":37,"column":16},"end":{"line":37,"column":62}},"type":"binary-expr","locations":[{"start":{"line":37,"column":16},"end":{"line":37,"column":21}},{"start":{"line":37,"column":25},"end":{"line":37,"column":62}}],"line":37}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":2,"6":2,"7":2,"8":1,"9":1,"10":4,"11":4,"12":4,"13":1,"14":3,"15":1,"16":2,"17":2,"18":1,"19":1,"20":1,"21":3},"f":{"0":2,"1":4},"b":{"0":[1,3],"1":[1,2],"2":[1,1],"3":[2,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"4bee1178d2aa36fff158d9c1397ff06f0b786b56"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\controllers\\categoryController.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\controllers\\categoryController.js","statementMap":{"0":{"start":{"line":1,"column":30},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":0},"end":{"line":71,"column":1}},"2":{"start":{"line":5,"column":8},"end":{"line":13,"column":9}},"3":{"start":{"line":6,"column":27},"end":{"line":8,"column":14}},"4":{"start":{"line":10,"column":12},"end":{"line":10,"column":42}},"5":{"start":{"line":12,"column":12},"end":{"line":12,"column":23}},"6":{"start":{"line":17,"column":8},"end":{"line":25,"column":9}},"7":{"start":{"line":18,"column":29},"end":{"line":18,"column":37}},"8":{"start":{"line":20,"column":30},"end":{"line":20,"column":59}},"9":{"start":{"line":22,"column":12},"end":{"line":22,"column":45}},"10":{"start":{"line":24,"column":12},"end":{"line":24,"column":23}},"11":{"start":{"line":29,"column":8},"end":{"line":39,"column":9}},"12":{"start":{"line":30,"column":23},"end":{"line":30,"column":36}},"13":{"start":{"line":32,"column":27},"end":{"line":34,"column":14}},"14":{"start":{"line":36,"column":12},"end":{"line":36,"column":42}},"15":{"start":{"line":38,"column":12},"end":{"line":38,"column":23}},"16":{"start":{"line":43,"column":8},"end":{"line":55,"column":9}},"17":{"start":{"line":44,"column":23},"end":{"line":44,"column":36}},"18":{"start":{"line":46,"column":27},"end":{"line":46,"column":54}},"19":{"start":{"line":48,"column":29},"end":{"line":48,"column":37}},"20":{"start":{"line":50,"column":31},"end":{"line":50,"column":60}},"21":{"start":{"line":52,"column":12},"end":{"line":52,"column":46}},"22":{"start":{"line":54,"column":12},"end":{"line":54,"column":23}},"23":{"start":{"line":59,"column":8},"end":{"line":69,"column":9}},"24":{"start":{"line":60,"column":23},"end":{"line":60,"column":36}},"25":{"start":{"line":62,"column":27},"end":{"line":62,"column":54}},"26":{"start":{"line":64,"column":12},"end":{"line":64,"column":36}},"27":{"start":{"line":66,"column":12},"end":{"line":66,"column":84}},"28":{"start":{"line":68,"column":12},"end":{"line":68,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":5}},"loc":{"start":{"line":4,"column":45},"end":{"line":14,"column":5}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":4},"end":{"line":16,"column":5}},"loc":{"start":{"line":16,"column":47},"end":{"line":26,"column":5}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":28,"column":4},"end":{"line":28,"column":5}},"loc":{"start":{"line":28,"column":49},"end":{"line":40,"column":5}},"line":28},"3":{"name":"(anonymous_3)","decl":{"start":{"line":42,"column":4},"end":{"line":42,"column":5}},"loc":{"start":{"line":42,"column":52},"end":{"line":56,"column":5}},"line":42},"4":{"name":"(anonymous_4)","decl":{"start":{"line":58,"column":4},"end":{"line":58,"column":5}},"loc":{"start":{"line":58,"column":51},"end":{"line":70,"column":5}},"line":58}},"branchMap":{},"s":{"0":3,"1":3,"2":1,"3":1,"4":1,"5":0,"6":1,"7":1,"8":1,"9":1,"10":0,"11":1,"12":1,"13":1,"14":1,"15":0,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":0,"23":1,"24":1,"25":1,"26":1,"27":1,"28":0},"f":{"0":1,"1":1,"2":1,"3":1,"4":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d812a46ddded1f8d5bdd7524ad852e61ed2adc0d"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\controllers\\contentController.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\controllers\\contentController.js","statementMap":{"0":{"start":{"line":1,"column":30},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":0},"end":{"line":65,"column":1}},"2":{"start":{"line":5,"column":8},"end":{"line":17,"column":9}},"3":{"start":{"line":6,"column":22},"end":{"line":11,"column":10}},"4":{"start":{"line":13,"column":12},"end":{"line":13,"column":41}},"5":{"start":{"line":15,"column":12},"end":{"line":15,"column":30}},"6":{"start":{"line":16,"column":12},"end":{"line":16,"column":23}},"7":{"start":{"line":21,"column":8},"end":{"line":32,"column":9}},"8":{"start":{"line":22,"column":53},"end":{"line":22,"column":61}},"9":{"start":{"line":26,"column":29},"end":{"line":26,"column":104}},"10":{"start":{"line":29,"column":12},"end":{"line":29,"column":44}},"11":{"start":{"line":31,"column":12},"end":{"line":31,"column":23}},"12":{"start":{"line":36,"column":8},"end":{"line":49,"column":9}},"13":{"start":{"line":37,"column":23},"end":{"line":37,"column":36}},"14":{"start":{"line":39,"column":26},"end":{"line":39,"column":52}},"15":{"start":{"line":41,"column":55},"end":{"line":41,"column":63}},"16":{"start":{"line":43,"column":12},"end":{"line":43,"column":87}},"17":{"start":{"line":45,"column":12},"end":{"line":45,"column":41}},"18":{"start":{"line":48,"column":12},"end":{"line":48,"column":23}},"19":{"start":{"line":53,"column":8},"end":{"line":63,"column":9}},"20":{"start":{"line":54,"column":23},"end":{"line":54,"column":36}},"21":{"start":{"line":56,"column":26},"end":{"line":56,"column":52}},"22":{"start":{"line":58,"column":12},"end":{"line":58,"column":35}},"23":{"start":{"line":60,"column":12},"end":{"line":60,"column":79}},"24":{"start":{"line":62,"column":12},"end":{"line":62,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":5}},"loc":{"start":{"line":4,"column":43},"end":{"line":18,"column":5}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":4},"end":{"line":20,"column":5}},"loc":{"start":{"line":20,"column":46},"end":{"line":33,"column":5}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":35,"column":4},"end":{"line":35,"column":5}},"loc":{"start":{"line":35,"column":50},"end":{"line":50,"column":5}},"line":35},"3":{"name":"(anonymous_3)","decl":{"start":{"line":52,"column":4},"end":{"line":52,"column":5}},"loc":{"start":{"line":52,"column":50},"end":{"line":64,"column":5}},"line":52}},"branchMap":{},"s":{"0":3,"1":3,"2":1,"3":1,"4":1,"5":0,"6":0,"7":1,"8":1,"9":1,"10":1,"11":0,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":0,"19":1,"20":1,"21":1,"22":1,"23":1,"24":0},"f":{"0":1,"1":1,"2":1,"3":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"228c14c7407ac2a009c6997ac74bcbd4a5a00749"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\controllers\\pubController.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\controllers\\pubController.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":30}},"1":{"start":{"line":3,"column":0},"end":{"line":37,"column":1}},"2":{"start":{"line":5,"column":8},"end":{"line":14,"column":9}},"3":{"start":{"line":6,"column":29},"end":{"line":6,"column":125}},"4":{"start":{"line":8,"column":12},"end":{"line":8,"column":38}},"5":{"start":{"line":10,"column":12},"end":{"line":10,"column":47}},"6":{"start":{"line":13,"column":12},"end":{"line":13,"column":23}},"7":{"start":{"line":18,"column":8},"end":{"line":35,"column":9}},"8":{"start":{"line":19,"column":23},"end":{"line":19,"column":36}},"9":{"start":{"line":20,"column":31},"end":{"line":20,"column":40}},"10":{"start":{"line":22,"column":12},"end":{"line":26,"column":13}},"11":{"start":{"line":23,"column":16},"end":{"line":23,"column":31}},"12":{"start":{"line":28,"column":29},"end":{"line":28,"column":121}},"13":{"start":{"line":32,"column":12},"end":{"line":32,"column":47}},"14":{"start":{"line":34,"column":12},"end":{"line":34,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":5}},"loc":{"start":{"line":4,"column":41},"end":{"line":15,"column":5}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":5}},"loc":{"start":{"line":17,"column":45},"end":{"line":36,"column":5}},"line":17}},"branchMap":{"0":{"loc":{"start":{"line":22,"column":12},"end":{"line":26,"column":13}},"type":"if","locations":[{"start":{"line":22,"column":12},"end":{"line":26,"column":13}},{"start":{},"end":{}}],"line":22}},"s":{"0":3,"1":3,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{"0":0,"1":0},"b":{"0":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"40e491d4335ac31bbf22e65c637117c359d2eaac"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\helpers\\bcrypt.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\helpers\\bcrypt.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":34}},"1":{"start":{"line":3,"column":0},"end":{"line":6,"column":1}},"2":{"start":{"line":4,"column":30},"end":{"line":4,"column":59}},"3":{"start":{"line":5,"column":32},"end":{"line":5,"column":77}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":16},"end":{"line":4,"column":17}},"loc":{"start":{"line":4,"column":30},"end":{"line":4,"column":59}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":5,"column":18},"end":{"line":5,"column":19}},"loc":{"start":{"line":5,"column":32},"end":{"line":5,"column":77}},"line":5}},"branchMap":{},"s":{"0":3,"1":3,"2":4,"3":0},"f":{"0":4,"1":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"eef18d47647eb468e1db11318ce47ef04920ec8e"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\helpers\\jwt.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\helpers\\jwt.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":35}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":24}},"2":{"start":{"line":5,"column":4},"end":{"line":5,"column":36}},"3":{"start":{"line":9,"column":4},"end":{"line":9,"column":38}},"4":{"start":{"line":12,"column":0},"end":{"line":14,"column":1}}},"fnMap":{"0":{"name":"signToken","decl":{"start":{"line":4,"column":9},"end":{"line":4,"column":18}},"loc":{"start":{"line":4,"column":27},"end":{"line":6,"column":1}},"line":4},"1":{"name":"verifyToken","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":20}},"loc":{"start":{"line":8,"column":29},"end":{"line":10,"column":1}},"line":8}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":12,"4":3},"f":{"0":3,"1":12},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"6d2c1434814b6687371363ec559614110171c530"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\middlewares\\authenticate.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\middlewares\\authenticate.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":17},"end":{"line":2,"column":37}},"2":{"start":{"line":4,"column":0},"end":{"line":30,"column":1}},"3":{"start":{"line":6,"column":8},"end":{"line":28,"column":9}},"4":{"start":{"line":7,"column":31},"end":{"line":7,"column":56}},"5":{"start":{"line":8,"column":12},"end":{"line":8,"column":64}},"6":{"start":{"line":8,"column":31},"end":{"line":8,"column":64}},"7":{"start":{"line":10,"column":32},"end":{"line":10,"column":55}},"8":{"start":{"line":11,"column":12},"end":{"line":11,"column":67}},"9":{"start":{"line":11,"column":34},"end":{"line":11,"column":67}},"10":{"start":{"line":13,"column":26},"end":{"line":13,"column":44}},"11":{"start":{"line":15,"column":23},"end":{"line":15,"column":54}},"12":{"start":{"line":17,"column":12},"end":{"line":17,"column":55}},"13":{"start":{"line":17,"column":22},"end":{"line":17,"column":55}},"14":{"start":{"line":19,"column":12},"end":{"line":22,"column":13}},"15":{"start":{"line":24,"column":12},"end":{"line":24,"column":18}},"16":{"start":{"line":27,"column":12},"end":{"line":27,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":41},"end":{"line":29,"column":5}},"line":5}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":12},"end":{"line":8,"column":64}},"type":"if","locations":[{"start":{"line":8,"column":12},"end":{"line":8,"column":64}},{"start":{},"end":{}}],"line":8},"1":{"loc":{"start":{"line":11,"column":12},"end":{"line":11,"column":67}},"type":"if","locations":[{"start":{"line":11,"column":12},"end":{"line":11,"column":67}},{"start":{},"end":{}}],"line":11},"2":{"loc":{"start":{"line":17,"column":12},"end":{"line":17,"column":55}},"type":"if","locations":[{"start":{"line":17,"column":12},"end":{"line":17,"column":55}},{"start":{},"end":{}}],"line":17}},"s":{"0":3,"1":3,"2":3,"3":9,"4":9,"5":9,"6":0,"7":9,"8":9,"9":0,"10":9,"11":9,"12":9,"13":0,"14":9,"15":9,"16":0},"f":{"0":9},"b":{"0":[0,9],"1":[0,9],"2":[0,9]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f64f27d0682f71ec550fa48f31df31e938e0b7ee"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\middlewares\\errorHandler.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\middlewares\\errorHandler.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":27,"column":1}},"1":{"start":{"line":2,"column":17},"end":{"line":2,"column":36}},"2":{"start":{"line":3,"column":18},"end":{"line":3,"column":58}},"3":{"start":{"line":5,"column":4},"end":{"line":24,"column":5}},"4":{"start":{"line":8,"column":12},"end":{"line":8,"column":24}},"5":{"start":{"line":9,"column":12},"end":{"line":9,"column":45}},"6":{"start":{"line":10,"column":12},"end":{"line":10,"column":17}},"7":{"start":{"line":13,"column":12},"end":{"line":13,"column":24}},"8":{"start":{"line":14,"column":12},"end":{"line":14,"column":37}},"9":{"start":{"line":15,"column":12},"end":{"line":15,"column":17}},"10":{"start":{"line":17,"column":12},"end":{"line":17,"column":24}},"11":{"start":{"line":18,"column":12},"end":{"line":18,"column":39}},"12":{"start":{"line":19,"column":12},"end":{"line":19,"column":17}},"13":{"start":{"line":21,"column":12},"end":{"line":21,"column":24}},"14":{"start":{"line":22,"column":12},"end":{"line":22,"column":38}},"15":{"start":{"line":23,"column":12},"end":{"line":23,"column":17}},"16":{"start":{"line":26,"column":4},"end":{"line":26,"column":40}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":17},"end":{"line":1,"column":18}},"loc":{"start":{"line":1,"column":44},"end":{"line":27,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":17},"end":{"line":2,"column":36}},"type":"binary-expr","locations":[{"start":{"line":2,"column":17},"end":{"line":2,"column":29}},{"start":{"line":2,"column":33},"end":{"line":2,"column":36}}],"line":2},"1":{"loc":{"start":{"line":3,"column":18},"end":{"line":3,"column":58}},"type":"binary-expr","locations":[{"start":{"line":3,"column":18},"end":{"line":3,"column":31}},{"start":{"line":3,"column":35},"end":{"line":3,"column":58}}],"line":3},"2":{"loc":{"start":{"line":5,"column":4},"end":{"line":24,"column":5}},"type":"switch","locations":[{"start":{"line":6,"column":8},"end":{"line":6,"column":40}},{"start":{"line":7,"column":8},"end":{"line":10,"column":17}},{"start":{"line":11,"column":8},"end":{"line":11,"column":33}},{"start":{"line":12,"column":8},"end":{"line":15,"column":17}},{"start":{"line":16,"column":8},"end":{"line":19,"column":17}},{"start":{"line":20,"column":8},"end":{"line":23,"column":17}}],"line":5}},"s":{"0":3,"1":4,"2":4,"3":4,"4":1,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":4},"f":{"0":4},"b":{"0":[4,1],"1":[4,0],"2":[1,1,0,0,0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ce542c7779292d266faa1b5461ca9e313deebce2"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\middlewares\\isAdmin.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\middlewares\\isAdmin.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":17},"end":{"line":2,"column":37}},"2":{"start":{"line":4,"column":0},"end":{"line":34,"column":1}},"3":{"start":{"line":6,"column":8},"end":{"line":32,"column":9}},"4":{"start":{"line":7,"column":30},"end":{"line":7,"column":55}},"5":{"start":{"line":9,"column":12},"end":{"line":9,"column":63}},"6":{"start":{"line":9,"column":30},"end":{"line":9,"column":63}},"7":{"start":{"line":11,"column":32},"end":{"line":11,"column":54}},"8":{"start":{"line":12,"column":12},"end":{"line":12,"column":68}},"9":{"start":{"line":12,"column":35},"end":{"line":12,"column":68}},"10":{"start":{"line":14,"column":26},"end":{"line":14,"column":44}},"11":{"start":{"line":16,"column":23},"end":{"line":16,"column":54}},"12":{"start":{"line":18,"column":12},"end":{"line":18,"column":56}},"13":{"start":{"line":18,"column":23},"end":{"line":18,"column":56}},"14":{"start":{"line":20,"column":12},"end":{"line":22,"column":13}},"15":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"16":{"start":{"line":26,"column":16},"end":{"line":26,"column":46}},"17":{"start":{"line":29,"column":12},"end":{"line":29,"column":18}},"18":{"start":{"line":31,"column":12},"end":{"line":31,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":34},"end":{"line":33,"column":5}},"line":5}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":12},"end":{"line":9,"column":63}},"type":"if","locations":[{"start":{"line":9,"column":12},"end":{"line":9,"column":63}},{"start":{},"end":{}}],"line":9},"1":{"loc":{"start":{"line":12,"column":12},"end":{"line":12,"column":68}},"type":"if","locations":[{"start":{"line":12,"column":12},"end":{"line":12,"column":68}},{"start":{},"end":{}}],"line":12},"2":{"loc":{"start":{"line":18,"column":12},"end":{"line":18,"column":56}},"type":"if","locations":[{"start":{"line":18,"column":12},"end":{"line":18,"column":56}},{"start":{},"end":{}}],"line":18},"3":{"loc":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"type":"if","locations":[{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},{"start":{},"end":{}}],"line":25}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":0,"7":3,"8":3,"9":0,"10":3,"11":3,"12":3,"13":0,"14":3,"15":3,"16":0,"17":3,"18":0},"f":{"0":3},"b":{"0":[0,3],"1":[0,3],"2":[0,3],"3":[0,3]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"bbffebc529f0bb6eb2fa7c12ff9b87bc8d33462a"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\models\\category.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\models\\category.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":32,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":14,"column":38}},"3":{"start":{"line":17,"column":2},"end":{"line":30,"column":5}},"4":{"start":{"line":31,"column":2},"end":{"line":31,"column":18}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":32,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":15,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e95b01164e86b5d1e8dd585e44eca2b5f8628438"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\models\\content.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\models\\content.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":42,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":14,"column":62}},"3":{"start":{"line":15,"column":6},"end":{"line":15,"column":70}},"4":{"start":{"line":18,"column":2},"end":{"line":40,"column":5}},"5":{"start":{"line":41,"column":2},"end":{"line":41,"column":17}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":42,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":16,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c3fdf3eeff227e8be22c26871674cd6cfc02b8a6"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\models\\index.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\models\\index.js","statementMap":{"0":{"start":{"line":3,"column":11},"end":{"line":3,"column":24}},"1":{"start":{"line":4,"column":13},"end":{"line":4,"column":28}},"2":{"start":{"line":5,"column":18},"end":{"line":5,"column":38}},"3":{"start":{"line":6,"column":16},"end":{"line":6,"column":34}},"4":{"start":{"line":7,"column":17},"end":{"line":7,"column":42}},"5":{"start":{"line":8,"column":12},"end":{"line":8,"column":49}},"6":{"start":{"line":9,"column":15},"end":{"line":9,"column":65}},"7":{"start":{"line":10,"column":11},"end":{"line":10,"column":13}},"8":{"start":{"line":13,"column":0},"end":{"line":17,"column":1}},"9":{"start":{"line":14,"column":2},"end":{"line":14,"column":74}},"10":{"start":{"line":16,"column":2},"end":{"line":16,"column":87}},"11":{"start":{"line":19,"column":0},"end":{"line":32,"column":5}},"12":{"start":{"line":22,"column":4},"end":{"line":27,"column":6}},"13":{"start":{"line":30,"column":18},"end":{"line":30,"column":85}},"14":{"start":{"line":31,"column":4},"end":{"line":31,"column":27}},"15":{"start":{"line":34,"column":0},"end":{"line":38,"column":3}},"16":{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},"17":{"start":{"line":36,"column":4},"end":{"line":36,"column":32}},"18":{"start":{"line":40,"column":0},"end":{"line":40,"column":25}},"19":{"start":{"line":41,"column":0},"end":{"line":41,"column":25}},"20":{"start":{"line":43,"column":0},"end":{"line":43,"column":20}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":21,"column":10},"end":{"line":21,"column":11}},"loc":{"start":{"line":21,"column":18},"end":{"line":28,"column":3}},"line":21},"1":{"name":"(anonymous_1)","decl":{"start":{"line":29,"column":11},"end":{"line":29,"column":12}},"loc":{"start":{"line":29,"column":19},"end":{"line":32,"column":3}},"line":29},"2":{"name":"(anonymous_2)","decl":{"start":{"line":34,"column":24},"end":{"line":34,"column":25}},"loc":{"start":{"line":34,"column":37},"end":{"line":38,"column":1}},"line":34}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":12},"end":{"line":8,"column":49}},"type":"binary-expr","locations":[{"start":{"line":8,"column":12},"end":{"line":8,"column":32}},{"start":{"line":8,"column":36},"end":{"line":8,"column":49}}],"line":8},"1":{"loc":{"start":{"line":13,"column":0},"end":{"line":17,"column":1}},"type":"if","locations":[{"start":{"line":13,"column":0},"end":{"line":17,"column":1}},{"start":{"line":15,"column":7},"end":{"line":17,"column":1}}],"line":13},"2":{"loc":{"start":{"line":23,"column":6},"end":{"line":26,"column":37}},"type":"binary-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":29}},{"start":{"line":24,"column":6},"end":{"line":24,"column":23}},{"start":{"line":25,"column":6},"end":{"line":25,"column":30}},{"start":{"line":26,"column":6},"end":{"line":26,"column":37}}],"line":23},"3":{"loc":{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},"type":"if","locations":[{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},{"start":{},"end":{}}],"line":35}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":0,"10":3,"11":3,"12":12,"13":9,"14":9,"15":3,"16":9,"17":9,"18":3,"19":3,"20":3},"f":{"0":12,"1":9,"2":9},"b":{"0":[3,0],"1":[0,3],"2":[12,12,9,9],"3":[9,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f9c6a732c4d9d746ec0e6c7ebb64afaf111baed4"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\models\\user.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\models\\user.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":54,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":14,"column":34}},"3":{"start":{"line":17,"column":2},"end":{"line":52,"column":5}},"4":{"start":{"line":53,"column":2},"end":{"line":53,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":54,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":15,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8faa60b4b6e25156802d2558f4fea05d3ef63d90"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\routes\\auth.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\routes\\auth.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":28},"end":{"line":2,"column":68}},"2":{"start":{"line":3,"column":15},"end":{"line":3,"column":31}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":34}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":28}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":23}}},"fnMap":{},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ed0d02590c042aec66d9c615f4e9551b2568c1f6"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\routes\\category.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\routes\\category.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":97},"end":{"line":2,"column":141}},"2":{"start":{"line":3,"column":20},"end":{"line":3,"column":53}},"3":{"start":{"line":4,"column":15},"end":{"line":4,"column":31}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":28}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":35}},"6":{"start":{"line":9,"column":0},"end":{"line":9,"column":19}},"7":{"start":{"line":11,"column":0},"end":{"line":11,"column":32}},"8":{"start":{"line":12,"column":0},"end":{"line":12,"column":38}},"9":{"start":{"line":13,"column":0},"end":{"line":13,"column":41}},"10":{"start":{"line":15,"column":0},"end":{"line":15,"column":23}}},"fnMap":{},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":3,"10":3},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"b0e8a2dd2e57616d1131fc5b277c8744346fa847"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\routes\\content.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\routes\\content.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":76},"end":{"line":2,"column":119}},"2":{"start":{"line":3,"column":15},"end":{"line":3,"column":31}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":27}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":31}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":37}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":40}},"7":{"start":{"line":10,"column":0},"end":{"line":10,"column":23}}},"fnMap":{},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"bbd94bda1c74e07d966a62db075ba0b458a8ed9b"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\routes\\index.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\routes\\index.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":21},"end":{"line":2,"column":59}},"2":{"start":{"line":3,"column":27},"end":{"line":3,"column":65}},"3":{"start":{"line":4,"column":15},"end":{"line":4,"column":31}},"4":{"start":{"line":6,"column":0},"end":{"line":8,"column":2}},"5":{"start":{"line":7,"column":4},"end":{"line":7,"column":55}},"6":{"start":{"line":10,"column":0},"end":{"line":10,"column":38}},"7":{"start":{"line":11,"column":0},"end":{"line":11,"column":36}},"8":{"start":{"line":13,"column":0},"end":{"line":13,"column":26}},"9":{"start":{"line":15,"column":0},"end":{"line":15,"column":45}},"10":{"start":{"line":16,"column":0},"end":{"line":16,"column":48}},"11":{"start":{"line":18,"column":0},"end":{"line":18,"column":24}},"12":{"start":{"line":20,"column":0},"end":{"line":20,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":16},"end":{"line":6,"column":17}},"loc":{"start":{"line":6,"column":30},"end":{"line":8,"column":1}},"line":6}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":0,"6":3,"7":3,"8":3,"9":3,"10":3,"11":3,"12":3},"f":{"0":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"aea987fe0855dff8e75551d9302f18e9eed8a721"} +,"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\routes\\pub.js": {"path":"F:\\000 Hacktive8\\Phase2\\Week3\\IP-RMT46\\server\\routes\\pub.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":33},"end":{"line":2,"column":72}},"2":{"start":{"line":3,"column":15},"end":{"line":3,"column":31}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":24}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":31}},"5":{"start":{"line":8,"column":0},"end":{"line":8,"column":23}}},"fnMap":{},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"9bbf92dfd15c8fcc34cd80ed1e28e2bc8dfe0077"} +} diff --git a/server/coverage/lcov-report/base.css b/server/coverage/lcov-report/base.css new file mode 100644 index 0000000..f418035 --- /dev/null +++ b/server/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/server/coverage/lcov-report/block-navigation.js b/server/coverage/lcov-report/block-navigation.js new file mode 100644 index 0000000..cc12130 --- /dev/null +++ b/server/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/server/coverage/lcov-report/favicon.png b/server/coverage/lcov-report/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 81.81% + Statements + 198/242 +
+ + +
+ 61.36% + Branches + 27/44 +
+ + +
+ 86.66% + Functions + 26/30 +
+ + +
+ 83.76% + Lines + 196/234 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
server +
+
100%8/8100%0/0100%0/0100%8/8
server/controllers +
+
74.72%68/9180%8/1084.61%11/1374.15%66/89
server/helpers +
+
88.88%8/9100%0/075%3/488.88%8/9
server/middlewares +
+
66.03%35/5350%12/24100%3/374.46%35/47
server/models +
+
97.29%36/3770%7/10100%9/997.29%36/37
server/routes +
+
97.72%43/44100%0/00%0/197.72%43/44
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/prettify.css b/server/coverage/lcov-report/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/server/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/server/coverage/lcov-report/prettify.js b/server/coverage/lcov-report/prettify.js new file mode 100644 index 0000000..b322523 --- /dev/null +++ b/server/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/server/coverage/lcov-report/server/app.js.html b/server/coverage/lcov-report/server/app.js.html new file mode 100644 index 0000000..ca3ffb2 --- /dev/null +++ b/server/coverage/lcov-report/server/app.js.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for server/app.js + + + + + + + + + +
+
+

All files / server app.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +143x +3x +3x +3x +  +3x +3x +3x +  +  +  +  +  +3x
const express = require('express')
+const router = require('./routes')
+const app = express()
+const port = 3000
+ 
+app.use(express.urlencoded({extended: true}))
+app.use(express.json())
+app.use(router)
+ 
+// app.listen(port, () => {
+//   console.log(`Example app listening on port ${port}`)
+// })
+ 
+module.exports = app
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/controllers/authController.js.html b/server/coverage/lcov-report/server/controllers/authController.js.html new file mode 100644 index 0000000..2443f72 --- /dev/null +++ b/server/coverage/lcov-report/server/controllers/authController.js.html @@ -0,0 +1,235 @@ + + + + + + Code coverage report for server/controllers/authController.js + + + + + + + + + +
+
+

All files / server/controllers authController.js

+
+ +
+ 100% + Statements + 22/22 +
+ + +
+ 100% + Branches + 8/8 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +513x +3x +3x +3x +  +3x +  +2x +2x +  +2x +  +1x +  +  +  +  +  +1x +  +  +  +  +4x +  +4x +  +4x +3x +  +2x +  +  +  +  +  +2x +1x +  +  +1x +  +  +  +1x +  +  +3x +  +  + 
const { compareSync } = require('bcryptjs')
+const { comparepaswd, hashPasswd } = require('../helpers/bcrypt')
+const { signToken } = require('../helpers/jwt')
+const { User } = require('../models')
+ 
+module.exports = class Controller {
+    static async register(req, res, next) {
+        try {
+            const { username, email, password } = req.body
+ 
+            await User.create({ username, email, password })
+ 
+            res.status(201).json({
+                username,
+                email
+            })
+        } catch (error) {
+            // console.log(error)
+            next(error)
+        }
+    }
+ 
+    static async login(req, res, next) {
+        try {
+            // console.log(req.body)
+            const { email, password } = req.body
+ 
+            if (!email) throw { status: 400, message: 'Email is required' }
+            if (!password) throw { status: 400, message: 'Password is required' }
+ 
+            let user = await User.findOne({
+                where: {
+                    email
+                }
+            })
+            // console.log(user)
+            if (!user || !compareSync(password, user.password)) {
+                throw { status: 401, message: 'Invalid email or password' }
+            }
+ 
+            let token = signToken({
+                id: user.id
+            })
+            // console.log(token)
+            res.status(200).json({ access_token: token })
+        } catch (error) {
+            // console.log(error)
+            next(error)
+        }
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/controllers/categoryController.js.html b/server/coverage/lcov-report/server/controllers/categoryController.js.html new file mode 100644 index 0000000..5e0e0a7 --- /dev/null +++ b/server/coverage/lcov-report/server/controllers/categoryController.js.html @@ -0,0 +1,295 @@ + + + + + + Code coverage report for server/controllers/categoryController.js + + + + + + + + + +
+
+

All files / server/controllers categoryController.js

+
+ +
+ 82.75% + Statements + 24/29 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 82.75% + Lines + 24/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +713x +  +3x +  +1x +1x +  +  +  +1x +  +  +  +  +  +  +1x +1x +  +1x +  +1x +  +  +  +  +  +  +1x +1x +  +1x +  +  +  +1x +  +  +  +  +  +  +1x +1x +  +1x +  +1x +  +1x +  +1x +  +  +  +  +  +  +1x +1x +  +1x +  +1x +  +1x +  +  +  +  + 
const { Category, Content } = require('../models')
+ 
+module.exports = class Controller {
+    static async getCategory(req, res, next) {
+        try {
+            let category = await Category.findAll({
+                include: Content
+            })
+ 
+            res.status(200).json(category)
+        } catch (error) {
+            next(error)
+        }
+    }
+ 
+    static async createCategory(req, res, next){
+        try {
+            const { name } = req.body
+ 
+            let newCategory = await Category.create({name})
+ 
+            res.status(201).json(newCategory)
+        } catch (error) {
+            next(error)
+        }
+    }
+ 
+    static async getCategoryById(req, res, next) {
+        try {
+            const id = req.params.id
+ 
+            let category = await Category.findByPk(id, {
+                include: Content
+            })
+ 
+            res.status(200).json(category)
+        } catch (error) {
+            next(error)
+        }
+    }
+ 
+    static async updateCategoryById(req, res, next) {
+        try {
+            const id = req.params.id
+ 
+            let category = await Category.findByPk(id)
+ 
+            const { name } = req.body
+ 
+            let updtCategory = await category.update({name})
+ 
+            res.status(200).json(updtCategory)
+        } catch (error) {
+            next(error)
+        }
+    }
+ 
+    static async deleteCategoryById(req, res, next){
+        try {
+            const id = req.params.id
+ 
+            let category = await Category.findByPk(id)
+ 
+            await category.destroy()
+ 
+            res.status(200).json({message: `${category.name} successfully deleted`})
+        } catch (error) {
+            next(error)
+        }
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/controllers/contentController.js.html b/server/coverage/lcov-report/server/controllers/contentController.js.html new file mode 100644 index 0000000..ea4d351 --- /dev/null +++ b/server/coverage/lcov-report/server/controllers/contentController.js.html @@ -0,0 +1,277 @@ + + + + + + Code coverage report for server/controllers/contentController.js + + + + + + + + + +
+
+

All files / server/controllers contentController.js

+
+ +
+ 80% + Statements + 20/25 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 80% + Lines + 20/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +653x +  +3x +  +1x +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +1x +  +  +  +1x +  +  +1x +  +  +  +  +  +  +1x +1x +  +1x +  +1x +  +1x +  +1x +  +  +  +  +  +  +  +1x +1x +  +1x +  +1x +  +1x +  +  +  +  + 
const { Content, Category } = require('../models')
+ 
+module.exports = class Controller{
+    static async getContent(req, res, next){
+        try {
+        let content = await Content.findAll({
+            include: {
+                model: Category,
+                // through: ContentTag
+            }
+        })
+ 
+            res.status(200).json(content)
+        } catch (error) {
+            console.log(error)
+            next(error)
+        }
+    }
+ 
+    static async createContent(req, res, next){
+        try {
+            const {title, description, CategoryId} = req.body
+ 
+            // console.log(title, description)
+ 
+            let newContent = await Content.create({title, description, CategoryId, UserId: req.user.id})
+ 
+            // console.log(newContent.dataValues)
+            res.status(201).json(newContent)
+        } catch (error) {
+            next(error)
+        }
+    }
+ 
+    static async updateContentById(req, res, next){
+        try {
+            const id = req.params.id
+ 
+            let content = await Content.findByPk(id)
+ 
+            const { title, description, CategoryId } = req.body
+ 
+            await content.update({title, description, CategoryId, UserId: req.user.id})
+ 
+            res.status(201).json(content)
+ 
+        } catch (error) {
+            next(error)
+        }
+    }
+ 
+    static async deleteContentById(req, res, next){
+        try {
+            const id = req.params.id
+ 
+            let content = await Content.findByPk(id)
+ 
+            await content.destroy()
+ 
+            res.status(201).json({message: `Deleted content ${content.title}`})
+        } catch (error) {
+            next(error)
+        }
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/controllers/index.html b/server/coverage/lcov-report/server/controllers/index.html new file mode 100644 index 0000000..036a517 --- /dev/null +++ b/server/coverage/lcov-report/server/controllers/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for server/controllers + + + + + + + + + +
+
+

All files server/controllers

+
+ +
+ 74.72% + Statements + 68/91 +
+ + +
+ 80% + Branches + 8/10 +
+ + +
+ 84.61% + Functions + 11/13 +
+ + +
+ 74.15% + Lines + 66/89 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
authController.js +
+
100%22/22100%8/8100%2/2100%20/20
categoryController.js +
+
82.75%24/29100%0/0100%5/582.75%24/29
contentController.js +
+
80%20/25100%0/0100%4/480%20/25
pubController.js +
+
13.33%2/150%0/20%0/213.33%2/15
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/controllers/pubController.js.html b/server/coverage/lcov-report/server/controllers/pubController.js.html new file mode 100644 index 0000000..273488c --- /dev/null +++ b/server/coverage/lcov-report/server/controllers/pubController.js.html @@ -0,0 +1,193 @@ + + + + + + Code coverage report for server/controllers/pubController.js + + + + + + + + + +
+
+

All files / server/controllers pubController.js

+
+ +
+ 13.33% + Statements + 2/15 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 13.33% + Lines + 2/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +373x +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
const axios = require('axios')
+ 
+module.exports = class Controller {
+    static async getData(req, res, next) {
+        try {
+            const response = await axios.get('https://hadeethenc.com/api/v1/hadeeths/list/?language=en&category_id=5&page=1')
+ 
+            console.log(response.data)
+ 
+            res.status(200).json(response.data)
+ 
+        } catch (error) {
+            next(error)
+        }
+    }
+ 
+    static async getDataById(req, res, next) {
+        try {
+            const id = req.params.id
+            let { language } = req.query
+ 
+            if (!language) {
+                language = `en`
+                // language translation: ar, en, fr, es, tr, ur, id, bs, ru, bn, zh, fa, hi, vi, si, ug
+                // console.log(language)
+            }
+ 
+            const response = await axios.get(`https://hadeethenc.com/api/v1/hadeeths/one/?language=${language}&id=${id}`)
+ 
+            // console.log(response.data)
+ 
+            res.status(200).json(response.data)
+        } catch (error) {
+            next(error)
+        }
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/helpers/bcrypt.js.html b/server/coverage/lcov-report/server/helpers/bcrypt.js.html new file mode 100644 index 0000000..a84aa0b --- /dev/null +++ b/server/coverage/lcov-report/server/helpers/bcrypt.js.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for server/helpers/bcrypt.js + + + + + + + + + +
+
+

All files / server/helpers bcrypt.js

+
+ +
+ 75% + Statements + 3/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 75% + Lines + 3/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +63x +  +3x +4x +  + 
const bcrypt = require('bcryptjs')
+ 
+module.exports = {
+    hashPasswd: (password) => bcrypt.hashSync(password, 10),
+    comparepaswd: (password) => bcrypt.compareSync(password, this.hashPasswd)
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/helpers/index.html b/server/coverage/lcov-report/server/helpers/index.html new file mode 100644 index 0000000..88baa3b --- /dev/null +++ b/server/coverage/lcov-report/server/helpers/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for server/helpers + + + + + + + + + +
+
+

All files server/helpers

+
+ +
+ 88.88% + Statements + 8/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 88.88% + Lines + 8/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
bcrypt.js +
+
75%3/4100%0/050%1/275%3/4
jwt.js +
+
100%5/5100%0/0100%2/2100%5/5
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/helpers/jwt.js.html b/server/coverage/lcov-report/server/helpers/jwt.js.html new file mode 100644 index 0000000..3f6e57e --- /dev/null +++ b/server/coverage/lcov-report/server/helpers/jwt.js.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for server/helpers/jwt.js + + + + + + + + + +
+
+

All files / server/helpers jwt.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +143x +3x +  +  +3x +  +  +  +12x +  +  +3x +  + 
const jwt = require('jsonwebtoken')
+const secret = 'rahasia'
+ 
+function signToken(payload){
+    return jwt.sign(payload, secret)
+}
+ 
+function verifyToken(payload){
+    return jwt.verify(payload, secret)
+}
+ 
+module.exports = {
+    signToken, verifyToken
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/index.html b/server/coverage/lcov-report/server/index.html new file mode 100644 index 0000000..b7220fe --- /dev/null +++ b/server/coverage/lcov-report/server/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for server + + + + + + + + + +
+
+

All files server

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
app.js +
+
100%8/8100%0/0100%0/0100%8/8
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/middlewares/authenticate.js.html b/server/coverage/lcov-report/server/middlewares/authenticate.js.html new file mode 100644 index 0000000..d766828 --- /dev/null +++ b/server/coverage/lcov-report/server/middlewares/authenticate.js.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for server/middlewares/authenticate.js + + + + + + + + + +
+
+

All files / server/middlewares authenticate.js

+
+ +
+ 76.47% + Statements + 13/17 +
+ + +
+ 50% + Branches + 3/6 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 92.85% + Lines + 13/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +303x +3x +  +3x +  +9x +9x +9x +  +9x +9x +  +9x +  +9x +  +9x +  +9x +  +  +  +  +9x +  +  +  +  +  + 
const { verifyToken } = require('../helpers/jwt')
+const { User } = require('../models')
+ 
+module.exports = {
+    async authentication(req, res, next) {
+        try {
+            let access_token = req.headers.authorization
+            Iif (!access_token) throw { name: 'Unauthenticated' }
+ 
+            let [type, token] = access_token.split(' ')
+            Iif(type !== 'Bearer') throw { name: 'Unauthenticated' }
+ 
+            let payload = verifyToken(token)
+ 
+            let user = await User.findByPk(payload.id)
+ 
+            Iif(!user) throw { name: 'Unauthenticated' }
+ 
+            req.user = {
+                id: user.id,
+                role: user.role
+            }
+ 
+            next()
+        } catch (error) {
+            // console.log(error)
+            next(error)
+        }
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/middlewares/errorHandler.js.html b/server/coverage/lcov-report/server/middlewares/errorHandler.js.html new file mode 100644 index 0000000..2cc3e44 --- /dev/null +++ b/server/coverage/lcov-report/server/middlewares/errorHandler.js.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for server/middlewares/errorHandler.js + + + + + + + + + +
+
+

All files / server/middlewares errorHandler.js

+
+ +
+ 47.05% + Statements + 8/17 +
+ + +
+ 50% + Branches + 5/10 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 47.05% + Lines + 8/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +273x +4x +4x +  +4x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x + 
module.exports = (error, req, res, next) => {
+    let status = error.status || 500
+    let message = error.message || 'Internal server error'
+ 
+    switch(error.name){
+        case 'SequelizeValidationError':
+        case 'SequelizeUniqueConstraintError':
+            status = 400
+            message = error.errors[0].message
+            break
+        case 'JsonWebTokenError':
+        case 'Unauthenticated':
+            status = 401
+            message = 'Invalid Token'
+            break
+        case 'Unauthorized':
+            status = 403
+            message = 'Forbiden access'
+            break
+        case 'Not Found':
+            status = 404
+            message = 'Data not found'
+            break
+    }
+ 
+    res.status(status).json({ message })
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/middlewares/index.html b/server/coverage/lcov-report/server/middlewares/index.html new file mode 100644 index 0000000..d4232b0 --- /dev/null +++ b/server/coverage/lcov-report/server/middlewares/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for server/middlewares + + + + + + + + + +
+
+

All files server/middlewares

+
+ +
+ 66.03% + Statements + 35/53 +
+ + +
+ 50% + Branches + 12/24 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 74.46% + Lines + 35/47 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
authenticate.js +
+
76.47%13/1750%3/6100%1/192.85%13/14
errorHandler.js +
+
47.05%8/1750%5/10100%1/147.05%8/17
isAdmin.js +
+
73.68%14/1950%4/8100%1/187.5%14/16
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/middlewares/isAdmin.js.html b/server/coverage/lcov-report/server/middlewares/isAdmin.js.html new file mode 100644 index 0000000..0ef642b --- /dev/null +++ b/server/coverage/lcov-report/server/middlewares/isAdmin.js.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for server/middlewares/isAdmin.js + + + + + + + + + +
+
+

All files / server/middlewares isAdmin.js

+
+ +
+ 73.68% + Statements + 14/19 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 87.5% + Lines + 14/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +343x +3x +  +3x +  +3x +3x +  +3x +  +3x +3x +  +3x +  +3x +  +3x +  +3x +  +  +  +  +3x +  +  +  +3x +  +  +  +  + 
const { verifyToken } = require('../helpers/jwt')
+const { User } = require('../models')
+ 
+module.exports = {
+    async isAdmin(req, res, next) {
+        try {
+            let accessToken = req.headers.authorization
+ 
+            Iif (!accessToken) throw { name: "Unauthenticated" }
+ 
+            let [type, token] = accessToken.split(' ')
+            Iif (type !== 'Bearer') throw { name: "Unauthenticated" }
+ 
+            let payload = verifyToken(token)
+ 
+            let user = await User.findByPk(payload.id)
+ 
+            Iif (!user) throw { name: "Unauthenticated" }
+ 
+            req.user = {
+                role: user.role
+            }
+ 
+ 
+            Iif (req.user.role !== 'admin') {
+                throw { name: "Unauthorized" }
+            }
+ 
+            next()
+        } catch (error) {
+            next(error)
+        }
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/models/category.js.html b/server/coverage/lcov-report/server/models/category.js.html new file mode 100644 index 0000000..2ba5f56 --- /dev/null +++ b/server/coverage/lcov-report/server/models/category.js.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for server/models/category.js + + + + + + + + + +
+
+

All files / server/models category.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32  +  +  +3x +3x +  +  +  +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +3x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class Category extends Model {
+    /**
+     * Helper method for defining associations.
+     * This method is not a part of Sequelize lifecycle.
+     * The `models/index` file will call this method automatically.
+     */
+    static associate(models) {
+      // define association here
+      Category.hasMany(models.Content)
+    }
+  }
+  Category.init({
+    name: {
+      type: DataTypes.STRING,
+      unique: true,
+      allowNull: false,
+      validate: {
+        notNull: { msg: 'Category name is required' },
+        notEmpty: { msg: 'Category name is required' }
+      }
+    }
+  }, {
+    sequelize,
+    modelName: 'Category',
+  });
+  return Category;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/models/content.js.html b/server/coverage/lcov-report/server/models/content.js.html new file mode 100644 index 0000000..ee8706b --- /dev/null +++ b/server/coverage/lcov-report/server/models/content.js.html @@ -0,0 +1,208 @@ + + + + + + Code coverage report for server/models/content.js + + + + + + + + + +
+
+

All files / server/models content.js

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42  +  +  +3x +3x +  +  +  +  +  +  +  +  +3x +3x +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class Content extends Model {
+    /**
+     * Helper method for defining associations.
+     * This method is not a part of Sequelize lifecycle.
+     * The `models/index` file will call this method automatically.
+     */
+    static associate(models) {
+      // define association here
+      Content.belongsTo(models.User, { foreignKey: 'UserId' })
+      Content.belongsTo(models.Category, { foreignKey: 'CategoryId' })
+    }
+  }
+  Content.init({
+    title: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notNull: { msg: 'Title is required' },
+        notEmpty: { msg: 'Title is required' }
+      }
+    },
+    description: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notNull: { msg: 'Description is required' },
+        notEmpty: { msg: 'Description is required' }
+      }
+    },
+    UserId: DataTypes.INTEGER,
+    CategoryId: DataTypes.INTEGER
+  }, {
+    sequelize,
+    modelName: 'Content',
+  });
+  return Content;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/models/index.html b/server/coverage/lcov-report/server/models/index.html new file mode 100644 index 0000000..f81c46d --- /dev/null +++ b/server/coverage/lcov-report/server/models/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for server/models + + + + + + + + + +
+
+

All files server/models

+
+ +
+ 97.29% + Statements + 36/37 +
+ + +
+ 70% + Branches + 7/10 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 97.29% + Lines + 36/37 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
category.js +
+
100%5/5100%0/0100%2/2100%5/5
content.js +
+
100%6/6100%0/0100%2/2100%6/6
index.js +
+
95.23%20/2170%7/10100%3/395.23%20/21
user.js +
+
100%5/5100%0/0100%2/2100%5/5
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/models/index.js.html b/server/coverage/lcov-report/server/models/index.js.html new file mode 100644 index 0000000..1ab32be --- /dev/null +++ b/server/coverage/lcov-report/server/models/index.js.html @@ -0,0 +1,214 @@ + + + + + + Code coverage report for server/models/index.js + + + + + + + + + +
+
+

All files / server/models index.js

+
+ +
+ 95.23% + Statements + 20/21 +
+ + +
+ 70% + Branches + 7/10 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 95.23% + Lines + 20/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44  +  +3x +3x +3x +3x +3x +3x +3x +3x +  +  +3x +  +  +3x +  +  +3x +  +  +12x +  +  +  +  +  +  +  +9x +9x +  +  +3x +9x +9x +  +  +  +3x +3x +  +3x + 
'use strict';
+ 
+const fs = require('fs');
+const path = require('path');
+const Sequelize = require('sequelize');
+const process = require('process');
+const basename = path.basename(__filename);
+const env = process.env.NODE_ENV || 'development';
+const config = require(__dirname + '/../config/config.json')[env];
+const db = {};
+ 
+let sequelize;
+Iif (config.use_env_variable) {
+  sequelize = new Sequelize(process.env[config.use_env_variable], config);
+} else {
+  sequelize = new Sequelize(config.database, config.username, config.password, config);
+}
+ 
+fs
+  .readdirSync(__dirname)
+  .filter(file => {
+    return (
+      file.indexOf('.') !== 0 &&
+      file !== basename &&
+      file.slice(-3) === '.js' &&
+      file.indexOf('.test.js') === -1
+    );
+  })
+  .forEach(file => {
+    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
+    db[model.name] = model;
+  });
+ 
+Object.keys(db).forEach(modelName => {
+  Eif (db[modelName].associate) {
+    db[modelName].associate(db);
+  }
+});
+ 
+db.sequelize = sequelize;
+db.Sequelize = Sequelize;
+ 
+module.exports = db;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/models/user.js.html b/server/coverage/lcov-report/server/models/user.js.html new file mode 100644 index 0000000..9cda13c --- /dev/null +++ b/server/coverage/lcov-report/server/models/user.js.html @@ -0,0 +1,244 @@ + + + + + + Code coverage report for server/models/user.js + + + + + + + + + +
+
+

All files / server/models user.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54  +  +  +3x +3x +  +  +  +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class User extends Model {
+    /**
+     * Helper method for defining associations.
+     * This method is not a part of Sequelize lifecycle.
+     * The `models/index` file will call this method automatically.
+     */
+    static associate(models) {
+      // define association here
+      User.hasMany(models.Content)
+    }
+  }
+  User.init({
+    username: {
+      type: DataTypes.STRING,
+      unique: true,
+      allowNull: false,
+      validate: {
+        notNull: { msg: 'Username is required' },
+        notEmpty: { msg: 'Username is required' }
+      }
+    },
+    email: {
+      type: DataTypes.STRING,
+      unique: true,
+      allowNull: false,
+      validate: {
+        notNull: {msg: 'Email is required'},
+        notEmpty: {msg: 'Email is required'},
+        isEmail: {msg: 'Email is incorrect'}
+      }
+    },
+    password: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notNull: {msg: 'Password is required'},
+        notEmpty: {msg: 'Password is required'}
+      }
+    },
+    role: {
+      type: DataTypes.STRING,
+      defaultValue: 'user'
+    }
+  }, {
+    sequelize,
+    modelName: 'User',
+  });
+  return User;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/routes/auth.js.html b/server/coverage/lcov-report/server/routes/auth.js.html new file mode 100644 index 0000000..0a59171 --- /dev/null +++ b/server/coverage/lcov-report/server/routes/auth.js.html @@ -0,0 +1,106 @@ + + + + + + Code coverage report for server/routes/auth.js + + + + + + + + + +
+
+

All files / server/routes auth.js

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +83x +3x +3x +  +3x +3x +  +3x
const express = require('express')
+const { register, login } = require('../controllers/authController')
+const router = express.Router()
+ 
+router.post('/register', register)
+router.post('/login', login)
+ 
+module.exports = router
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/routes/category.js.html b/server/coverage/lcov-report/server/routes/category.js.html new file mode 100644 index 0000000..81f098d --- /dev/null +++ b/server/coverage/lcov-report/server/routes/category.js.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for server/routes/category.js + + + + + + + + + +
+
+

All files / server/routes category.js

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +153x +3x +3x +3x +  +3x +3x +  +3x +  +3x +3x +3x +  +3x
const express = require('express')
+const { getCategory, getCategoryById, updateCategoryById, deleteCategoryById, createCategory } = require('../controllers/categoryController')
+const { isAdmin } = require('../middlewares/isAdmin')
+const router = express.Router()
+ 
+router.get('/', getCategory)
+router.get('/:id', getCategoryById)
+ 
+router.use(isAdmin)
+ 
+router.post('/', createCategory)
+router.put('/:id', updateCategoryById)
+router.delete('/:id', deleteCategoryById)
+ 
+module.exports = router
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/routes/content.js.html b/server/coverage/lcov-report/server/routes/content.js.html new file mode 100644 index 0000000..44193c8 --- /dev/null +++ b/server/coverage/lcov-report/server/routes/content.js.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for server/routes/content.js + + + + + + + + + +
+
+

All files / server/routes content.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +103x +3x +3x +  +3x +3x +3x +3x +  +3x
const express = require('express')
+const { getContent, createContent, updateContentById, deleteContentById } = require('../controllers/contentController')
+const router = express.Router()
+ 
+router.get('/', getContent)
+router.post('/', createContent)
+router.put('/:id', updateContentById)
+router.delete('/:id', deleteContentById)
+ 
+module.exports = router
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/routes/index.html b/server/coverage/lcov-report/server/routes/index.html new file mode 100644 index 0000000..6921f96 --- /dev/null +++ b/server/coverage/lcov-report/server/routes/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for server/routes + + + + + + + + + +
+
+

All files server/routes

+
+ +
+ 97.72% + Statements + 43/44 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 97.72% + Lines + 43/44 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
auth.js +
+
100%6/6100%0/0100%0/0100%6/6
category.js +
+
100%11/11100%0/0100%0/0100%11/11
content.js +
+
100%8/8100%0/0100%0/0100%8/8
index.js +
+
92.3%12/13100%0/00%0/192.3%12/13
pub.js +
+
100%6/6100%0/0100%0/0100%6/6
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/routes/index.js.html b/server/coverage/lcov-report/server/routes/index.js.html new file mode 100644 index 0000000..5275174 --- /dev/null +++ b/server/coverage/lcov-report/server/routes/index.js.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for server/routes/index.js + + + + + + + + + +
+
+

All files / server/routes index.js

+
+ +
+ 92.3% + Statements + 12/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 92.3% + Lines + 12/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +203x +3x +3x +3x +  +3x +  +  +  +3x +3x +  +3x +  +3x +3x +  +3x +  +3x
const express = require('express')
+const errorHandler = require('../middlewares/errorHandler')
+const { authentication } = require('../middlewares/authenticate')
+const router = express.Router()
+ 
+router.get('/', (req, res) => {
+    res.status(200).json({ message: 'Server success' })
+})
+ 
+router.use('/auth', require('./auth'))
+router.use('/pub', require('./pub'))
+ 
+router.use(authentication)
+ 
+router.use('/contents', require('./content'))
+router.use('/categories', require('./category'))
+ 
+router.use(errorHandler)
+ 
+module.exports = router
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/routes/pub.js.html b/server/coverage/lcov-report/server/routes/pub.js.html new file mode 100644 index 0000000..4856f80 --- /dev/null +++ b/server/coverage/lcov-report/server/routes/pub.js.html @@ -0,0 +1,106 @@ + + + + + + Code coverage report for server/routes/pub.js + + + + + + + + + +
+
+

All files / server/routes pub.js

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +83x +3x +3x +  +3x +3x +  +3x
const express = require('express')
+const { getData, getDataById } = require('../controllers/pubController')
+const router = express.Router()
+ 
+router.get('/', getData)
+router.get('/:id', getDataById)
+ 
+module.exports = router
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/sort-arrow-sprite.png b/server/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/server/coverage/lcov-report/sorter.js b/server/coverage/lcov-report/sorter.js new file mode 100644 index 0000000..2bb296a --- /dev/null +++ b/server/coverage/lcov-report/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/server/coverage/lcov.info b/server/coverage/lcov.info new file mode 100644 index 0000000..6be3781 --- /dev/null +++ b/server/coverage/lcov.info @@ -0,0 +1,509 @@ +TN: +SF:app.js +FNF:0 +FNH:0 +DA:1,3 +DA:2,3 +DA:3,3 +DA:4,3 +DA:6,3 +DA:7,3 +DA:8,3 +DA:14,3 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:controllers\authController.js +FN:7,(anonymous_0) +FN:23,(anonymous_1) +FNF:2 +FNH:2 +FNDA:2,(anonymous_0) +FNDA:4,(anonymous_1) +DA:1,3 +DA:2,3 +DA:3,3 +DA:4,3 +DA:6,3 +DA:8,2 +DA:9,2 +DA:11,2 +DA:13,1 +DA:19,1 +DA:24,4 +DA:26,4 +DA:28,4 +DA:29,3 +DA:31,2 +DA:37,2 +DA:38,1 +DA:41,1 +DA:45,1 +DA:48,3 +LF:20 +LH:20 +BRDA:28,0,0,1 +BRDA:28,0,1,3 +BRDA:29,1,0,1 +BRDA:29,1,1,2 +BRDA:37,2,0,1 +BRDA:37,2,1,1 +BRDA:37,3,0,2 +BRDA:37,3,1,1 +BRF:8 +BRH:8 +end_of_record +TN: +SF:controllers\categoryController.js +FN:4,(anonymous_0) +FN:16,(anonymous_1) +FN:28,(anonymous_2) +FN:42,(anonymous_3) +FN:58,(anonymous_4) +FNF:5 +FNH:5 +FNDA:1,(anonymous_0) +FNDA:1,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:1,(anonymous_4) +DA:1,3 +DA:3,3 +DA:5,1 +DA:6,1 +DA:10,1 +DA:12,0 +DA:17,1 +DA:18,1 +DA:20,1 +DA:22,1 +DA:24,0 +DA:29,1 +DA:30,1 +DA:32,1 +DA:36,1 +DA:38,0 +DA:43,1 +DA:44,1 +DA:46,1 +DA:48,1 +DA:50,1 +DA:52,1 +DA:54,0 +DA:59,1 +DA:60,1 +DA:62,1 +DA:64,1 +DA:66,1 +DA:68,0 +LF:29 +LH:24 +BRF:0 +BRH:0 +end_of_record +TN: +SF:controllers\contentController.js +FN:4,(anonymous_0) +FN:20,(anonymous_1) +FN:35,(anonymous_2) +FN:52,(anonymous_3) +FNF:4 +FNH:4 +FNDA:1,(anonymous_0) +FNDA:1,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:1,(anonymous_3) +DA:1,3 +DA:3,3 +DA:5,1 +DA:6,1 +DA:13,1 +DA:15,0 +DA:16,0 +DA:21,1 +DA:22,1 +DA:26,1 +DA:29,1 +DA:31,0 +DA:36,1 +DA:37,1 +DA:39,1 +DA:41,1 +DA:43,1 +DA:45,1 +DA:48,0 +DA:53,1 +DA:54,1 +DA:56,1 +DA:58,1 +DA:60,1 +DA:62,0 +LF:25 +LH:20 +BRF:0 +BRH:0 +end_of_record +TN: +SF:controllers\pubController.js +FN:4,(anonymous_0) +FN:17,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +DA:1,3 +DA:3,3 +DA:5,0 +DA:6,0 +DA:8,0 +DA:10,0 +DA:13,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:22,0 +DA:23,0 +DA:28,0 +DA:32,0 +DA:34,0 +LF:15 +LH:2 +BRDA:22,0,0,0 +BRDA:22,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:helpers\bcrypt.js +FN:4,(anonymous_0) +FN:5,(anonymous_1) +FNF:2 +FNH:1 +FNDA:4,(anonymous_0) +FNDA:0,(anonymous_1) +DA:1,3 +DA:3,3 +DA:4,4 +DA:5,0 +LF:4 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:helpers\jwt.js +FN:4,signToken +FN:8,verifyToken +FNF:2 +FNH:2 +FNDA:3,signToken +FNDA:12,verifyToken +DA:1,3 +DA:2,3 +DA:5,3 +DA:9,12 +DA:12,3 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:middlewares\authenticate.js +FN:5,(anonymous_0) +FNF:1 +FNH:1 +FNDA:9,(anonymous_0) +DA:1,3 +DA:2,3 +DA:4,3 +DA:6,9 +DA:7,9 +DA:8,9 +DA:10,9 +DA:11,9 +DA:13,9 +DA:15,9 +DA:17,9 +DA:19,9 +DA:24,9 +DA:27,0 +LF:14 +LH:13 +BRDA:8,0,0,0 +BRDA:8,0,1,9 +BRDA:11,1,0,0 +BRDA:11,1,1,9 +BRDA:17,2,0,0 +BRDA:17,2,1,9 +BRF:6 +BRH:3 +end_of_record +TN: +SF:middlewares\errorHandler.js +FN:1,(anonymous_0) +FNF:1 +FNH:1 +FNDA:4,(anonymous_0) +DA:1,3 +DA:2,4 +DA:3,4 +DA:5,4 +DA:8,1 +DA:9,1 +DA:10,1 +DA:13,0 +DA:14,0 +DA:15,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:26,4 +LF:17 +LH:8 +BRDA:2,0,0,4 +BRDA:2,0,1,1 +BRDA:3,1,0,4 +BRDA:3,1,1,0 +BRDA:5,2,0,1 +BRDA:5,2,1,1 +BRDA:5,2,2,0 +BRDA:5,2,3,0 +BRDA:5,2,4,0 +BRDA:5,2,5,0 +BRF:10 +BRH:5 +end_of_record +TN: +SF:middlewares\isAdmin.js +FN:5,(anonymous_0) +FNF:1 +FNH:1 +FNDA:3,(anonymous_0) +DA:1,3 +DA:2,3 +DA:4,3 +DA:6,3 +DA:7,3 +DA:9,3 +DA:11,3 +DA:12,3 +DA:14,3 +DA:16,3 +DA:18,3 +DA:20,3 +DA:25,3 +DA:26,0 +DA:29,3 +DA:31,0 +LF:16 +LH:14 +BRDA:9,0,0,0 +BRDA:9,0,1,3 +BRDA:12,1,0,0 +BRDA:12,1,1,3 +BRDA:18,2,0,0 +BRDA:18,2,1,3 +BRDA:25,3,0,0 +BRDA:25,3,1,3 +BRF:8 +BRH:4 +end_of_record +TN: +SF:models\category.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:2 +FNDA:3,(anonymous_0) +FNDA:3,(anonymous_1) +DA:4,3 +DA:5,3 +DA:14,3 +DA:17,3 +DA:31,3 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:models\content.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:2 +FNDA:3,(anonymous_0) +FNDA:3,(anonymous_1) +DA:4,3 +DA:5,3 +DA:14,3 +DA:15,3 +DA:18,3 +DA:41,3 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:models\index.js +FN:21,(anonymous_0) +FN:29,(anonymous_1) +FN:34,(anonymous_2) +FNF:3 +FNH:3 +FNDA:12,(anonymous_0) +FNDA:9,(anonymous_1) +FNDA:9,(anonymous_2) +DA:3,3 +DA:4,3 +DA:5,3 +DA:6,3 +DA:7,3 +DA:8,3 +DA:9,3 +DA:10,3 +DA:13,3 +DA:14,0 +DA:16,3 +DA:19,3 +DA:22,12 +DA:30,9 +DA:31,9 +DA:34,3 +DA:35,9 +DA:36,9 +DA:40,3 +DA:41,3 +DA:43,3 +LF:21 +LH:20 +BRDA:8,0,0,3 +BRDA:8,0,1,0 +BRDA:13,1,0,0 +BRDA:13,1,1,3 +BRDA:23,2,0,12 +BRDA:23,2,1,12 +BRDA:23,2,2,9 +BRDA:23,2,3,9 +BRDA:35,3,0,9 +BRDA:35,3,1,0 +BRF:10 +BRH:7 +end_of_record +TN: +SF:models\user.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:2 +FNDA:3,(anonymous_0) +FNDA:3,(anonymous_1) +DA:4,3 +DA:5,3 +DA:14,3 +DA:17,3 +DA:53,3 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:routes\auth.js +FNF:0 +FNH:0 +DA:1,3 +DA:2,3 +DA:3,3 +DA:5,3 +DA:6,3 +DA:8,3 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:routes\category.js +FNF:0 +FNH:0 +DA:1,3 +DA:2,3 +DA:3,3 +DA:4,3 +DA:6,3 +DA:7,3 +DA:9,3 +DA:11,3 +DA:12,3 +DA:13,3 +DA:15,3 +LF:11 +LH:11 +BRF:0 +BRH:0 +end_of_record +TN: +SF:routes\content.js +FNF:0 +FNH:0 +DA:1,3 +DA:2,3 +DA:3,3 +DA:5,3 +DA:6,3 +DA:7,3 +DA:8,3 +DA:10,3 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:routes\index.js +FN:6,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:1,3 +DA:2,3 +DA:3,3 +DA:4,3 +DA:6,3 +DA:7,0 +DA:10,3 +DA:11,3 +DA:13,3 +DA:15,3 +DA:16,3 +DA:18,3 +DA:20,3 +LF:13 +LH:12 +BRF:0 +BRH:0 +end_of_record +TN: +SF:routes\pub.js +FNF:0 +FNH:0 +DA:1,3 +DA:2,3 +DA:3,3 +DA:5,3 +DA:6,3 +DA:8,3 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record diff --git a/server/middlewares/isAdmin.js b/server/middlewares/isAdmin.js index 3a5a1ec..f0862b5 100644 --- a/server/middlewares/isAdmin.js +++ b/server/middlewares/isAdmin.js @@ -1,3 +1,4 @@ +const { verifyToken } = require('../helpers/jwt') const { User } = require('../models') module.exports = { @@ -21,7 +22,7 @@ module.exports = { } - if (req.user.role !== 'Admin') { + if (req.user.role !== 'admin') { throw { name: "Unauthorized" } } diff --git a/server/models/user.js b/server/models/user.js index a223ac5..a2746f5 100644 --- a/server/models/user.js +++ b/server/models/user.js @@ -15,9 +15,33 @@ module.exports = (sequelize, DataTypes) => { } } User.init({ - username: DataTypes.STRING, - email: DataTypes.STRING, - password: DataTypes.STRING, + username: { + type: DataTypes.STRING, + unique: true, + allowNull: false, + validate: { + notNull: { msg: 'Username is required' }, + notEmpty: { msg: 'Username is required' } + } + }, + email: { + type: DataTypes.STRING, + unique: true, + allowNull: false, + validate: { + notNull: {msg: 'Email is required'}, + notEmpty: {msg: 'Email is required'}, + isEmail: {msg: 'Email is incorrect'} + } + }, + password: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notNull: {msg: 'Password is required'}, + notEmpty: {msg: 'Password is required'} + } + }, role: { type: DataTypes.STRING, defaultValue: 'user' diff --git a/server/package.json b/server/package.json index 9a7fc58..ddd86d7 100644 --- a/server/package.json +++ b/server/package.json @@ -13,5 +13,17 @@ }, "devDependencies": { "sequelize-cli": "^6.6.2" - } + }, + "name": "server", + "version": "1.0.0", + "main": "app.js", + "scripts": { + "test": "jest --verbose --runInBand --detectOpenHandles --coverage", + "start": "node bin/www", + "dev": "nodemon bin/www" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "" } diff --git a/server/routes/index.js b/server/routes/index.js index 5c86d0d..18565c8 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -10,7 +10,7 @@ router.get('/', (req, res) => { router.use('/auth', require('./auth')) router.use('/pub', require('./pub')) -// router.use(authentication) +router.use(authentication) router.use('/contents', require('./content')) router.use('/categories', require('./category')) From 2567cd5bf21b33c7b6fb2fb52d478fb8c779907e Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Thu, 14 Mar 2024 20:48:48 +0700 Subject: [PATCH 19/48] feat: progress api docs --- README.md | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0052992..098b5cc 100644 --- a/README.md +++ b/README.md @@ -1 +1,99 @@ -# IP-RMT46 \ No newline at end of file +# IP-RMT46 + +# API DOCS + +## Rest API Endpoints + +List of available endpoints: + + + GET /pub + GET /pub/:id + + POST /register + POST /login + + GET /contents + POST /contents + PUT /contents/:id + DELETE /contents/:id + + GET /categories + GET /categories/:id + POST /categories + PUT /categories/:id + DELETE /categories/:id + +## GET /pub + +Get public data. + +_Response (200 - OK)_ + + { + data: [ + { + id: string, + title: string, + translations: [Array] + }, + ..., + ], + "meta": + { + "current_page": "1", + "last_page": 35, + "total_items": 697, + "per_page": 20 + } + } + +## GET /pub/:id +Get specific public data by Id. + +- Request Params: + + ``` + { + id: integer + } + ``` + +_Response (200-OK)_ + + + { + id: integer, + title: string, + hadeeth: text, + attribution: string, + grade: string, + explanation: text, + hints: [Array], + categories: [Array], + translations: [Array] + } + +## POST /register + +## POST /login + +## GET /contents + +## GET /contents/:id + +## POST /contents + +## PUT /contents/:id + +## DELETE /contents/:id + +## GET /categories + +## GET /categories/:id + +## POST /categories + +## PUT /categories/:id + +## DELETE /categories/:id \ No newline at end of file From fd375e81d7b379da76a1099b7d1936cc7fe1fb2d Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Fri, 15 Mar 2024 04:49:26 +0700 Subject: [PATCH 20/48] docs: readme api docs --- README.md | 305 +++++++++++++++++++++++- server/controllers/contentController.js | 4 +- 2 files changed, 294 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 098b5cc..d5fc2e9 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,9 @@ _Response (200 - OK)_ { data: [ { - id: string, - title: string, - translations: [Array] + "id": "string", + "title": "string", + "translations": [Array] }, ..., ], @@ -63,37 +63,316 @@ _Response (200-OK)_ { - id: integer, - title: string, - hadeeth: text, - attribution: string, - grade: string, - explanation: text, - hints: [Array], - categories: [Array], - translations: [Array] + "id": "integer", + "title": "string", + "hadeeth": "text", + "attribution": "string", + "grade": "string", + "explanation": "text", + "hints": [Array], + "categories": [Array], + "translations": [Array] } ## POST /register +Register a new user + +- Request Body + + ``` + { + "username": "string", + "email": "string", + "password": "string" + } + ``` + + _Response (200 - OK)_ + ``` + { + "username": "string", + "email" : "string" + } ## POST /login +Log in an existing user + +- Request Body + + ``` + { + "email": "string", + "password": "string" + } + ``` + + _Response (200 - OK)_ + ``` + { + "accessToken": "" + } + ``` ## GET /contents +Get all contents + +- headers: +```json +{ + "Authorization": "Bearer " +} +``` + +_Response (200 - OK)_ + + [ + { + "id": "integer", + "title": "string", + "description": "text", + "UserId": "integer", + "CategoryId": "integer", + "createdAt": "date", + "updatedAt": "date", + "Category": { + "id": "integer", + "name": "String", + "createdAt": "date", + "updatedAt": "date" + } + } + ] ## GET /contents/:id +Get content by id + +- headers: +```json +{ + "Authorization": "Bearer " +} +``` + +_Request Params_ + + { + "id" : "integer" + } + +_Response (200 - OK)_ + + { + "title" : "string", + "description" : "text", + "CategoryId" : "integer: + } ## POST /contents +Create a new content + +- headers: +```json +{ + "Authorization": "Bearer " +} +``` + +_Request Body_ + + { + "title" : "string", + "description" : "text", + "CategoryId" : "integer: + } + +_Response (200 - OK)_ + + { + "title" : "string", + "description" : "text", + "CategoryId" : "integer: + } + ## PUT /contents/:id +Update content by Id + +- headers: +```json +{ + "Authorization": "Bearer " +} +``` + +_Request Params_ + + { + "id": "integer" + } + +_Request Body_ + + { + "title" : "string", + "description" : "text", + "CategoryId" : "integer: + } + +_Response (200 - OK)_ + + { + "title" : "string", + "description" : "text", + "CategoryId" : "integer: + } + ## DELETE /contents/:id +Delete content by Id + +- headers: +```json +{ + "Authorization": "Bearer " +} +``` + +_Request Params_ + + { + "id": "integer" + } + +_Request Body_ + + { + "title" : "string", + "description" : "text", + "CategoryId" : "integer: + } + +_Response (200 - OK)_ + + { + message: `Deleted content ` + } ## GET /categories +Get all categories + +- headers: +```json +{ + "Authorization": "Bearer " +} +``` + +_Response (200 - OK)_ + + [ + { + "name": "string" + }, + ..., + ] ## GET /categories/:id +Get specific category by Id + +- headers: +```json +{ + "Authorization": "Bearer " +} +``` + +_Request Params_ + + { + "id" : "integer" + } + +_Response (200 - OK)_ + + { + "name" : "string" + } ## POST /categories +Create a new category (only admin) + +- headers: +```json +{ + "Authorization": "Bearer " +} +``` + +_Request Body_ + + { + "name": "string" + } + +_Response (200 - OK)_ + + { + "name": "string" + } ## PUT /categories/:id +Update category by Id + +- headers: +```json +{ + "Authorization": "Bearer " +} +``` + +_Request Params_ + + { + "id": "integer" + } + +_Request Body_ + + { + "name": "string" + } + +_Response (200 - OK)_ + + { + "name": "string" + } -## DELETE /categories/:id \ No newline at end of file + +## DELETE /categories/:id +Delete category by Id + +- headers: +```json +{ + "Authorization": "Bearer " +} +``` + +_Request Params_ + + { + "id": "integer" + } + +_Request Body_ + + { + "name": "string" + } + +_Response (200 - OK)_ + + { + "name": "string" + } diff --git a/server/controllers/contentController.js b/server/controllers/contentController.js index 6a19c18..422478e 100644 --- a/server/controllers/contentController.js +++ b/server/controllers/contentController.js @@ -42,7 +42,7 @@ module.exports = class Controller{ await content.update({title, description, CategoryId, UserId: req.user.id}) - res.status(201).json(content) + res.status(200).json(content) } catch (error) { next(error) @@ -57,7 +57,7 @@ module.exports = class Controller{ await content.destroy() - res.status(201).json({message: `Deleted content ${content.title}`}) + res.status(200).json({message: `Deleted content ${content.title}`}) } catch (error) { next(error) } From 06c8b70d6c2c2eab3f844b797d08bebda0da9db8 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Fri, 15 Mar 2024 04:54:26 +0700 Subject: [PATCH 21/48] refactor: testing --- server/.gitignore | 3 ++- server/__test__/content-route.test.js | 4 ++-- server/coverage/clover.xml | 4 ++-- server/coverage/lcov-report/index.html | 2 +- server/coverage/lcov-report/server/app.js.html | 2 +- .../lcov-report/server/controllers/authController.js.html | 2 +- .../server/controllers/categoryController.js.html | 2 +- .../server/controllers/contentController.js.html | 6 +++--- server/coverage/lcov-report/server/controllers/index.html | 2 +- .../lcov-report/server/controllers/pubController.js.html | 2 +- server/coverage/lcov-report/server/helpers/bcrypt.js.html | 2 +- server/coverage/lcov-report/server/helpers/index.html | 2 +- server/coverage/lcov-report/server/helpers/jwt.js.html | 2 +- server/coverage/lcov-report/server/index.html | 2 +- .../lcov-report/server/middlewares/authenticate.js.html | 2 +- .../lcov-report/server/middlewares/errorHandler.js.html | 2 +- server/coverage/lcov-report/server/middlewares/index.html | 2 +- .../coverage/lcov-report/server/middlewares/isAdmin.js.html | 2 +- server/coverage/lcov-report/server/models/category.js.html | 2 +- server/coverage/lcov-report/server/models/content.js.html | 2 +- server/coverage/lcov-report/server/models/index.html | 2 +- server/coverage/lcov-report/server/models/index.js.html | 2 +- server/coverage/lcov-report/server/models/user.js.html | 2 +- server/coverage/lcov-report/server/routes/auth.js.html | 2 +- server/coverage/lcov-report/server/routes/category.js.html | 2 +- server/coverage/lcov-report/server/routes/content.js.html | 2 +- server/coverage/lcov-report/server/routes/index.html | 2 +- server/coverage/lcov-report/server/routes/index.js.html | 2 +- server/coverage/lcov-report/server/routes/pub.js.html | 2 +- 29 files changed, 34 insertions(+), 33 deletions(-) diff --git a/server/.gitignore b/server/.gitignore index b512c09..3091757 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -1 +1,2 @@ -node_modules \ No newline at end of file +node_modules +coverage \ No newline at end of file diff --git a/server/__test__/content-route.test.js b/server/__test__/content-route.test.js index 4c18728..a656e0a 100644 --- a/server/__test__/content-route.test.js +++ b/server/__test__/content-route.test.js @@ -77,7 +77,7 @@ describe('PUT /contents/:id', () => { console.log(status) console.log(body) - expect(status).toBe(201) + expect(status).toBe(200) }) }) }) @@ -89,7 +89,7 @@ describe('DELETE /contents/:id', () => { console.log(status) console.log(body) - expect(status).toBe(201) + expect(status).toBe(200) }) }) }) diff --git a/server/coverage/clover.xml b/server/coverage/clover.xml index 66310dc..2db4d71 100644 --- a/server/coverage/clover.xml +++ b/server/coverage/clover.xml @@ -1,6 +1,6 @@ - - + + diff --git a/server/coverage/lcov-report/index.html b/server/coverage/lcov-report/index.html index dcb26d9..77805b1 100644 --- a/server/coverage/lcov-report/index.html +++ b/server/coverage/lcov-report/index.html @@ -176,7 +176,7 @@

All files

+ Islamic Education + + +
- - + + + \ No newline at end of file diff --git a/client-side/client/package-lock.json b/client-side/client/package-lock.json index a3c959e..f04dcfa 100644 --- a/client-side/client/package-lock.json +++ b/client-side/client/package-lock.json @@ -8,8 +8,13 @@ "name": "client", "version": "0.0.0", "dependencies": { + "@tabler/icons-react": "^3.1.0", + "axios": "^1.6.7", + "bootstrap": "^5.3.3", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-router": "^6.22.3", + "react-router-dom": "^6.22.3", "sequelize": "^6.37.1" }, "devDependencies": { @@ -637,6 +642,24 @@ "node": ">=14" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", + "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", @@ -1016,6 +1039,30 @@ "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", "dev": true }, + "node_modules/@tabler/icons": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.1.0.tgz", + "integrity": "sha512-CpZGyS1IVJKFcv88yZ2sYZIpWWhQ6oy76BQKQ5SF0fGgOqgyqKdBGG/YGyyMW632on37MX7VqQIMTzN/uQqmFg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.1.0.tgz", + "integrity": "sha512-k/WTlax2vbj/LpxvaJ+BmaLAAhVUgyLj4Ftgaczz66tUSNzqrAZXCFdOU7cRMYPNVBqyqE2IdQd2rzzhDEJvkw==", + "dependencies": { + "@tabler/icons": "3.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": ">= 16" + } + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -1107,18 +1154,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -1202,11 +1237,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, "node_modules/array-includes": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", @@ -1337,6 +1367,11 @@ "has-symbols": "^1.0.3" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -1361,6 +1396,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1373,42 +1418,24 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1419,26 +1446,11 @@ "concat-map": "0.0.1" } }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1523,6 +1535,17 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -1548,38 +1571,6 @@ "proto-list": "~1.2.1" } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1639,6 +1630,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1668,21 +1660,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=0.4.0" } }, "node_modules/doctrine": { @@ -1765,25 +1748,12 @@ "node": ">=10" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/es-abstract": { "version": "1.22.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", @@ -1843,6 +1813,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -1854,6 +1825,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -2023,11 +1995,6 @@ "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2262,14 +2229,6 @@ "node": ">=0.10.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -2280,60 +2239,6 @@ "es5-ext": "~0.10.14" } }, - "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -2382,36 +2287,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2448,6 +2323,25 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -2473,20 +2367,17 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, "engines": { - "node": ">= 0.6" + "node": ">= 6" } }, "node_modules/fs-extra": { @@ -2528,6 +2419,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2572,6 +2464,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -2669,6 +2562,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -2710,6 +2604,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -2721,6 +2616,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -2732,6 +2628,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -2758,6 +2655,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -2765,32 +2663,6 @@ "node": ">= 0.4" } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -2846,7 +2718,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/ini": { "version": "1.3.8", @@ -2868,14 +2741,6 @@ "node": ">= 0.4" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -3473,14 +3338,6 @@ "es5-ext": "~0.10.2" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/memoizee": { "version": "0.4.15", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", @@ -3497,30 +3354,6 @@ "timers-ext": "^0.1.7" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -3609,14 +3442,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -3651,6 +3476,7 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3743,17 +3569,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3810,11 +3625,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3827,14 +3637,6 @@ "node": ">=6" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3893,94 +3695,11 @@ "node": "14 || >=16.14" } }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/pg": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", - "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", - "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.6.2", - "pg-pool": "^3.6.1", - "pg-protocol": "^1.6.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - }, - "engines": { - "node": ">= 8.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.1.1" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", - "optional": true - }, "node_modules/pg-connection-string": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", - "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dependencies": { - "split2": "^4.1.0" - } - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -4024,41 +3743,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4085,17 +3769,10 @@ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/punycode": { "version": "2.3.1", @@ -4106,20 +3783,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -4140,28 +3803,6 @@ } ] }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -4191,6 +3832,36 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "node_modules/react-router": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", + "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "dependencies": { + "@remix-run/router": "1.15.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", + "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "dependencies": { + "@remix-run/router": "1.15.3", + "react-router": "6.22.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", @@ -4368,25 +4039,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", @@ -4404,11 +4056,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -4426,47 +4073,6 @@ "semver": "bin/semver.js" } }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "node_modules/sequelize": { "version": "6.37.1", "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.1.tgz", @@ -4589,24 +4195,11 @@ "node": ">=10" } }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -4634,11 +4227,6 @@ "node": ">= 0.4" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4664,6 +4252,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -4698,22 +4287,6 @@ "node": ">=0.10.0" } }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -4885,14 +4458,6 @@ "next-tick": "1" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/toposort-class": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", @@ -4928,18 +4493,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", @@ -5054,14 +4607,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -5071,14 +4616,6 @@ "punycode": "^2.1.0" } }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -5095,14 +4632,6 @@ "node": ">= 0.10" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/vite": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", @@ -5301,14 +4830,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/client-side/client/package.json b/client-side/client/package.json index 1891634..e1bbd9a 100644 --- a/client-side/client/package.json +++ b/client-side/client/package.json @@ -10,8 +10,13 @@ "preview": "vite preview" }, "dependencies": { + "@tabler/icons-react": "^3.1.0", + "axios": "^1.6.7", + "bootstrap": "^5.3.3", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-router": "^6.22.3", + "react-router-dom": "^6.22.3", "sequelize": "^6.37.1" }, "devDependencies": { diff --git a/client-side/client/src/App.jsx b/client-side/client/src/App.jsx index b8b8473..31f68ac 100644 --- a/client-side/client/src/App.jsx +++ b/client-side/client/src/App.jsx @@ -1,33 +1,11 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' -import './App.css' +import { RouterProvider } from "react-router-dom" +import router from "./Router" function App() { - const [count, setCount] = useState(0) return ( <> - -

Vite + React

-
- -

- Edit src/App.jsx and save to test HMR -

-
-

- Click on the Vite and React logos to learn more -

+ ) } diff --git a/client-side/client/src/Router.jsx b/client-side/client/src/Router.jsx new file mode 100644 index 0000000..2ec5efa --- /dev/null +++ b/client-side/client/src/Router.jsx @@ -0,0 +1,29 @@ +import { createBrowserRouter } from "react-router-dom" +import Home from "./views/Home" +import Public from "./views/Public" +import Login from "./components/Login" +import ContentPage from "./components/ContentPage" + +const router = createBrowserRouter( + [ + + { + path: '/', + element: + }, + { + path: '/pub', + element: + }, + { + path: '/login', + element: + }, + { + path: '/contents', + element: + } + ] +) + +export default router \ No newline at end of file diff --git a/client-side/client/src/components/ContentPage.jsx b/client-side/client/src/components/ContentPage.jsx new file mode 100644 index 0000000..8d3fd04 --- /dev/null +++ b/client-side/client/src/components/ContentPage.jsx @@ -0,0 +1,31 @@ +import axios from "axios" +import { useEffect, useState } from "react" + + +export default function ContentPage(){ + const [data, setData] = useState([]) + + const fetchData = async () => { + try { + const response = await axios.get('http://localhost:3000/contents', { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + } + }) + + console.log(response.data) + } catch (error) { + console.log(error) + } + } + + useEffect(() => { + fetchData() + }, []) + + return( + <> + + + ) +} \ No newline at end of file diff --git a/client-side/client/src/components/ImageHome.jsx b/client-side/client/src/components/ImageHome.jsx new file mode 100644 index 0000000..f015cd3 --- /dev/null +++ b/client-side/client/src/components/ImageHome.jsx @@ -0,0 +1,15 @@ + + +export default function ImageHome() { + + return ( + <> +
+ Bootstrap Image Preview +
+ + ) +} \ No newline at end of file diff --git a/client-side/client/src/components/Login.jsx b/client-side/client/src/components/Login.jsx new file mode 100644 index 0000000..178a0ec --- /dev/null +++ b/client-side/client/src/components/Login.jsx @@ -0,0 +1,87 @@ +import axios from "axios" +import { useEffect, useState } from "react" +import { useNavigate } from "react-router" +import { Link } from "react-router-dom" + +export default function Login() { + const navigate = useNavigate() + const [email, setEmail] = useState([]) + const [password, setPassword] = useState([]) + + const handleOnSubmit = async (e) => { + e.preventDefault() + try { + const response = await axios.post('http://localhost:3000/auth/login', { + email, password + }) + + localStorage.setItem('access_token', response.data.access_token) + console.log(response.data) + + navigate('/contents') + } catch (error) { + console.log(error) + } + } + + return ( + <> +
+
+
+ + { + setEmail(e.target.value) + // console.log(email) + }} + /> +
+ We'll never share your email with anyone else. +
+
+
+ + { + setPassword(e.target.value) + // console.log(password) + }} + /> +
+
+
+ +

+
+ +
+
+
+
+ or +
+
+
+ + ) +} \ No newline at end of file diff --git a/client-side/client/src/components/PrayerTime.jsx b/client-side/client/src/components/PrayerTime.jsx new file mode 100644 index 0000000..9dc3014 --- /dev/null +++ b/client-side/client/src/components/PrayerTime.jsx @@ -0,0 +1,47 @@ +import axios from 'axios' +import { useEffect, useState } from 'react'; + +export default function PrayerTime(){ + const [time, setTime] = useState({}) + + const fetchData = async () => { + try { + const options = { + method: 'GET', + url: 'https://prayer-times11.p.rapidapi.com/timingsByCity/new%20Date()', + params: { + method: '2', + city: 'Depok', + country: 'Indonesia' + }, + headers: { + Accept: 'application/json', + 'X-RapidAPI-Key': '09c85fe558mshfde7ff537933352p18207djsn874742403006', + 'X-RapidAPI-Host': 'prayer-times11.p.rapidapi.com' + } + }; + + const response = await axios.request(options) + + console.log(response.data.data.timings) + + setTime(response.data.data.timings) + } catch (error) { + console.log(error) + } + } + + useEffect(() => { + fetchData() + }, []) + + return( + <> +
+
+ +
+
+ + ) +} \ No newline at end of file diff --git a/client-side/client/src/components/Register.jsx b/client-side/client/src/components/Register.jsx new file mode 100644 index 0000000..2a65400 --- /dev/null +++ b/client-side/client/src/components/Register.jsx @@ -0,0 +1,10 @@ + + +export default function Register(){ + + return( + <> + + + ) +} \ No newline at end of file diff --git a/client-side/client/src/components/TextHome.jsx b/client-side/client/src/components/TextHome.jsx new file mode 100644 index 0000000..94f2a86 --- /dev/null +++ b/client-side/client/src/components/TextHome.jsx @@ -0,0 +1,19 @@ +import { Link } from "react-router-dom"; + + +export default function TextHome() { + + return ( + <> +

Islamic Education

+

+ Islam is a religion based on the Koran and Hadith. Therefore, good Islamic education comes from both. And Hadith is what comes from the prophet Muhammad. So we provide a collection of hadiths that can be used as references and reminders +

+

+ + View details » + +

+ + ) +} \ No newline at end of file diff --git a/client-side/client/src/main.jsx b/client-side/client/src/main.jsx index 54b39dd..32ef1f0 100644 --- a/client-side/client/src/main.jsx +++ b/client-side/client/src/main.jsx @@ -1,10 +1,10 @@ import React from 'react' import ReactDOM from 'react-dom/client' import App from './App.jsx' -import './index.css' +// import './index.css' ReactDOM.createRoot(document.getElementById('root')).render( - + // - , + // {/* , */} ) diff --git a/client-side/client/src/views/Home.jsx b/client-side/client/src/views/Home.jsx new file mode 100644 index 0000000..c5720dc --- /dev/null +++ b/client-side/client/src/views/Home.jsx @@ -0,0 +1,27 @@ +import ImageHome from "../components/ImageHome"; +import PrayerTime from "../components/PrayerTime"; +import TextHome from "../components/TextHome"; + + +export default function Home() { + + return ( + <> +
+
+ +
+ +
+
+
+
+
+ +
+
+
+
+ + ) +} \ No newline at end of file diff --git a/client-side/client/src/views/Public.jsx b/client-side/client/src/views/Public.jsx new file mode 100644 index 0000000..fbcda70 --- /dev/null +++ b/client-side/client/src/views/Public.jsx @@ -0,0 +1,119 @@ +import axios from "axios" +import { useEffect, useState } from "react" +import { Link } from "react-router-dom" + +export default function Public() { + const [data, setData] = useState([]) + + const fetchData = async () => { + try { + const response = await axios.get('http://localhost:3000/pub') + + console.log(response.data.data) + + setData(response.data.data) + } catch (error) { + console.log(error) + } + } + + useEffect(() => { + fetchData() + }, []) + + return ( + <> +
+
+
+ + +
+
+
+
+
+
+
+ + + ) +} \ No newline at end of file From 883cb72e55b2f672ab12268671f4e4be56350e2d Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Sat, 16 Mar 2024 02:04:32 +0700 Subject: [PATCH 24/48] feat: register --- client-side/client/src/Router.jsx | 20 +++- .../client/src/components/ContentPage.jsx | 5 +- client-side/client/src/components/Login.jsx | 9 +- client-side/client/src/components/Navbar.jsx | 90 ++++++++++++++++++ .../client/src/components/Register.jsx | 89 +++++++++++++++++- client-side/client/src/views/Public.jsx | 93 ++----------------- 6 files changed, 207 insertions(+), 99 deletions(-) create mode 100644 client-side/client/src/components/Navbar.jsx diff --git a/client-side/client/src/Router.jsx b/client-side/client/src/Router.jsx index 2ec5efa..7cf41ba 100644 --- a/client-side/client/src/Router.jsx +++ b/client-side/client/src/Router.jsx @@ -1,8 +1,9 @@ -import { createBrowserRouter } from "react-router-dom" +import { createBrowserRouter, redirect } from "react-router-dom" import Home from "./views/Home" import Public from "./views/Public" import Login from "./components/Login" import ContentPage from "./components/ContentPage" +import Register from "./components/Register" const router = createBrowserRouter( [ @@ -15,13 +16,26 @@ const router = createBrowserRouter( path: '/pub', element: }, + { + path: '/register', + element: , + loader: () => { + return localStorage.getItem('access_token') ? redirect('/contents') : null + } + }, { path: '/login', - element: + element: , + loader: () => { + return localStorage.getItem('access_token') ? redirect('/contents') : null + } }, { path: '/contents', - element: + element: , + loader: () => { + return !localStorage.getItem('access_token') ? redirect('/login') : null + } } ] ) diff --git a/client-side/client/src/components/ContentPage.jsx b/client-side/client/src/components/ContentPage.jsx index 8d3fd04..b1cc1e3 100644 --- a/client-side/client/src/components/ContentPage.jsx +++ b/client-side/client/src/components/ContentPage.jsx @@ -1,5 +1,6 @@ import axios from "axios" import { useEffect, useState } from "react" +import Navbar from "./Navbar" export default function ContentPage(){ @@ -7,7 +8,7 @@ export default function ContentPage(){ const fetchData = async () => { try { - const response = await axios.get('http://localhost:3000/contents', { + const response = await axios.get('https://project.mf-cyberse.online/contents', { headers: { Authorization: `Bearer ${localStorage.getItem('access_token')}` } @@ -25,7 +26,7 @@ export default function ContentPage(){ return( <> - + ) } \ No newline at end of file diff --git a/client-side/client/src/components/Login.jsx b/client-side/client/src/components/Login.jsx index 178a0ec..4175890 100644 --- a/client-side/client/src/components/Login.jsx +++ b/client-side/client/src/components/Login.jsx @@ -11,7 +11,7 @@ export default function Login() { const handleOnSubmit = async (e) => { e.preventDefault() try { - const response = await axios.post('http://localhost:3000/auth/login', { + const response = await axios.post('https://project.mf-cyberse.online/auth/login', { email, password }) @@ -64,10 +64,10 @@ export default function Login() { }} /> -
+

@@ -76,9 +76,10 @@ export default function Login() {
+ Don't have an account? Register First!
- or + or
diff --git a/client-side/client/src/components/Navbar.jsx b/client-side/client/src/components/Navbar.jsx new file mode 100644 index 0000000..11221bf --- /dev/null +++ b/client-side/client/src/components/Navbar.jsx @@ -0,0 +1,90 @@ +import { Link } from "react-router-dom"; + + +export default function Navbar() { + + + return ( + <> + + + ) +} \ No newline at end of file diff --git a/client-side/client/src/components/Register.jsx b/client-side/client/src/components/Register.jsx index 2a65400..dfda4e2 100644 --- a/client-side/client/src/components/Register.jsx +++ b/client-side/client/src/components/Register.jsx @@ -1,10 +1,93 @@ +import axios from "axios" +import { useState } from "react" +import { useNavigate } from "react-router" -export default function Register(){ +export default function Register() { + // const [newUser, setNewUser] = useState({}) + const [username, setUsername] = useState('') + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const navigate = useNavigate() - return( + // console.log(newUser) + + const handleOnSubmit = async (e) => { + e.preventDefault() + try { + const response = await axios.post('https://project.mf-cyberse.online/auth/register', { + username, email, password + }) + + console.log(response.data) + // console.log(newUser) + navigate('/login') + } catch (error) { + console.log(error) + } + } + + return ( <> - +
+
+
+ + { + setUsername(e.target.value) + console.log({username}) + }} + /> +
+
+ + { + setEmail(e.target.value) + console.log({email}) + }} + /> +
+
+ + { + setPassword(e.target.value) + console.log({password}) + }} + /> +
+ + +
+ +
) } \ No newline at end of file diff --git a/client-side/client/src/views/Public.jsx b/client-side/client/src/views/Public.jsx index fbcda70..82383bb 100644 --- a/client-side/client/src/views/Public.jsx +++ b/client-side/client/src/views/Public.jsx @@ -1,6 +1,7 @@ import axios from "axios" import { useEffect, useState } from "react" import { Link } from "react-router-dom" +import Navbar from "../components/Navbar" export default function Public() { const [data, setData] = useState([]) @@ -23,97 +24,15 @@ export default function Public() { return ( <> +
-
-
- -
+
+
TEST
+
TEST TOO
-
-
-
-
-
+
) } \ No newline at end of file From b8711872c0fe86e2c5d254f0d882ea81a4c90a83 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Sat, 16 Mar 2024 02:04:59 +0700 Subject: [PATCH 25/48] refactor: hooks user --- server/.gitignore | 15 ++++++++++++++- server/app.js | 8 +++++--- server/controllers/pubController.js | 2 +- server/helpers/jwt.js | 2 +- server/models/user.js | 6 ++++++ server/package-lock.json | 25 +++++++++++++++++++++++++ server/package.json | 1 + 7 files changed, 53 insertions(+), 6 deletions(-) diff --git a/server/.gitignore b/server/.gitignore index a95458a..9099bf7 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -2,4 +2,17 @@ node_modules coverage IP-mf.pem .env -notes.txt \ No newline at end of file +notes.txt + +module.exports = { + apps: { + name: "IP-mf", + script: "./app.js", + env: { + NODE_ENV: "production", + PORT: 80, + JWT_SECRET:"secret", + DATABASE_URL:"//postgres.xjogikziohkbupghmroe:X1XqhCoAH8NtK1ZY@aws-0-ap-southeast-1.pooler.supabase.com:5432/postgres" + } + } +} \ No newline at end of file diff --git a/server/app.js b/server/app.js index 9acbbdc..7a2ab15 100644 --- a/server/app.js +++ b/server/app.js @@ -1,14 +1,16 @@ const express = require('express') const router = require('./routes') +const cors = require('cors') const app = express() const port = 3000 +app.use(cors()) app.use(express.urlencoded({extended: true})) app.use(express.json()) app.use(router) -// app.listen(port, () => { -// console.log(`Example app listening on port ${port}`) -// }) +app.listen(port, () => { + console.log(`Example app listening on port ${port}`) +}) module.exports = app \ No newline at end of file diff --git a/server/controllers/pubController.js b/server/controllers/pubController.js index ee546a0..e0abc95 100644 --- a/server/controllers/pubController.js +++ b/server/controllers/pubController.js @@ -5,7 +5,7 @@ module.exports = class Controller { try { const response = await axios.get('https://hadeethenc.com/api/v1/hadeeths/list/?language=en&category_id=5&page=1') - console.log(response.data) + // console.log(response.data) res.status(200).json(response.data) diff --git a/server/helpers/jwt.js b/server/helpers/jwt.js index d44776b..385e2a4 100644 --- a/server/helpers/jwt.js +++ b/server/helpers/jwt.js @@ -1,5 +1,5 @@ const jwt = require('jsonwebtoken') -const secret = process.env.JWT_SECRET +const secret = 'secret' function signToken(payload){ return jwt.sign(payload, secret) diff --git a/server/models/user.js b/server/models/user.js index a2746f5..78a8e1c 100644 --- a/server/models/user.js +++ b/server/models/user.js @@ -2,6 +2,7 @@ const { Model } = require('sequelize'); +const { hashPasswd } = require('../helpers/bcrypt'); module.exports = (sequelize, DataTypes) => { class User extends Model { /** @@ -49,6 +50,11 @@ module.exports = (sequelize, DataTypes) => { }, { sequelize, modelName: 'User', + hooks: { + beforeCreate: (user, options) => { + user.password = hashPasswd(user.password) + } + } }); return User; }; \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index 00aa93e..f4943cf 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,12 +1,17 @@ { "name": "server", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "server", + "version": "1.0.0", + "license": "ISC", "dependencies": { "axios": "^1.6.7", "bcryptjs": "^2.4.3", + "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.18.3", "jest": "^29.7.0", @@ -1927,6 +1932,18 @@ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -4294,6 +4311,14 @@ "node": ">=8" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", diff --git a/server/package.json b/server/package.json index ddd86d7..2ec60bb 100644 --- a/server/package.json +++ b/server/package.json @@ -2,6 +2,7 @@ "dependencies": { "axios": "^1.6.7", "bcryptjs": "^2.4.3", + "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.18.3", "jest": "^29.7.0", From 1426e8c3656f43a9f4099e6f3e918f20ba731525 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Sat, 16 Mar 2024 11:10:29 +0700 Subject: [PATCH 26/48] feat: added 3rd party api with apiKey --- client-side/client/package-lock.json | 99 +++++++++++++++- client-side/client/package.json | 2 + client-side/client/public/1_pict.png | Bin 0 -> 55694 bytes client-side/client/public/bg1.png | Bin 0 -> 148205 bytes client-side/client/src/assets/1 pict.png | Bin 0 -> 55694 bytes .../client/src/components/ContentPage.jsx | 23 +++- .../client/src/components/ImageHome.jsx | 2 +- .../client/src/components/PrayerTime.jsx | 112 +++++++++++++++--- .../client/src/components/TextHome.jsx | 8 +- client-side/client/src/main.jsx | 8 +- client-side/client/src/store.js | 5 + client-side/client/src/views/Home.jsx | 31 +++-- 12 files changed, 250 insertions(+), 40 deletions(-) create mode 100644 client-side/client/public/1_pict.png create mode 100644 client-side/client/public/bg1.png create mode 100644 client-side/client/src/assets/1 pict.png create mode 100644 client-side/client/src/store.js diff --git a/client-side/client/package-lock.json b/client-side/client/package-lock.json index f04dcfa..bd3e91d 100644 --- a/client-side/client/package-lock.json +++ b/client-side/client/package-lock.json @@ -8,11 +8,13 @@ "name": "client", "version": "0.0.0", "dependencies": { + "@reduxjs/toolkit": "^2.2.1", "@tabler/icons-react": "^3.1.0", "axios": "^1.6.7", "bootstrap": "^5.3.3", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-redux": "^9.1.0", "react-router": "^6.22.3", "react-router-dom": "^6.22.3", "sequelize": "^6.37.1" @@ -652,6 +654,29 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.1.tgz", + "integrity": "sha512-8CREoqJovQW/5I4yvvijm/emUiCCmcs4Ev4XPWd4mizSO+dD3g5G6w34QK5AGeNrSH7qM8Fl66j4vuV7dpOdkw==", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.0.1" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@remix-run/router": { "version": "1.15.3", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", @@ -1094,13 +1119,13 @@ "version": "15.7.11", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "dev": true + "devOptional": true }, "node_modules/@types/react": { "version": "18.2.65", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.65.tgz", "integrity": "sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ==", - "dev": true, + "devOptional": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -1120,7 +1145,12 @@ "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true + "devOptional": true + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, "node_modules/@types/validator": { "version": "13.11.9", @@ -1589,7 +1619,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "devOptional": true }, "node_modules/d": { "version": "1.0.2", @@ -2672,6 +2702,15 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.4.tgz", + "integrity": "sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -3832,6 +3871,32 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "node_modules/react-redux": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz", + "integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==", + "dependencies": { + "@types/use-sync-external-store": "^0.0.3", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25", + "react": "^18.0", + "react-native": ">=0.69", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-router": { "version": "6.22.3", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", @@ -3862,6 +3927,19 @@ "react-dom": ">=16.8" } }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", @@ -3910,6 +3988,11 @@ "node": ">=0.10.0" } }, + "node_modules/reselect": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz", + "integrity": "sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==" + }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -4616,6 +4699,14 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", diff --git a/client-side/client/package.json b/client-side/client/package.json index e1bbd9a..cd472c0 100644 --- a/client-side/client/package.json +++ b/client-side/client/package.json @@ -10,11 +10,13 @@ "preview": "vite preview" }, "dependencies": { + "@reduxjs/toolkit": "^2.2.1", "@tabler/icons-react": "^3.1.0", "axios": "^1.6.7", "bootstrap": "^5.3.3", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-redux": "^9.1.0", "react-router": "^6.22.3", "react-router-dom": "^6.22.3", "sequelize": "^6.37.1" diff --git a/client-side/client/public/1_pict.png b/client-side/client/public/1_pict.png new file mode 100644 index 0000000000000000000000000000000000000000..26ef889d955d99c21c79f45d216a57316fba29d0 GIT binary patch literal 55694 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 literal 0 HcmV?d00001 diff --git a/client-side/client/public/bg1.png b/client-side/client/public/bg1.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca902da8685bb9a2df29f0ea2af19819160238e GIT binary patch literal 148205 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 literal 0 HcmV?d00001 diff --git a/client-side/client/src/assets/1 pict.png b/client-side/client/src/assets/1 pict.png new file mode 100644 index 0000000000000000000000000000000000000000..26ef889d955d99c21c79f45d216a57316fba29d0 GIT binary patch literal 55694 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 literal 0 HcmV?d00001 diff --git a/client-side/client/src/components/ContentPage.jsx b/client-side/client/src/components/ContentPage.jsx index b1cc1e3..2afe194 100644 --- a/client-side/client/src/components/ContentPage.jsx +++ b/client-side/client/src/components/ContentPage.jsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react" import Navbar from "./Navbar" -export default function ContentPage(){ +export default function ContentPage() { const [data, setData] = useState([]) const fetchData = async () => { @@ -15,6 +15,7 @@ export default function ContentPage(){ }) console.log(response.data) + setData(response.data) } catch (error) { console.log(error) } @@ -24,9 +25,25 @@ export default function ContentPage(){ fetchData() }, []) - return( + return ( <> - + +

) } \ No newline at end of file diff --git a/client-side/client/src/components/ImageHome.jsx b/client-side/client/src/components/ImageHome.jsx index f015cd3..29aa7a7 100644 --- a/client-side/client/src/components/ImageHome.jsx +++ b/client-side/client/src/components/ImageHome.jsx @@ -7,7 +7,7 @@ export default function ImageHome() {
Bootstrap Image Preview
diff --git a/client-side/client/src/components/PrayerTime.jsx b/client-side/client/src/components/PrayerTime.jsx index 9dc3014..a1733d4 100644 --- a/client-side/client/src/components/PrayerTime.jsx +++ b/client-side/client/src/components/PrayerTime.jsx @@ -1,25 +1,25 @@ import axios from 'axios' import { useEffect, useState } from 'react'; -export default function PrayerTime(){ +export default function PrayerTime() { const [time, setTime] = useState({}) - + const fetchData = async () => { try { const options = { method: 'GET', - url: 'https://prayer-times11.p.rapidapi.com/timingsByCity/new%20Date()', + url: 'https://prayer-times11.p.rapidapi.com/timingsByCity/16-03-2024', params: { - method: '2', - city: 'Depok', - country: 'Indonesia' + method: '5', + city: 'Jakarta', + country: 'Indonesia' }, headers: { - Accept: 'application/json', - 'X-RapidAPI-Key': '09c85fe558mshfde7ff537933352p18207djsn874742403006', - 'X-RapidAPI-Host': 'prayer-times11.p.rapidapi.com' + Accept: 'application/json', + 'X-RapidAPI-Key': '09c85fe558mshfde7ff537933352p18207djsn874742403006', + 'X-RapidAPI-Host': 'prayer-times11.p.rapidapi.com' } - }; + }; const response = await axios.request(options) @@ -31,17 +31,97 @@ export default function PrayerTime(){ } } + // Mendapatkan waktu sekarang + let currentTime = new Date(); + + let maghribTime = new Date(); + maghribTime.setHours(18); // Jam + maghribTime.setMinutes(5); // Menit + + let timeDiff = maghribTime - currentTime; + + let hoursLeft = Math.floor(timeDiff / (1000 * 60 * 60)); + let minutesLeft = Math.floor((timeDiff % (1000 * 60 * 60)) / (1000 * 60)); + + // console.log(new Date().toLocaleTimeString(['id-ID'], { hour: "2-digit", minute: "2-digit" })) + // console.log(time.Maghrib) + + // console.log(time.Maghrib - new Date().toLocaleTimeString(['id-ID'], { hour: "2-digit", minute: "2-digit" })) + useEffect(() => { fetchData() }, []) - return( + return ( <> -
-
- -
-
+ <> +
+ {/* Button trigger modal */} + +
+ {/* Modal */} + + ) } \ No newline at end of file diff --git a/client-side/client/src/components/TextHome.jsx b/client-side/client/src/components/TextHome.jsx index 94f2a86..1310ec5 100644 --- a/client-side/client/src/components/TextHome.jsx +++ b/client-side/client/src/components/TextHome.jsx @@ -5,13 +5,13 @@ export default function TextHome() { return ( <> -

Islamic Education

+

Welcome! / مرحبًا

- Islam is a religion based on the Koran and Hadith. Therefore, good Islamic education comes from both. And Hadith is what comes from the prophet Muhammad. So we provide a collection of hadiths that can be used as references and reminders + Islam is a religion based on the Qor'an and Hadith. Therefore, good Islamic education comes from both. And Hadith is what comes from the prophet Muhammad. So we provide a collection of hadiths that can be used as references and reminders

-

+

- View details » + Enter the web »

diff --git a/client-side/client/src/main.jsx b/client-side/client/src/main.jsx index 32ef1f0..ecfee14 100644 --- a/client-side/client/src/main.jsx +++ b/client-side/client/src/main.jsx @@ -2,9 +2,15 @@ import React from 'react' import ReactDOM from 'react-dom/client' import App from './App.jsx' // import './index.css' +import store from "./store.js"; +import { Provider } from "react-redux"; + ReactDOM.createRoot(document.getElementById('root')).render( // - + // // {/* , */} + + + ) diff --git a/client-side/client/src/store.js b/client-side/client/src/store.js new file mode 100644 index 0000000..a1f6850 --- /dev/null +++ b/client-side/client/src/store.js @@ -0,0 +1,5 @@ +import { configureStore } from '@reduxjs/toolkit' + +export default configureStore({ + reducer: {}, +}) \ No newline at end of file diff --git a/client-side/client/src/views/Home.jsx b/client-side/client/src/views/Home.jsx index c5720dc..8a658d0 100644 --- a/client-side/client/src/views/Home.jsx +++ b/client-side/client/src/views/Home.jsx @@ -4,21 +4,30 @@ import TextHome from "../components/TextHome"; export default function Home() { + const bgStyle = { + // backgroundColor: 'lightblue', + // backgroundImage: 'url(../../public/bg1.png)', + // backgroundRepeat: 'no-repeat', + // backgroundSize: 'cover', + // height: '100% !important' + } return ( <> -
-
- -
- +
+
+
+ +
+ +
-
-
-
-
- -
+
+
+
+ +
+
From 5bc691b8ff86af1e9d946b51a908b64d7d5fe263 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Sat, 16 Mar 2024 12:43:01 +0700 Subject: [PATCH 27/48] feat: page pub detail by id --- client-side/client/public/logo.png | Bin 0 -> 96887 bytes client-side/client/src/Router.jsx | 5 ++ .../client/src/components/TextHome.jsx | 2 +- client-side/client/src/views/Public.jsx | 23 +++++-- client-side/client/src/views/PublicDetail.jsx | 62 ++++++++++++++++++ 5 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 client-side/client/public/logo.png create mode 100644 client-side/client/src/views/PublicDetail.jsx diff --git a/client-side/client/public/logo.png b/client-side/client/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3167b9fbdecb7616a557c6168c565f70152d16 GIT binary patch literal 96887 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

sYqlYF4Cma!`8ONbcEhYT+333LYf9-j+km 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 literal 0 HcmV?d00001 diff --git a/client-side/client/src/Router.jsx b/client-side/client/src/Router.jsx index 7cf41ba..b18e053 100644 --- a/client-side/client/src/Router.jsx +++ b/client-side/client/src/Router.jsx @@ -4,6 +4,7 @@ import Public from "./views/Public" import Login from "./components/Login" import ContentPage from "./components/ContentPage" import Register from "./components/Register" +import PublicDetail from "./views/PublicDetail" const router = createBrowserRouter( [ @@ -16,6 +17,10 @@ const router = createBrowserRouter( path: '/pub', element: }, + { + path: '/pub/:id/:language', + element: + }, { path: '/register', element: , diff --git a/client-side/client/src/components/TextHome.jsx b/client-side/client/src/components/TextHome.jsx index 1310ec5..01fb8d4 100644 --- a/client-side/client/src/components/TextHome.jsx +++ b/client-side/client/src/components/TextHome.jsx @@ -6,7 +6,7 @@ export default function TextHome() { return ( <>

Welcome! / مرحبًا

-

+

Islam is a religion based on the Qor'an and Hadith. Therefore, good Islamic education comes from both. And Hadith is what comes from the prophet Muhammad. So we provide a collection of hadiths that can be used as references and reminders

diff --git a/client-side/client/src/views/Public.jsx b/client-side/client/src/views/Public.jsx index 82383bb..5d5491a 100644 --- a/client-side/client/src/views/Public.jsx +++ b/client-side/client/src/views/Public.jsx @@ -8,7 +8,7 @@ export default function Public() { const fetchData = async () => { try { - const response = await axios.get('http://localhost:3000/pub') + const response = await axios.get('https://project.mf-cyberse.online/pub') console.log(response.data.data) @@ -26,12 +26,21 @@ export default function Public() { <>

- -
-
TEST
-
TEST TOO
-
- + {data.map(each => ( +
+
+ Title: {each.title} +
+
+ Choose Translation: + {each.translations.map((e, index) => ( + + + + ))} +
+
+ ))}
) diff --git a/client-side/client/src/views/PublicDetail.jsx b/client-side/client/src/views/PublicDetail.jsx new file mode 100644 index 0000000..df9b3bf --- /dev/null +++ b/client-side/client/src/views/PublicDetail.jsx @@ -0,0 +1,62 @@ +import axios from "axios" +import { useEffect, useState } from "react" +import { useParams } from "react-router" +import Navbar from "../components/Navbar" +import { Link } from "react-router-dom" + + +export default function PublicDetail() { + const [data, setData] = useState({}) + const params = useParams() + + const fetchData = async () => { + try { + const response = await axios.get(`https://hadeethenc.com/api/v1/hadeeths/one/?language=${params.language}&id=${params.id}`) + + console.log(response.data) + + setData(response.data) + } catch (error) { + console.log(error) + } + } + + useEffect(() => { + fetchData() + }, []) + + return ( + <> + +
+
+
+ +
+ Bootstrap Media Preview +
+
{data.title}
+
+

{data.hadeeth_ar}

+

{data.hadeeth} ({data.grade}, {data.attribution})

+ +
+
+
+
+
+ + ) +} \ No newline at end of file From f25415534a3bbed594898929bb0b84f92c14e902 Mon Sep 17 00:00:00 2001 From: mfaishal82 Date: Sat, 16 Mar 2024 14:07:39 +0700 Subject: [PATCH 28/48] feat: Content page & about us page --- client-side/client/index.html | 1 + client-side/client/src/Router.jsx | 5 +++ .../client/src/components/ContentPage.jsx | 23 +++++----- client-side/client/src/components/Login.jsx | 6 ++- client-side/client/src/components/Navbar.jsx | 4 +- client-side/client/src/views/AboutUs.jsx | 43 +++++++++++++++++++ client-side/client/src/views/PublicDetail.jsx | 4 +- server/controllers/contentController.js | 37 +++++++++------- 8 files changed, 92 insertions(+), 31 deletions(-) create mode 100644 client-side/client/src/views/AboutUs.jsx diff --git a/client-side/client/index.html b/client-side/client/index.html index 0faa75a..477d1fc 100644 --- a/client-side/client/index.html +++ b/client-side/client/index.html @@ -11,6 +11,7 @@ + Islamic Education diff --git a/client-side/client/src/Router.jsx b/client-side/client/src/Router.jsx index b18e053..1474093 100644 --- a/client-side/client/src/Router.jsx +++ b/client-side/client/src/Router.jsx @@ -5,6 +5,7 @@ import Login from "./components/Login" import ContentPage from "./components/ContentPage" import Register from "./components/Register" import PublicDetail from "./views/PublicDetail" +import AboutUs from "./views/AboutUs" const router = createBrowserRouter( [ @@ -41,6 +42,10 @@ const router = createBrowserRouter( loader: () => { return !localStorage.getItem('access_token') ? redirect('/login') : null } + }, + { + path: '/about', + element: } ] ) diff --git a/client-side/client/src/components/ContentPage.jsx b/client-side/client/src/components/ContentPage.jsx index 2afe194..9960457 100644 --- a/client-side/client/src/components/ContentPage.jsx +++ b/client-side/client/src/components/ContentPage.jsx @@ -28,18 +28,21 @@ export default function ContentPage() { return ( <> -
-
+
+
{data.map(each => ( -
-

- {each.title} -

-

- {each.description} -

{each.Category.name} -
+
+ {/* ... */} +

{each.title}

+
+

+ {each.description} +

+ Label Category: {each.Category.name}
+ Created by: {each.User.username} +
+
))}
diff --git a/client-side/client/src/components/Login.jsx b/client-side/client/src/components/Login.jsx index 4175890..292ce79 100644 --- a/client-side/client/src/components/Login.jsx +++ b/client-side/client/src/components/Login.jsx @@ -7,6 +7,7 @@ export default function Login() { const navigate = useNavigate() const [email, setEmail] = useState([]) const [password, setPassword] = useState([]) + let errorMessage const handleOnSubmit = async (e) => { e.preventDefault() @@ -20,7 +21,9 @@ export default function Login() { navigate('/contents') } catch (error) { - console.log(error) + // console.log(error) + errorMessage = error.response.data.message + console.log(errorMessage) } } @@ -83,6 +86,7 @@ export default function Login() {
+ ) } \ No newline at end of file diff --git a/client-side/client/src/components/Navbar.jsx b/client-side/client/src/components/Navbar.jsx index 11221bf..8395617 100644 --- a/client-side/client/src/components/Navbar.jsx +++ b/client-side/client/src/components/Navbar.jsx @@ -59,9 +59,9 @@ export default function Navbar() {
  • - + About us - +
  • diff --git a/client-side/client/src/views/AboutUs.jsx b/client-side/client/src/views/AboutUs.jsx new file mode 100644 index 0000000..87db640 --- /dev/null +++ b/client-side/client/src/views/AboutUs.jsx @@ -0,0 +1,43 @@ +import Navbar from "../components/Navbar"; + + +export default function AboutUs() { + + return ( + <> + +
    +

    About Us

    +

    + Welcome to our website! We are a team of passionate individuals dedicated to providing high-quality products/services and excellent customer experiences. +

    +

    + Our mission is to [insert mission statement here]. We strive to [insert goals/objectives here]. +

    +

    Our Team

    +

    + Meet the talented individuals behind our company: +

    +
      +
    • John Doe - CEO
    • +
    • Jane Smith - Marketing Manager
    • +
    • Michael Johnson - Lead Developer
    • + {/* Add more team members as needed */} +
    +

    Our Story

    +

    + Our company was founded in [insert year] with the vision of [insert vision/goal]. Since then, we have been committed to delivering excellence in every aspect of our business. +

    +

    + We started small, but with dedication and hard work, we have grown into a reputable company known for [insert achievements/success stories]. +

    +

    Contact Us

    +

    + If you have any questions or inquiries, feel free to reach out to us: +

    +

    Email: info@example.com

    +

    Phone: +1234567890

    +
    + + ) +} \ No newline at end of file diff --git a/client-side/client/src/views/PublicDetail.jsx b/client-side/client/src/views/PublicDetail.jsx index df9b3bf..50237b0 100644 --- a/client-side/client/src/views/PublicDetail.jsx +++ b/client-side/client/src/views/PublicDetail.jsx @@ -28,7 +28,7 @@ export default function PublicDetail() { return ( <> -
    +