From 29073d781e17ed06ab7766eeb189fdeb508fccbd Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Mon, 13 Nov 2023 21:27:30 +0700 Subject: [PATCH 01/27] initialized server-side project --- server/.env.example | 0 server/.gitignore | 2 + server/package-lock.json | 5705 ++++++++++++++++++++++++++++++++++++++ server/package.json | 26 + 4 files changed, 5733 insertions(+) create mode 100644 server/.env.example create mode 100644 server/.gitignore create mode 100644 server/package-lock.json create mode 100644 server/package.json diff --git a/server/.env.example b/server/.env.example new file mode 100644 index 0000000..e69de29 diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..1dcef2d --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,2 @@ +node_modules +.env \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..1d0388f --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,5705 @@ +{ + "name": "ipustaka-server", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ipustaka-server", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "axios": "^1.6.1", + "bcryptjs": "^2.4.3", + "cors": "^2.8.5", + "express": "^4.18.2", + "pg": "^8.11.3", + "sequelize": "^6.35.0" + }, + "devDependencies": { + "dotenv": "^16.3.1", + "jest": "^29.7.0", + "nodemon": "^3.0.1", + "sequelize-cli": "^6.6.2", + "supertest": "^6.3.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "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==", + "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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "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": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "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==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@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": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@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.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@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==", + "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/@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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "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==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "dev": true, + "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.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "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==", + "dev": true + }, + "node_modules/@types/validator": { + "version": "13.11.6", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.6.tgz", + "integrity": "sha512-HUgHujPhKuNzgNXBRZKYexwoG+gHKU+tnfPqjWXFghZAnn73JElicMkuSKJyLGr9JgyA8IgK7fj88IyA9rwYeQ==" + }, + "node_modules/@types/yargs": { + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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/axios": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "dependencies": { + "follow-redirects": "^1.15.0", + "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", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "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.1", + "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": "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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "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.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "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==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "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==", + "dev": true + }, + "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.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "dev": true, + "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==", + "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/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==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "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==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "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==", + "dev": true + }, + "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/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.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "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/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==", + "dev": true + }, + "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==", + "dev": true + }, + "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", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "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==", + "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.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "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/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.581", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz", + "integrity": "sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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/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==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "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.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "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==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "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/ext/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/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-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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "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", + "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/foreground-child/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/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==", + "dev": true, + "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==", + "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==", + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "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.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "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==", + "dev": true, + "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==", + "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==" + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "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==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "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-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "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/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@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.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "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": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@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": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "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==", + "dev": true, + "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/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==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@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": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "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==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "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": "^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==", + "dev": true, + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@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": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@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": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "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/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-beautify": { + "version": "1.14.11", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", + "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", + "dev": true, + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.3", + "glob": "^10.3.3", + "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-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "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", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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/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/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==", + "dev": true, + "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==", + "dev": true, + "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", + "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/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==", + "dev": true + }, + "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/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "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", + "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/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/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.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "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/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/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/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "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/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/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==", + "dev": true + }, + "node_modules/nodemon/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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "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", + "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/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/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "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", + "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/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.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.2.tgz", + "integrity": "sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "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/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "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/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==", + "dev": true + }, + "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==", + "dev": true, + "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", + "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.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "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-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "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" + } + }, + "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/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "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.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "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.35.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.0.tgz", + "integrity": "sha512-cnxnmjUfphGfSKCwTtNZ3YD/F35fqMTNPw/Qe9xsMij49t6LkW2G57sNQkuKac8fkQgSX+M8OZOQsxCS6dnUwQ==", + "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/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/sequelize-cli/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/sequelize-cli/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/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.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "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.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "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==", + "dev": true + }, + "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==", + "dev": true, + "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", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "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==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/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": { + "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-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/supertest": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.0.5" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "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/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==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "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/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "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/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "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==", + "dev": true, + "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==", + "dev": true, + "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", + "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/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "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/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==", + "dev": true, + "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", + "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/v8-to-istanbul": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", + "dev": true, + "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", + "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/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "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" + }, + "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": "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/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==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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/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==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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/server/package.json b/server/package.json new file mode 100644 index 0000000..3a617a3 --- /dev/null +++ b/server/package.json @@ -0,0 +1,26 @@ +{ + "name": "ipustaka-server", + "version": "1.0.0", + "description": "", + "main": "app.js", + "scripts": { + "test": "npx jest --detectOpenHandles --forceExit --runInBand --coverage" + }, + "author": "arvinaufal", + "license": "ISC", + "dependencies": { + "axios": "^1.6.1", + "bcryptjs": "^2.4.3", + "cors": "^2.8.5", + "express": "^4.18.2", + "pg": "^8.11.3", + "sequelize": "^6.35.0" + }, + "devDependencies": { + "dotenv": "^16.3.1", + "jest": "^29.7.0", + "nodemon": "^3.0.1", + "sequelize-cli": "^6.6.2", + "supertest": "^6.3.3" + } +} From 52121c171469e9a1dac469204f70e9990cc044c6 Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Mon, 13 Nov 2023 21:30:38 +0700 Subject: [PATCH 02/27] initialize client-side project --- client/.eslintrc.cjs | 20 + client/.gitignore | 24 + client/README.md | 8 + client/index.html | 13 + client/package-lock.json | 3866 +++++++++++++++++++++++++++++++++++ client/package.json | 27 + client/public/vite.svg | 1 + client/src/App.css | 42 + client/src/App.jsx | 35 + client/src/assets/react.svg | 1 + client/src/index.css | 69 + client/src/main.jsx | 10 + client/vite.config.js | 7 + 13 files changed, 4123 insertions(+) create mode 100644 client/.eslintrc.cjs create mode 100644 client/.gitignore create mode 100644 client/README.md create mode 100644 client/index.html create mode 100644 client/package-lock.json create mode 100644 client/package.json create mode 100644 client/public/vite.svg create mode 100644 client/src/App.css create mode 100644 client/src/App.jsx create mode 100644 client/src/assets/react.svg create mode 100644 client/src/index.css create mode 100644 client/src/main.jsx create mode 100644 client/vite.config.js diff --git a/client/.eslintrc.cjs b/client/.eslintrc.cjs new file mode 100644 index 0000000..4dcb439 --- /dev/null +++ b/client/.eslintrc.cjs @@ -0,0 +1,20 @@ +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-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/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/README.md b/client/README.md new file mode 100644 index 0000000..f768e33 --- /dev/null +++ b/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/index.html b/client/index.html new file mode 100644 index 0000000..0c589ec --- /dev/null +++ b/client/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
+ + + diff --git a/client/package-lock.json b/client/package-lock.json new file mode 100644 index 0000000..8ef3a48 --- /dev/null +++ b/client/package-lock.json @@ -0,0 +1,3866 @@ +{ + "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", + "react-router-dom": "^6.18.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.3", + "eslint": "^8.45.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "vite": "^4.4.5" + } + }, + "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/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "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": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@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": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@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.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "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.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "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/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.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.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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/@remix-run/router": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", + "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "dev": true, + "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.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz", + "integrity": "sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.15.tgz", + "integrity": "sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz", + "integrity": "sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA==", + "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": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.1.tgz", + "integrity": "sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "@types/babel__core": "^7.20.3", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "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": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "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.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.tosorted": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "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.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "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/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "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.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "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/caniuse-lite": { + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "dev": true, + "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": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "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==", + "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/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==", + "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.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "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.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/electron-to-chromium": { + "version": "1.4.581", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz", + "integrity": "sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "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.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", + "@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.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "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.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.4.tgz", + "integrity": "sha512-eD83+65e8YPVg6603Om2iCIwcQJf/y7++MWm4tACtEswFLYMwxwVWAfwN+e19f5Ad/FOyyNg9Dfi5lXhH3Y3rA==", + "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/eslint/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/eslint/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/eslint/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/eslint/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/eslint/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/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/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/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.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "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.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "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/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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "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": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "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.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "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.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "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.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "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.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "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.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "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/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=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", + "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/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==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "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.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "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/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "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.6", + "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/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz", + "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==", + "dependencies": { + "@remix-run/router": "1.11.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz", + "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==", + "dependencies": { + "@remix-run/router": "1.11.0", + "react-router": "6.18.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "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.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "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": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "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.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "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.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.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.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "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.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "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": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "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" + }, + "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/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "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/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==", + "dev": true, + "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/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": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "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/package.json b/client/package.json new file mode 100644 index 0000000..f446282 --- /dev/null +++ b/client/package.json @@ -0,0 +1,27 @@ +{ + "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", + "react-router-dom": "^6.18.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.3", + "eslint": "^8.45.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "vite": "^4.4.5" + } +} diff --git a/client/public/vite.svg b/client/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/App.css b/client/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/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/src/App.jsx b/client/src/App.jsx new file mode 100644 index 0000000..b8b8473 --- /dev/null +++ b/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/src/assets/react.svg b/client/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/client/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/index.css b/client/src/index.css new file mode 100644 index 0000000..2c3fac6 --- /dev/null +++ b/client/src/index.css @@ -0,0 +1,69 @@ +: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; + -webkit-text-size-adjust: 100%; +} + +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/src/main.jsx b/client/src/main.jsx new file mode 100644 index 0000000..54b39dd --- /dev/null +++ b/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/vite.config.js b/client/vite.config.js new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/client/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From cc1a033fd7fff99b2a169826354a1d67b2bceba4 Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Mon, 13 Nov 2023 23:56:15 +0700 Subject: [PATCH 03/27] Cleaning datas from google books api to be base datas in db --- server/app.js | 14 ++++++++++ server/bin/www | 6 +++++ server/config/config.json | 23 ++++++++++++++++ server/jsons/fetchDatas.js | 54 ++++++++++++++++++++++++++++++++++++++ server/models/index.js | 43 ++++++++++++++++++++++++++++++ server/package.json | 1 + server/routes/index.js | 6 +++++ 7 files changed, 147 insertions(+) create mode 100644 server/app.js create mode 100644 server/bin/www create mode 100644 server/config/config.json create mode 100644 server/jsons/fetchDatas.js create mode 100644 server/models/index.js create mode 100644 server/routes/index.js diff --git a/server/app.js b/server/app.js new file mode 100644 index 0000000..0a0ba51 --- /dev/null +++ b/server/app.js @@ -0,0 +1,14 @@ +if (process.env.NODE_ENV === 'development') { + require('dotenv').config(); +} + +const express = require('express'); +const cors = require('cors'); +const app = express(); + +app.use(cors()); +app.use(express.json()); +app.use(express.urlencoded({extended: true})); +app.use(require('./routes')); + +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..e0838c3 --- /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(`IPustaka running on port ${port}`); +}); \ 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/jsons/fetchDatas.js b/server/jsons/fetchDatas.js new file mode 100644 index 0000000..cff7d82 --- /dev/null +++ b/server/jsons/fetchDatas.js @@ -0,0 +1,54 @@ +require('dotenv').config(); +const axios = require('axios'); +async function fetchGoogleBooks() { + try { + const response = await axios.get('https://www.googleapis.com/books/v1/volumes', { + params: { + key: process.env.GOOGLE_BOOKS_API_KEY, + q: 'javascript', + country: 'ID', + maxResults: 3, + printType: 'books', + }, + }); + + + // console.log(response); + let items = response.data.items || []; + + if (items.length > 0) { + items = items.map(item => { + const { title, authors, publisher, publishedDate, description, industryIdentifiers, pageCount, categories, imageLinks, language } = item.volumeInfo; + return { + title, + isbn: industryIdentifiers ? industryIdentifiers[0].identifier : '-', + author: authors.join(', '), + synopsis: description, + pageCount, + stock: Math.ceil(Math.random() * 5), + publisher, + publishedDate, + lang: language, + imgUrl: imageLinks.thumbnail, + status: `available`, + category: categories ? categories.join(', ') : '-' + } + }); + } + console.log(items); + + // const result = items.map(item => ({ + // judul: item.volumeInfo.title || 'Tidak ada judul', + // pengarang: item.volumeInfo.authors ? item.volumeInfo.authors.join(', ') : 'Tidak ada pengarang', + // })); + + // return result; + } catch (error) { + console.error(error); + // throw new Error('Terjadi kesalahan dalam permintaan.'); + } +} + + +fetchGoogleBooks(); +// module.exports = fetchGoogleBooks; \ No newline at end of file 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.json b/server/package.json index 3a617a3..613c9dd 100644 --- a/server/package.json +++ b/server/package.json @@ -4,6 +4,7 @@ "description": "", "main": "app.js", "scripts": { + "dev": "npx nodemon bin/www", "test": "npx jest --detectOpenHandles --forceExit --runInBand --coverage" }, "author": "arvinaufal", diff --git a/server/routes/index.js b/server/routes/index.js new file mode 100644 index 0000000..c60e602 --- /dev/null +++ b/server/routes/index.js @@ -0,0 +1,6 @@ +const express = require('express'); +const router = express.Router(); + + + +module.exports = router; \ No newline at end of file From 63e0fd371b2d3236444c6f33be3ffa9a12a4864f Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Mon, 13 Nov 2023 23:59:53 +0700 Subject: [PATCH 04/27] add json data books --- server/jsons/books.json | 0 server/jsons/fetchDatas.js | 15 +++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 server/jsons/books.json diff --git a/server/jsons/books.json b/server/jsons/books.json new file mode 100644 index 0000000..e69de29 diff --git a/server/jsons/fetchDatas.js b/server/jsons/fetchDatas.js index cff7d82..4cd0969 100644 --- a/server/jsons/fetchDatas.js +++ b/server/jsons/fetchDatas.js @@ -1,5 +1,7 @@ require('dotenv').config(); const axios = require('axios'); +const fs = require('fs'); + async function fetchGoogleBooks() { try { const response = await axios.get('https://www.googleapis.com/books/v1/volumes', { @@ -35,14 +37,15 @@ async function fetchGoogleBooks() { } }); } - console.log(items); - // const result = items.map(item => ({ - // judul: item.volumeInfo.title || 'Tidak ada judul', - // pengarang: item.volumeInfo.authors ? item.volumeInfo.authors.join(', ') : 'Tidak ada pengarang', - // })); + const jsonBooks = JSON.stringify(items, null, 2); - // return result; + + const filePath = path.join(__dirname, 'books.json'); + + + fs.writeFileSync(filePath, jsonBooks); + } catch (error) { console.error(error); // throw new Error('Terjadi kesalahan dalam permintaan.'); From 5cf9a48fbd969eb2fddad6c65349ab5c4fcb4d79 Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Tue, 14 Nov 2023 00:43:06 +0700 Subject: [PATCH 05/27] Add migration for server-side --- server/config/config.json | 8 +- server/jsons/books.json | 1090 +++++++++++++++++ server/jsons/fetchDatas.js | 57 +- .../migrations/20231113173059-create-user.js | 41 + .../20231113173218-create-user-detail.js | 50 + .../migrations/20231113173504-create-book.js | 63 + .../20231113173602-create-history.js | 49 + server/models/book.js | 34 + server/models/history.js | 26 + server/models/user.js | 26 + server/models/userdetail.js | 28 + 11 files changed, 1439 insertions(+), 33 deletions(-) create mode 100644 server/migrations/20231113173059-create-user.js create mode 100644 server/migrations/20231113173218-create-user-detail.js create mode 100644 server/migrations/20231113173504-create-book.js create mode 100644 server/migrations/20231113173602-create-history.js create mode 100644 server/models/book.js create mode 100644 server/models/history.js create mode 100644 server/models/user.js create mode 100644 server/models/userdetail.js diff --git a/server/config/config.json b/server/config/config.json index 0f858c6..a706965 100644 --- a/server/config/config.json +++ b/server/config/config.json @@ -1,10 +1,10 @@ { "development": { - "username": "root", - "password": null, - "database": "database_development", + "username": "postgres", + "password": "root", + "database": "ipustaka_dev", "host": "127.0.0.1", - "dialect": "mysql" + "dialect": "postgres" }, "test": { "username": "root", diff --git a/server/jsons/books.json b/server/jsons/books.json index e69de29..fdb8800 100644 --- a/server/jsons/books.json +++ b/server/jsons/books.json @@ -0,0 +1,1090 @@ +[ + { + "title": "Buku Pintar JavaScript", + "isbn": "-", + "author": "Vivian Siahaan, Rismon Hasiholan Sianipar", + "synopsis": "Buku ini menyuguhkan lebih dari 100 kasus yang diimplementasikan langkah demi langkah. Buku ini ditujukan baik untuk pemula maupun pembelajar berpengalaman, yang hanya memfokuskan dan mendalami hanya pada elemen-elemen penting JavaScript. Buku ini merupakan buku “untuk semua kalangan”, yang didedikasikan untuk mereka yang menginginkan keseimbangan antara sisi teknis bahasa dan elemen-elemen menyenangkan. Buku ini menjelaskan bagaimana bahasa ini diterapkan dimulai dari contoh-contoh yang paling mendasar sampai yang lebih kompleks, dengan progres yang memandu Anda contoh demi contoh sampai Anda menguasainya. Kebutuhan akan contoh-contoh yang baik sangat diperlukan untuk mendapatkan hasil yang baik. Kami berharap bahwa Anda menikmati buku bahasa pemrograman Web ini dengan cara yang menyenangkan.", + "pageCount": 201, + "stock": 3, + "publisher": "BALIGE PUBLISHING", + "publishedDate": "2020-03-14", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=qovWDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "JavaScript Untuk Profesional", + "isbn": "-", + "author": "Vivian Siahaan, Rismon Hasiholan Sianipar", + "synopsis": "JavaScript merupakan bahasa skript populer yang dipakai untuk menciptakan halaman Web yang dapat berinteraksi dengan pengguna dan dapat merespon event yang terjadi pada halaman. JavaScript merupakan perekat yang menyatukan halaman-halaman Web. Akan sangat susah menjumpai halaman Web komersial yang tidak memuat kode JavaScript. JavaScript, awalnya dikenal sebagai LiveScript, dikembangkan oleh Brendan Eich di Netscape pada tahun 1995 yang menjadi bagian terintegrasi di dalam Netscape Navigator 2.0. JavaScript merupakan bahasa skript yang menghidupkan halaman-halaman HTML. JavaScript dapat dijalankan pada hampir semua platform. JavaScript merupakan bahasa sisi-klien yang didesain pada browser komputer Anda, bukan pada server. Ia dibangun secara langsung ke dalam browser, Microsoft Internet Explorer, Mozilla Firefox, Google Chrome, Opera, hampir semua browser. Dalam sintaksis, JavaScript mirip dengan C, Perl, dan Java. Program JavaScript dipakai untuk mendeteksi dan beraksi terhadap event-event yang disebabkan oleh pengguna. Anda dapat memperbaiki situs Web dengan bantuan navigasional, kotak dialog, citra dinamis, dan lainnya. JavaScript dapat digunakan untuk mengendalikan tampilan halaman. JavaScript dipakai untuk memvalidasi apa yang diketikkan pengguna ke dalam sebuah form sebelum pengiriman form ke server dilakukan. JavaScript berperan sebagai bahasa pemrograman, yang memiliki konstruksi-konstruksi dasar seperti variabel dan tipe data, look kontrol, statemen if/else, statemen switch, fungsi, dan objek. JavaScript dapat dipakai untuk perhitungan aritmatik, pemanipulasian tanggal dan waktu, pemodifikasian array, string dan objek. Ia juga dapat menangani event yang diinisiasi pengguna, dan menetapkan pewaktu. Kombinasi dari HTMl, CSS, dan JavaScript dapat menghasilkan halaman Web yang terstruktur, bergaya, dan interaktif. Para perancang Web sepakat bahwa ketiganya merupakan bagian penting dari sebuah halaman Web. Topik-topik yang dibahas pada buku ini meliputi: Sejarah JavaScript; Tipe Data; Literal, dan Variabel; Kotak Dialog; Operator; Kondisi; Fungsi; Objek; Objek Inti JavaScript; Objek Browser; Form; Citra dan Link; Penanganan Event; CSS dan JavaScript.", + "pageCount": 434, + "stock": 5, + "publisher": "SPARTA PUBLISHER", + "publishedDate": "2018-11-21", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=OFd1DwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "JavaScript: Dari A Sampai Z", + "isbn": "-", + "author": "Vivian Siahaan, Rismon Hasiholan Sianipar", + "synopsis": "JavaScript merupakan bahasa skript populer yang dipakai untuk menciptakan halaman Web yang dapat berinteraksi dengan pengguna dan dapat merespon event yang terjadi pada halaman. JavaScript merupakan perekat yang menyatukan halaman-halaman Web. Akan sangat susah menjumpai halaman Web komersial yang tidak memuat kode JavaScript. JavaScript, awalnya dikenal sebagai LiveScript, dikembangkan oleh Brendan Eich di Netscape pada tahun 1995 yang menjadi bagian terintegrasi di dalam Netscape Navigator 2.0. JavaScript merupakan bahasa skript yang menghidupkan halaman-halaman HTML. JavaScript dapat dijalankan pada hampir semua platform. JavaScript merupakan bahasa sisi-klien yang didesain pada browser komputer Anda, bukan pada server. Ia dibangun secara langsung ke dalam browser, Microsoft Internet Explorer, Mozilla Firefox, Google Chrome, Opera, hampir semua browser. Dalam sintaksis, JavaScript mirip dengan C, Perl, dan Java. Program JavaScript dipakai untuk mendeteksi dan beraksi terhadap event-event yang disebabkan oleh pengguna. Anda dapat memperbaiki situs Web dengan bantuan navigasional, kotak dialog, citra dinamis, dan lainnya. JavaScript dapat digunakan untuk mengendalikan tampilan halaman. JavaScript dipakai untuk memvalidasi apa yang diketikkan pengguna ke dalam sebuah form sebelum pengiriman form ke server dilakukan. JavaScript berperan sebagai bahasa pemrograman, yang memiliki konstruksi-konstruksi dasar seperti variabel dan tipe data, look kontrol, statemen if/else, statemen switch, fungsi, dan objek. JavaScript dapat dipakai untuk perhitungan aritmatik, pemanipulasian tanggal dan waktu, pemodifikasian array, string dan objek. Ia juga dapat menangani event yang diinisiasi pengguna, dan menetapkan pewaktu. Kombinasi dari HTMl, CSS, dan JavaScript dapat menghasilkan halaman Web yang terstruktur, bergaya, dan interaktif. Para perancang Web sepakat bahwa ketiganya merupakan bagian penting dari sebuah halaman Web. Topik-topik yang dibahas pada buku ini meliputi: Sejarah JavaScript; Tipe Data; Literal, dan Variabel; Kotak Dialog; Operator; Kondisi; Fungsi; Objek; Objek Inti JavaScript; Objek Browser; Form; Citra dan Link; Penanganan Event; CSS dan JavaScript.", + "pageCount": 436, + "stock": 2, + "publisher": "Sparta Publisher", + "publishedDate": "2018-12-26", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=IYxeDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Semua Bisa Menjadi Programmer JavaScript & Node.js", + "isbn": "9786230019760", + "author": "Ir. Yuniar Supardi", + "synopsis": "JavaScript merupakan program skrip untuk client sehingga penulis juga menyatukan materi Node.js yang merupakan program skrip server untuk JavaScript. Belajar Node.js membuat pengembang dengan bahasa JavaScript dapat membuat skrip web, baik untuk sisi klien dan server. Bahasa Skrip JavaScript menjadi bahasa skrip nomor satu di dunia, apalagi dengan adanya Node.js membuat JavaScript semakin populer, tentu bahasa ini menjadi bahasa pesaing utama Python. Keunggulan buku ini memandu Anda membuat program web menggunakan JavaScript dan Node.js dengan pembahasan yang mudah dan sistematik, sehingga Anda dengan mudah belajar dari buku ini. Dalam buku ini juga Anda dipandu bagaimana membuat program web dengan database MySQL dan SQLite pada Node.js. Topik yang dibahas dalam buku ini mencakup: - Sekilas JavaScript & Node.js - Komponen Program JavaScript - Objek GUI JavaScript - Kejadian (Event) JavaScript - Marquee dan Frame JavaScript - Node.js - NPM Node.js - Modul Node.js - Modul Http - Modul File System - Modul Url - Form Node.js - Upload File Node.js - CRUD MySQL Pada Node.js - SQLite Pada Node.js - dan Lain-lain.", + "pageCount": 240, + "stock": 4, + "publisher": "Elex Media Komputindo", + "publishedDate": "2021-04-13", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=CG0qEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "HTML5 dan Javascript untuk Pemula", + "isbn": "9786230024320", + "author": "Jubilee Enterprise", + "synopsis": "Ilmu membuat website tersedia di dalam HTML5 dan Javascript. Buku ini adalah referensi yang lengkap, to-the point, dan mudah dipahami untuk penggunaan HTML5, Javascript, dan topik lainnya tentang web design, seperti style sheet dan framework Javascript. Tidak memandang apakah Anda awam atau pernah mengenal HTML sebelumnya, buku ini dirancang untuk Anda. Di dalam buku ini, kami akan mengajari cara membangun website memakai HTML5 dan Javascript secara efektif, singkat, tepat, dan jelas! Pembahasan akan dimulai dari cara menginstal editor gratis dari internet. Setelah itu, akan dibahas topik-topik spesifik, seperti struktur HTML, format teks, list dan background, hyperlink, style sheet, image, penulisan Javascript, pembuatan variable, objek angka dan math, bekerja dengan string, operator perbandingan, null dan undefined, konversi tipe data, object, function, dan framework Javascript Vue seperti data binding. Dilengkapi dengan kode-kode program yang jelas, buku ini tidak membutuhkan pengalaman apa pun. Bahkan, Anda bisa mengoperasikannya menggunakan MS Windows. Jadi tunggu apa lagi, ayo belajar cara membuat web design menggunakan HTML5 dan Javascript melalui referensi yang lengkap ini. (thinkjubilee)", + "pageCount": 304, + "stock": 3, + "publisher": "Elex Media Komputindo", + "publishedDate": "2021-06-11", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=e14zEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Javascript untuk pemula", + "isbn": "-", + "author": "Jubilee Enterprise", + "synopsis": "Ilmu membuat website tersedia di dalam HTMLS dan Javascript. Buku ini adalah referensi yang lengkap, to-the point, dan mudah dipahami untuk penggunaan Javascript. Tidak memandang apakah Anda awam atau pernah mengenal Javascript sebelumnya, buku ini dirancang untuk Anda. Di dalam buku ini, kami akan mengajari cara membangun website memakai Javascript secara efektif, singkat, tepat, dan jelas! Pembahasan akan dimulai dari cara menginstal editor gratis dari internet. Setelah itu, akan dibahas topik-topik spesifik, seperti penulisan Javascript, pembuatan variable, objek angka dan math, bekerja dengan string, operator perbandingan, null dan undefined, konversi tipe data, object, function, dan framework Javascript Vue seperti data binding. Dilengkapi dengan kode-kode program yang jelas, buku ini tidak membutuhkan pengalaman apa pun. Bahkan, Anda bisa mengoperasikannya menggunakan MS Windows. Jadi tunggu apa lagi, ayo belajar cara membuat web design menggunakan Javascript melalui referensi yang lengkap ini. (thinkjubilee)", + "pageCount": 204, + "stock": 2, + "publisher": "Elex Media Komputindo", + "publishedDate": "2021-08-03", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=VgE9EAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Buku Sakti HTML, CSS & Javascript", + "isbn": "9786232443723", + "author": "Adam Saputra, S.Si.", + "synopsis": "Memasuki zaman 4.0, kini penguasaan teknologi informasi sudah barang tentu menjadi titik tolok yang paling diperhitungkan sebagai sebuah komoditas untuk melenggang ke arena professional. Industri kreatif semakin digandrungi mengungguli lini-lini konvensional yang sudah mulai harus memperbarui sistem mereka karena imbas kemajuan industri saat ini. Semakin banyaknya minat ke industri kreatif menjadikan semakin banyak pula kemampuan-kemampuan kreatif yang harus dikuasai, dan salah satunya adalah web programming. Walaupun hari ini jasa pembuatan website sudah semakin gampang dan mudah diakses,namun apa salahnya kita semua mempelajari segala hal yang paling fundamental dari konstruksi rumah maya di dunia seberang kita, yakni internet dengan segala gelagasi jaring laba-labanya. Buku ini memuat cara-cara yang paling mudah dalam mempelajari bahasa pemrograman front-end seperti HTML, CSS, dan JavaScript.", + "pageCount": 268, + "stock": 2, + "publisher": "Anak Hebat Indonesia", + "publishedDate": "2019-08-01", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=5srzDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Seri Pemrograman Internet : Panduan Pemrograman JavaScript (sampai dengan JavaScript 1.2)", + "isbn": "979533462X", + "author": "Antony Pranata", + "pageCount": 336, + "stock": 2, + "publisher": "Penerbit Andi", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=v9H5RV_paEIC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "-" + }, + { + "title": "Beginning JavaScript", + "isbn": "9781118903742", + "author": "Jeremy McPeak", + "synopsis": "The bestselling JavaScript guide, updated with current features and best practices Beginning JavaScript 5th Edition shows you how to work effectively with JavaScript frameworks, functions, and modern browsers, and teaches more effective coding practices using HTML5. This new edition has been extensively updated to reflect the way JavaScript is most commonly used today, introducing you to the latest tools and techniques available to JavaScript developers. Coverage includes modern coding practices using HTML5 markup, the JSON data format, DOM APIs, the jQuery framework, and more. Exercises with solutions provide plenty of opportunity to practice, and the companion website offers downloadable code for all examples given in the book. Learn JavaScript using the most up to date coding style Understand JSON, functions, events, and feature detection Utilize the new HTML5 elements and the related API Explore new features including geolocation, local storage, and more JavaScript has shaped the Web from a passive medium into one that is rich, dynamic, and interactive. No matter the technology on the server side, it's JavaScript that makes it come alive in the browser. To learn JavaScript the way it's used today, Beginning JavaScript, 5th Edition is your concise guide.", + "pageCount": 768, + "stock": 4, + "publisher": "John Wiley & Sons", + "publishedDate": "2015-02-18", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=SjekBgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "JavaScript", + "isbn": "9788850327577", + "author": "Kevin Yank, Cameron Adams", + "pageCount": 310, + "stock": 4, + "publisher": "Apogeo Editore", + "publishedDate": "2008", + "lang": "it", + "imgUrl": "http://books.google.com/books/content?id=o4p6_GSlqMEC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Pemrograman Javascript: Teori Dan Implementasi", + "isbn": "9786028758994", + "author": "Rismon Hasiholan Sianipar", + "synopsis": "JavaScript sangat populer! Hampir pada semua komputer terpasang JavaScript di dalam browser Microsoft Internet Explorer, Mozilla Firefox, Google Chrome, Opera, dan lainnya. JavaScript juga merupakan bahasa skript populer yang memiliki banyak nama samaran lain, seperti Mocha, LiveScript, Jscript, dan ECMAScript. JavaScript merupakan bahasa skript populer yang dipakai untuk menciptakan halaman Web yang dapat berinteraksi dengan pengguna dan dapat merespon event yang terjadi pada halaman. JavaScript merupakan perekat yang menyatukan halaman-halaman Web. Akan sangat susah menjumpai halaman Web komersial yang tidak memuat kode JavaScript. Ada banyak buku yang didedikasikan untuk membahas beberapa aspek dari bahasa JavaScript dan jika Anda masih “baru” dengan bahasa ini, akan sangat sulit untuk mengetahui di mana harus memulainya. Buku ini merupakan buku “untuk semua kalangan”, yang didedikasikan untuk mereka yang menginginkan keseimbangan antara sisi teknis bahasa dan elemen-elemen menyenangkan, sebuah buku yang mendiskusikan permasalahan-permasalahan lintas-platform, dan sebuah buku yang tidak mengharuskan Anda seorang guru sebelum Anda memulainya. Buku ini menjelaskan bagaimana bahasa ini diterapkan dimulai dari contoh-contoh yang paling mendasar sampai yang lebih kompleks, dengan progres yang memandu Anda contoh demi contoh sampai Anda menguasainya. Karena saya seorang guru, saya merasa kebutuhan akan contoh-contoh yang baik diperlukan untuk mendapatkan hasil yang baik. Saya telah banyak belajar dan berharap bahwa Anda menikmati buku bahasa pemrograman Web ini dengan cara yang menyenangkan. Berikut merupakan topik-topik yang dibahas pada buku ini: Bab 1. Sejarah JavaScript Bab 2. Tipe Data, Literal, dan Variabel Bab 3. Kotak Dialog Bab 4. Operator Bab 5. Kondisi Bab 6. Fungsi Bab 7. Objek Bab 8. Objek Inti JavaScript Bab 9. Objek Browser Bab 10. Form Bab 11. Citra dan Link Bab 12. Penanganan Event Bab 13. CSS dan JavaScript", + "pageCount": 440, + "stock": 3, + "publisher": "Penerbit INFORMATIKA", + "publishedDate": "2015-05-28", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=8QZ2DwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "-" + }, + { + "title": "Javascript guempil", + "isbn": "-", + "author": "malik kurosaki", + "synopsis": "javascript itu mudah , mungkin akan ada pertanyaan bagaimana kok mudah ..? wong lihat tulisannya aja uda bikin cidera otak . Itu juga yang saya pikirkan waktu pertama kali ingin mempelajari javascript , sebelumnya sudah mempelajari html dan css, beda sekali jika dibandingkan dengan html atau css pada dasarnya html lebih kepada tata letaak dan pada fungsi tagnya sedangkan css memberi keindahan dan warna agar terlihat lebih hidup. Ibarat sebuah pohon html adalah dahan batang dan ranting yang mengatur dimana bunga atau buah atau daun ditempatkan sedangkan css mmberikan warna bentuk daun bentuk bunga pada pohon tersebut maka dari situ bisalah tercipta sebuah gambaran pohon yang hidup. Penulisan sebuah program pada web bisa dikatakan seni jika kita melihatnya dalam bingkai seni ,karena tak jarang kita cendrung senang jika melihat sebuah eb tertata dengan rapi dan cantik, disitulah dibutuhkan keterampilan tangan dan seni untuk menciptakan sebuah web yang indah.", + "pageCount": 20, + "stock": 3, + "publisher": "blackangel media", + "publishedDate": "2018-05-15", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=E_JaDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "7 Materi Pemrograman Web untuk Pemula 3: JavaScript & MariaDB", + "isbn": "-", + "author": "Rohi Abdulloh", + "synopsis": "Teknologi pemrograman web terus berkembang begitu cepat. Para pemula tentu akan semakin tertinggal jika tidak cepat mengejar. Buku ini membahas 7 materi pemrograman web sekaligus yang menjadi materi utama dalam mempelajari pemrograman web. Materi yang diberikan akan sangat membantu para pemula yang ingin menguasai pemrograman web dan menjadi web programmer dalam waktu singkat. Pembahasan dimulai dari pengetahuan dasar tentang pemrograman web, dilanjutkan dengan pembahasan 7 materi pemrograman web, satu demi satu disertai dengan contoh skrip beserta hasilnya. Disertai juga pembuatan aplikasi sederhana yang akan membantu pembaca menguasai pembuatan modul aplikasi. Untuk menunjang latihan, penulis juga menyertakan puluhan bonus skrip aplikatif. Dengan menguasai buku ini, pembaca dapat menjadi web programmer yang siap dan mampu membuat aplikasi web secara mandiri. Pembahasan selengkapnya mencakup: • Dasar web programming • HTML • CSS • MariaDB • PHP • Javascript • Bootstrap • Laravel", + "pageCount": 175, + "stock": 2, + "publisher": "PT Elex Media Komputindo", + "publishedDate": "2022-07-29", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=NYl-EAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "JavaScript by Example", + "isbn": "0131401629", + "author": "Ellie Quigley", + "synopsis": "This is the definitive JavaScript tutorial for the serious nonprogrammer who is interested in mastering the full power of the language. Includes hundreds of example JavaScript programs that demonstrate both the fun and practical aspects.", + "pageCount": 756, + "stock": 2, + "publisher": "Prentice Hall Professional", + "publishedDate": "2004", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=IAJv2N1n9JAC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "JavaScript", + "isbn": "9781119367956", + "author": "T. J. Crowder", + "synopsis": "All of JavaScript's newest features, in depth, made easy to understand. JavaScript is a rapidly changing language and it can be challenging to keep up with all the new toys being added. JavaScript: The New Toys explores the newest features of the world's most popular programming language while also showing readers how to track what's coming next. After setting the stage by covering who manages the process of improving JavaScript, how new features get introduced, terminology, and a high-level overview of new features, it details each new or updated item in depth, with example uses, possible pitfalls, and expert recommendations for updating old habits in light of new features. JavaScript: The New Toys: Covers all the additions to JavaScript in ES2015-ES2020 plus a preview of what's coming next Explores the latest syntax: nullish coalescing, optional chaining, let and const, class syntax, private methods, private fields, new.target, numeric separators, BigInt, destructuring, default parameters, arrow functions, async functions, await, generator functions, ... (rest and spread), template literals, binary and octal literals, ** (exponentiation), computed property/method names, for-of, for-await-of, shorthand properties, and others Details the new features and patterns including modules, promises, iteration, generators, Symbol, Proxy, reflection, typed arrays, Atomics, shared memory, WeakMap, WeakSet, and more Highlights common pitfalls and explains how to avoid them Shows how to follow the improvements process and even participate in the process yourself Explains how to use new features even before they're widely supported With its comprehensive coverage and friendly, accessible style, JavaScript: The New Toys provides an invaluable resource for programmers everywhere, whether they work in web development, Node.js, Electron, Windows Universal Apps, or another JavaScript environment.", + "pageCount": 608, + "stock": 1, + "publisher": "John Wiley & Sons", + "publishedDate": "2020-07-21", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=-i3rDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Pemrograman Web Berbasis HTML 5, PHP, Dan JavaScript", + "isbn": "9786020243627", + "author": "Edy Winarno ST, M.Eng, Ali Zaki & SmitDev Community", + "synopsis": "Buku ini menjelaskan cara melakukan pemrograman web dengan mudah memakai 3 bahasa pemrograman pokok, yaitu HTML5, PHP, dan JavaScript. Anda akan belajar bagaimana memanfaatkan HTML5 sebagai antarmuka awal, selanjutnya mengenal PHP untuk memberikan kemampuan pengolahan data client-server di web, lalu menggunakan JavaScript untuk memberikan sentuhan dinamis. Setiap penjelasan dilengkapi dengan contoh program dan di bagian akhir ditutup dengan pembuatan program yang melibatkan ketiganya. *Bonus pada buku fisik (CD, voucher, pembatas buku) tidak disertakan dalam buku digital (e-book)", + "pageCount": 248, + "stock": 4, + "publisher": "Elex Media Komputindo", + "publishedDate": "2014-06-23", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=YuVyDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Education" + }, + { + "title": "JavaScript Demystified", + "isbn": "0071471391", + "author": "Jim Keogh", + "synopsis": "Even if you have no programming experience, you'll learn to create dynamic, interactive Web pages with help from this easy-to-use, self-teaching guide. Author and programming instructor Jim Keogh covers the basics of this leading Web development language and explains how to write cross-browser JavaScript programs in no time.", + "pageCount": 375, + "stock": 5, + "publisher": "McGraw Hill Professional", + "publishedDate": "2005-06-21", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=0bmK3Ey9LLUC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Professional JavaScript for Web Developers", + "isbn": "9781118026694", + "author": "Nicholas C. Zakas", + "synopsis": "This book provides a developer-level introduction along with more advanced and useful features of JavaScript. Coverage includes: JavaScript use with HTML to create dynamic webpages, language concepts including syntax and flow control statements variable handling given their loosely typed nature built-in reference types such as object and array object-oriented programing powerful aspects of function expressions Browser Object Model allowing interaction with the browser itself detecting the client and its capabilities Document Object Model (DOM) objects available in DOM Level 1 how DOM Levels 2 and 3 augmented the DOM events, legacy support, and how the DOM redefined how events should work enhancing form interactions and working around browser limitations using the canvas tag to create on-the-fly graphics JavaScript API changes in HTML5 how browsers handle JavaScript errors and error handling features of JavaScript used to read and manipulate XML data the JSON data format as an alternative to XML Ajax techniques including the use of XMLHttpRequest object and CORS complex patterns including function currying, partial function application, and dynamic functions offline detection and storing data on the client machine techniques for JavaScript in an enterprise environment for better maintainability This book is aimed at three groups of readers: Experienced object-oriented programming developers looking to learn JavaScript as it relates to traditional OO languages such as Java and C++; Web application developers attempting to enhance site usability; novice JavaScript developers. Nicholas C. Zakas worked with the Web for over a decade. He has worked on corporate intranet applications used by some of the largest companies in the world and large-scale consumer websites such as MyYahoo! and the Yahoo! homepage. He regularly gives talks at companies and conferences regarding front-end best practices and new technology.", + "pageCount": 960, + "stock": 4, + "publisher": "John Wiley & Sons", + "publishedDate": "2012-01-18", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=5pr15F4JbCUC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Coding with JavaScript For Dummies", + "isbn": "9781119056072", + "author": "Chris Minnick, Eva Holland", + "synopsis": "Go from beginner to builder quickly with this hands-on JavaScript guide Coding with JavaScript For Dummies provides easy, hands-on instruction for anyone looking to learn this popular client-side language. No experience? No problem! This friendly guide starts from the very beginning and walks you through the basics, then shows you how to apply what you've learned to real projects. You'll start building right away, including web page elements and simple applications, so you can immediately see how JavaScript is used in the real world. Online exercises allow you to test your code and expand your skills, and the easy-to-follow instruction provides step-by-step guidance toward understanding the JavaScript syntax, applications, and language. JavaScript enhances static web pages by providing dynamic elements that can adapt and react to user action. It's a need-to-know tool for aspiring web designers, but anyone can benefit from understanding this core development language. Coding with JavaScript For Dummies takes you from beginner to builder quickly as you: Learn what JavaScript does, how it works, and where to use it Master the core elements of JavaScript and immediately put it to work Build interactive web elements and try out your code online Create basic applications as you apply JavaScript to the app development workflow Anytime a website responds to your movement around the screen, that's JavaScript. It makes websites more functional, more beautiful, and more engaging, and your site visitors will demand nothing less. If you want to build a better website, you need JavaScript. If you need JavaScript, Coding with JavaScript For Dummies gets you started off quickly and painlessly, with plenty of hands-on practice.", + "pageCount": 371, + "stock": 3, + "publisher": "John Wiley & Sons", + "publishedDate": "2015-05-26", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=MhNhBgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Eloquent JavaScript", + "isbn": "9781593272821", + "author": "Marijn Haverbeke", + "synopsis": "Provides information and examples on writing JavaScript code, covering such topics as syntax, control, data, regular expressions, and scripting.", + "pageCount": 227, + "stock": 1, + "publisher": "No Starch Press", + "publishedDate": "2011", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=9U5I_tskq9MC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "React in Action", + "isbn": "1617293857", + "author": "Mark Tielens Thomas", + "synopsis": "Summary React in Action introduces front-end developers to the React framework and related tools. This clearly written, example-rich book begins by introducing you to React, diving into some of the fundamental ideas in React, and working with components. In the second section, you'll explore the different ways that data works in React as well as learning more about components. You'll also find several useful appendixes covering related topics like React tooling and the React ecosystem. Purchase of the print book includes a free eBook in PDF, Kindle, and ePub formats from Manning Publications. About the Technology Facebook created React to help deliver amazing user experiences on a website with thousands of components and an incomprehensible amount of traffic. The same powerful tools are available to you too! The key is a clever design for managing state, data flow, and rendering, so your application is easy to think about and runs smoothly. Add an incredibly rich ecosystem of components and libraries, and you've got a recipe for building web apps that will delight both developers and users. About the Book React in Action teaches you to think like a pro about user interfaces and building them with React. This practical book gets you up and running quickly with hands-on examples in every chapter. You'll master core topics like rendering, lifecycle methods, JSX, data flow, forms, routing, integrating with third-party libraries, and testing. And the included application design ideas will help make your apps pop. As you learn to integrate React into full-stack applications, you'll explore state management with Redux and server-side rendering, and even dabble in React Native for mobile UIs. What's Inside React from the ground up Implementing a routing system with components Server-side rendering in Node.js Working with third-party libraries Testing React components About the Reader Written for developers familiar with HTML, CSS, and JavaScript. About the Author Mark Thomas is an experienced software engineer who works daily with React, JavaScript, and Node.js. He loves clean code, beautiful systems, and good coffee. Table of Contents PART 1 - MEET REACT Meet React Our first component PART 2 - COMPONENTS AND DATA IN REACT Data and data flow in React Rendering and lifecycle methods in React Working with forms in React Integrating third-party libraries with React Routing in React More routing and integrating Firebase Testing React components PART 3 - REACT APPLICATION ARCHITECTURE Redux application architecture More Redux and integrating Redux with React React on the server and integrating React Router An introduction to React Native", + "pageCount": 0, + "stock": 1, + "publisher": "Manning", + "publishedDate": "2018-07-08", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=S8gBMQAACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Beginning ReactJS Foundations Building User Interfaces with ReactJS", + "isbn": "9781119685586", + "author": "Chris Minnick", + "synopsis": "Quickly learn the most widely used front-end development language with ease and confidence React JS Foundations: Building User Interfaces with ReactJS - An Approachable Guide walks readers through the fundamental concepts of programming with the explosively popular front-end tool known as React JS. Written by an accomplished full-stack engineer, speaker, and community organizer, React JS Foundations teaches readers how to understand React and how to begin building applications with it. The book: Explains and clarifies technical terminology with relevant and modern examples to assist people new to programming understand the language Helps experienced programmers quickly get up to speed with React Is stocked throughout with practical and applicable examples of day-to-day React work Perfect for beginner, intermediate, and advanced programmers alike, React JS Foundations will quickly bring you up to speed on one of the most useful and widely used front-end languages on the web today. You can start building your first application today.", + "pageCount": 726, + "stock": 5, + "publisher": "John Wiley & Sons", + "publishedDate": "2022-02-03", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=J89cEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "React 17 Design Patterns and Best Practices", + "isbn": "9781800561762", + "author": "Carlos Santana Roldan", + "synopsis": "Build scalable, maintainable, and powerful React web apps with design patterns and insightful best practices Key Features Make the most of design patterns in React – including render props and controlled and uncontrolled inputs Master React Hooks with the help of this updated third edition Work through examples that can be used to create reusable code and extensible designs Book Description Filled with useful React patterns that you can use in your projects straight away, this book will help you save time and build better web applications with ease. React 17 Design Patterns and Best Practices is a hands-on guide for those who want to take their coding skills to a new level. You'll spend most of your time working your way through the principles of writing maintainable and clean code, but you'll also gain a deeper insight into the inner workings of React. As you progress through the chapters, you'll learn how to build components that are reusable across the application, how to structure applications, and create forms that actually work. Then you'll build on your knowledge by exploring how to style React components and optimize them to make applications faster and more responsive. Once you've mastered the rest, you'll learn how to write tests effectively and how to contribute to React and its ecosystem. By the end of this book, you'll be able to avoid the process of trial and error and developmental headaches. Instead, you'll be able to use your new skills to efficiently build and deploy real-world React web applications you can be proud of. What you will learn Get to grips with the techniques of styling and optimizing React components Create components using the new React Hooks Use server-side rendering to make applications load faster Get up to speed with the new React Suspense technique and using GraphQL in your projects Write a comprehensive set of tests to create robust and maintainable code Build high-performing applications by optimizing components Who this book is for This book is for web developers who want to understand React better and apply it to real-life app development. You'll need an intermediate-level experience with React and JavaScript before you get started.", + "pageCount": 381, + "stock": 4, + "publisher": "Packt Publishing Ltd", + "publishedDate": "2021-05-17", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=viIvEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Hands-On Design Patterns with React Native", + "isbn": "9781788999540", + "author": "Mateusz Grzesiukiewicz", + "synopsis": "Learn how to write cross platform React Native code by using effective design patterns in the JavaScript world. Get to know industry standard patterns as well as situational patterns. Decouple your application with these set of “Idea patterns”. Key FeaturesMobile development in React Native should be done in a reusable way. Learn how to build scalable applications using JavaScript patterns that are battle tested.Try effective techniques on your own using over 80 standalone examples.Book Description React Native helps developers reuse code across different mobile platforms like iOS and Android. This book will show you effective design patterns in the React Native world and will make you ready for professional development in big teams. The book will focus only on the patterns that are relevant to JavaScript, ECMAScript, React and React Native. However, you can successfully transfer a lot of the skills and techniques to other languages. I call them “Idea patterns”. This book will start with the most standard development patterns in React like component building patterns, styling patterns in React Native and then extend these patterns to your mobile application using real world practical examples. Each chapter comes with full, separate source code of applications that you can build and run on your phone. The book is also diving into architectural patterns. Especially how to adapt MVC to React environment. You will learn Flux architecture and how Redux is implementing it. Each approach will be presented with its pros and cons. You will learn how to work with external data sources using libraries like Redux thunk and Redux Saga. The end goal is the ability to recognize the best solution for a given problem for your next mobile application. What you will learnExplore the design Patterns in React NativeLearn the best practices for React Native developmentExplore common React patterns that are highly used within React Native developmentLearn to decouple components and use dependency injection in your applicationsExplore the best ways of fetching data from the backend systemsLearn the styling patterns and how to implement custom mobile designsExplore the best ways to organize your application code in big codebasesWho this book is for The ideal target audience for this book are people eager to learn React Native design patterns who already know the basics of JavaScript. We can assume that the target audience already knows how to write Hello World in JavaScript and know what are the functions, recursive functions, JavaScript types and loops.", + "pageCount": 297, + "stock": 4, + "publisher": "Packt Publishing Ltd", + "publishedDate": "2018-09-29", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=Iv1wDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Menguasai React JS Untuk Pemula", + "isbn": "-", + "author": "Rohi Abdulloh", + "synopsis": "Buku ini ditujukan bagi siapa saja yang ingin menguasai React. Pembahasan dimulai teori dasar JavaScript, sehingga buku ini dapat diikuti oleh orang yang baru mengenal JavaScript sekalipun. Buku ini dibuat dengan skrip berwarna, harapannya akan lebih mudah diikuti dan dipahami. Setiap pembahasan disertai contoh skrip dan hasilnya. File-file latihan pada buku ini diminta melalui email penulis dengan menyertakan bukti pembelian buku. Total halaman buku ini sampai 400 lebih halaman. Materi yang dibahas meliputi: - Teori dasar JavaScript - Teori dasr React - Menggunakan Component Library - Menggunakan Material UI - Menerapkan Routing dan AJAX - Integrasi dengan Laravel dan Inertia Buku ini ditulis oleh penulis yang sudah berpengalaman menulis buku-buku best seller. Bahkan buku-bukunya banyak yang dikoleksi oleh pembaca. Salah satu keunggulan dari buku-bukunya yaitu mudah diikuti oleh pemula sekalipun.", + "pageCount": 407, + "stock": 3, + "publisher": "Rohi Abdulloh", + "publishedDate": "2020-11-25", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=jq4LEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Young Adult Nonfiction" + }, + { + "title": "React.js Essentials", + "isbn": "1783551623", + "author": "Artemij Fedosejev", + "synopsis": "This book will help you understand why big organizations use React.js to build web applications with maintainable and performant user interfaces. From creating UI elements to testing and exploring scaling solutions, this book will take you through building your own maintainable React.js application in no time.", + "pageCount": 0, + "stock": 2, + "publishedDate": "2015", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=xEApjgEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Application software" + }, + { + "title": "Learning React", + "isbn": "9780134843575", + "author": "Kirupa Chinnathambi", + "synopsis": "Learning React A hands-on guide to building web applications using React and Redux As far as new web frameworks and libraries go, React is quite the runaway success. It not only deals with the most common problems developers face when building complex apps, it throws in a few additional tricks that make building the visuals for such apps much, much easier. What React isn’t, though, is beginner-friendly and approachable. Until now. In Learning React, author Kirupa Chinnathambi brings his fresh, clear, and very personable writing style to help web developers new to React understand its fundamentals and how to use it to build really performant (and awesome) apps. The only book on the market that helps you get your first React app up and running in just minutes, Learning Reactis chock-full of colorful illustrations to help you visualize difficult concepts and practical step-by-step examples to show you how to apply what you learn. Build your first React app Create components to define parts of your UI Combine components into other components to build more complex UIs Use JSX to specify visuals without writing full-fledged JavaScript Deal with maintaining state Work with React’s way of styling content Make sense of the mysterious component lifecycle Build multi-page apps using routing and views Optimize your React workflow using tools such as Node, Babel, webpack, and others Use Redux to make managing your app data and state easy Contents at a Glance 1 Introducing React 2 Building Your First React App 3 Components in React 4 Styling in React 5 Creating Complex Components 6 Transferring Properties 7 Meet JSX... Again! 8 Dealing with State in React 9 Going from Data to UI in React 10 Events in React 11 The Component Lifecycle 12 Accessing DOM Elements in React 13 Setting Up Your React Dev Environment 14 Working with External Data in React 15 Building an Awesome Todo List App in React 16 Creating a Sliding Menu in React 17 Avoiding Unnecessary Renders in React 18 Creating a Single-Page App in React Using React Router 19 Introduction to Redux 20 Using Redux with React", + "pageCount": 747, + "stock": 3, + "publisher": "Addison-Wesley Professional", + "publishedDate": "2018-04-26", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=7KVYDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Pro React 16", + "isbn": "1484244508", + "author": "Adam Freeman", + "synopsis": "Use the enormously popular React framework to build dynamic JavaScript applications that take advantage of the capabilities of modern browsers and devices. You will learn how React brings the power of strong architecture and responsive data to the client, providing the foundation for complex and rich user interfaces. Best-selling author Adam Freeman explains how to get the most from React. He begins by describing the React architecture and the benefits it offers and then shows you how to use React and its associated tools and libraries in your projects, starting from the nuts and bolts and building up to the most advanced and sophisticated features, going in-depth to give you the knowledge you need. Each topic is presented clearly and concisely. Chapters include common problems and how to avoid them. What You’ll Learn Gain a solid understanding of the React design Create rich and dynamic web app clients using React Create data stores using Redux Consume data using REST and GraphQL Test your React projects Who This Book Is For JavaScript developers who want to use React to create dynamic client-side applications", + "pageCount": 745, + "stock": 2, + "publisher": "Apress", + "publishedDate": "2019-03-20", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=dKD8vwEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "React Projects", + "isbn": "9781789953398", + "author": "Roy Derks", + "synopsis": "Build cross-platform applications of varying complexity for the web, mobile, and VR devices using React tooling Key FeaturesBuild React applications at scale using effective React patterns and best practicesExplore React features such as Hooks, the Context API, and the Suspense APIExtend React’s integration with React Native for building cross-platform mobile apps and gamesBook Description Developed by Facebook, React is a popular library for building impressive user interfaces. React extends its capabilities to the mobile platform using the React Native framework and integrates with popular web and mobile tools to build scalable applications. React Projects is your guide to learning React development by using modern development patterns and integrating React with powerful web tools such as GraphQL, Expo, and React 360. You'll start building a real-world project right from the first chapter and get hands on with developing scalable applications as you advance to building more complex projects. Throughout the book, you'll use the latest versions of React and React Native to explore features such as Higher Order Components (HOC), Context, and Hooks on multiple platforms, which will help you build full stack web and mobile applications efficiently. Finally, you'll delve into unit testing with Jest to build test-driven apps. By the end of this React book, you'll have developed the skills necessary to start building scalable React apps across web and mobile platforms. What you will learnCreate a wide range of applications using various modern React tools and frameworksDiscover how React Hooks modernize state management for React appsDevelop progressive web applications using React componentsBuild test-driven React applications using the Jest and Enzyme frameworksUnderstand full stack development using React, Apollo, and GraphQLPerform server-side rendering using React and React RouterDesign gestures and animations for a cross-platform game using React NativeWho this book is for The book is for JavaScript developers who want to explore React tooling and frameworks for building cross-platform applications. Basic knowledge of web development, ECMAScript, and React will assist with understanding key concepts covered in this book.", + "pageCount": 465, + "stock": 3, + "publisher": "Packt Publishing Ltd", + "publishedDate": "2019-12-20", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=2HvGDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Learning React Native", + "isbn": "9781491989098", + "author": "Bonnie Eisenman", + "synopsis": "Get a practical introduction to React Native, the JavaScript framework for writing and deploying fully featured mobile apps that render natively. The second edition of this hands-on guide shows you how to build applications that target iOS, Android, and other mobile platforms instead of browsers—apps that can access platform features such as the camera, user location, and local storage. Through code examples and step-by-step instructions, web developers and frontend engineers familiar with React will learn how to build and style interfaces, use mobile components, and debug and deploy apps. You’ll learn how to extend React Native using third-party libraries or your own Java and Objective-C libraries. Understand how React Native works under the hood with native UI components Examine how React Native’s mobile-based components compare to basic HTML elements Create and style your own React Native components and applications Take advantage of platform-specific APIs, as well as modules from the framework’s community Incorporate platform-specific components into cross-platform apps Learn common pitfalls of React Native development, and tools for dealing with them Combine a large application’s many screens into a cohesive UX Handle state management in a large app with the Redux library", + "pageCount": 242, + "stock": 4, + "publisher": "\"O'Reilly Media, Inc.\"", + "publishedDate": "2017-10-23", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=xAg7DwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "A simpel basic tutor programming", + "isbn": "-", + "author": "-", + "synopsis": "tutorial buku tentang awal pembuatan project dengan react native", + "stock": 2, + "publisher": "Lan Dev", + "publishedDate": "2017-01-17", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=kbjPDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Young Adult Nonfiction" + }, + { + "title": "Fullstack React", + "isbn": "0991344626", + "author": "Accomazzo Anthony, Murray Nathaniel, Ari Lerner", + "synopsis": "LEARN REACT TODAY The up-to-date, in-depth, complete guide to React and friends. Become a ReactJS expert today", + "pageCount": 836, + "stock": 2, + "publisher": "Fullstack.IO", + "publishedDate": "2017-03", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=ppjUtAEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "React and React Native", + "isbn": "9781839212437", + "author": "Adam Boduch, Roy Derks", + "synopsis": "Get up to speed with React, React Native, GraphQL and Apollo for building cross-platform native apps with the help of practical examples Key FeaturesCovers the latest features of React such as Hooks, Suspense, NativeBase, and Apollo in this updated third editionGet to grips with the React architecture for writing easy-to-manage web and mobile applicationsUnderstand GraphQL and Apollo for building a scalable backend for your cross-platform appsBook Description React and React Native, Facebook's innovative User Interface (UI) libraries, are designed to help you build robust cross-platform web and mobile applications. This updated third edition is improved and updated to cover the latest version of React. The book particularly focuses on the latest developments in the React ecosystem, such as modern Hook implementations, code splitting using lazy components and Suspense, user interface framework components using Material-UI, and Apollo. In terms of React Native, the book has been updated to version 0.62 and demonstrates how to apply native UI components for your existing mobile apps using NativeBase. You will begin by learning about the essential building blocks of React components. Next, you'll progress to working with higher-level functionalities in application development, before putting this knowledge to use by developing user interface components for the web and for native platforms. In the concluding chapters, you'll learn how to bring your application together with a robust data architecture. By the end of this book, you'll be able to build React applications for the web and React Native applications for multiple mobile platforms. What you will learnDelve into the React architecture, component properties, state, and contextGet to grips with React Hooks for handling functions and componentsImplement code splitting in React using lazy components and SuspenseBuild robust user interfaces for mobile and desktop apps using Material-UIWrite shared components for Android and iOS mobile apps using React NativeSimplify layout design for React Native apps using NativeBaseWrite GraphQL schemas to power web and mobile appsImplement web and mobile components that are driven by ApolloWho this book is for This book is for any JavaScript developer who wants to start learning how to use Facebook's UI libraries, React and React Native, for mobile and web application development. Although no prior knowledge of React is needed, working knowledge of JavaScript programming will help you understand the concepts covered in the book more effectively.", + "pageCount": 505, + "stock": 4, + "publisher": "Packt Publishing Ltd", + "publishedDate": "2020-04-30", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=XCLhDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Full-Stack React, TypeScript, and Node", + "isbn": "9781839214691", + "author": "David Choi", + "synopsis": "Discover the current landscape of full-stack development and how to leverage modern web technologies for building production-ready React.js applications to deploy on AWS Key FeaturesUnderstand the architecture of React and single-page applicationsBuild a modern Web API for your SPA using Node.js, Express, and GraphQLGain a clear and practical understanding of how to build a complete full-stack applicationBook Description React sets the standard for building high-performance client-side web apps. Node.js is a scalable application server that is used in thousands of websites, while GraphQL is becoming the standard way for large websites to provide data and services to their users. Together, these technologies, when reinforced with the capabilities of TypeScript, provide a cutting-edge stack for complete web application development. This book takes a hands-on approach to implementing modern web technologies and the associated methodologies for building full-stack apps. You’ll begin by gaining a strong understanding of TypeScript and how to use it to build high-quality web apps. The chapters that follow delve into client-side development with React using the new Hooks API and Redux. Next, you’ll get to grips with server-side development with Express, including authentication with Redis-based sessions and accessing databases with TypeORM. The book will then show you how to use Apollo GraphQL to build web services for your full-stack app. Later, you’ll learn how to build GraphQL schemas and integrate them with React using Hooks. Finally, you’ll focus on how to deploy your application onto an NGINX server using the AWS cloud. By the end of this book, you’ll be able to build and deploy complete high-performance web applications using React, Node, and GraphQL. What you will learnDiscover TypeScript’s most important features and how they can be used to improve code quality and maintainabilityUnderstand what React Hooks are and how to build React apps using themImplement state management for your React app using ReduxSet up an Express project with TypeScript and GraphQL from scratchBuild a fully functional online forum app using React and GraphQLAdd authentication to your web app using RedisSave and retrieve data from a Postgres database using TypeORMConfigure NGINX on the AWS cloud to deploy and serve your appsWho this book is for The book is for web developers who want to go beyond front-end web development and enter the world of full-stack web development by learning about modern web technologies and how they come together. A good understanding of JavaScript programming is required before getting started with this web development book.", + "pageCount": 648, + "stock": 4, + "publisher": "Packt Publishing Ltd", + "publishedDate": "2020-12-18", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=uUMQEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "React: Cross-Platform Application Development with React Native", + "isbn": "9781789139600", + "author": "Emilio Rodriguez Martinez", + "synopsis": "With React Native, you can build native mobile apps that are much more powerful, interactive, and faster by using JavaScript. React Native helps web and mobile developers to build cross-platform apps at a high level. This book takes you through four projects to help understand of the framework and build mobile apps with native user experience.", + "pageCount": 183, + "stock": 2, + "publisher": "Packt Publishing Ltd", + "publishedDate": "2018-03-13", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=MZRRDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "React Native for Mobile Development", + "isbn": "9781484244548", + "author": "Akshat Paul, Abhishek Nalwaya", + "synopsis": "Develop native iOS and Android apps with ease using React Native. Learn by doing through an example-driven approach, and have a substantial running app at the end of each chapter. This second edition is fully updated to include ES7 (ECMAScript 7), the latest version of React Native (including Redux), and development on Android. You will start by setting up React Native and exploring the anatomy of React Native apps. You'll then move on to Redux data flow, how it differs from flux, and how you can include it in your React Native project to solve state management differently and efficiently. You will also learn how to boost your development by including popular packages developed by the React Native community that will help you write less; do more. Finally, you'll learn to how write test cases using Jest and submit your application to the App Store. React Native challenges the status quo of native iOS and Android development with revolutionary components, asynchronous execution, unique methods for touch handling, and much more. This book reveals the the path-breaking concepts of React.js and acquaints you with the React way of thinking so you can learn to create stunning user interfaces. What You'll Learn Build stunning iOS and Android applications Understand the Redux design pattern and use it in your project Interact with iOS and android device capabilities such as addressbook, camera, GPS and more with your apps Test and launch your application to the App StoreWho This Book Is For Anyone with JavaScript experience who wants to build native mobile applications but dreads the thought of programming in Objective-C or Java. Developers who have experience with JavaScript but are new or not acquainted to React Native or ReactJS.", + "pageCount": 243, + "stock": 1, + "publisher": "Apress", + "publishedDate": "2019-06-12", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=0DidDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Panduan Membuat Aplikasi Ujian Online Dengan Laravel 8, React dan Inertia", + "isbn": "-", + "author": "Rohi Abdulloh", + "synopsis": "Ebook ini membahas step by step pembuatan aplikasi ujian online menggunakan Laravel 8, React dan Inertia. Laravel merupakan framework PHP paling populer saat ini untuk pengembangan aplikasi pada sisi back end. Sedangkan React merupakan framework JavaScript yang paling populer untuk pengembangan aplikasi pada sisi front end. Cara termudah mengintegrasikan Laravel dan React yaitu dengan menggunakan Inertia yang memungkinkan menggunakan Laravel dan React tanpa membuat Rest API. Beberapa fitur dalam aplikasi ini meliputi: · Import soal dari excel, sehingga soal tidak perlu input satu-satu ke aplikasi. · Import dan eksport peserta ujian dengan password dapat dibuat sendiri atau dibuat oleh aplikasi. · Export nilai dan jawaban yang dapat digunakan untuk keperluan analisis soal. · Pilihan acak soal, acak jawaban dan tampilkan hasil ujian ke siswa yang dapat diatur sesuai kebutuhan. · Pembagian sesi ujian, sehingga peserta hanya dapat mengakses ujian pada waktu yang sudah dijadwalkan. · Count down timer yang akan menghentikan ujian jika waktunya selesai. · Jika ada kejadian tak terduga, misal mati lampu atau komputer rusak, peserta dapat melanjutkan dengan waktu yang tersisa. Demo aplikasi dapat dilihat di: https://www.youtube.com/watch?v=loHmBPIc6Dg", + "pageCount": 168, + "stock": 2, + "publisher": "Rohi Abdulloh", + "publishedDate": "2021-05-05", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=cqcsEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "React: Building Modern Web Applications", + "isbn": "9781786462848", + "author": "Jonathan Hayward, Artemij Fedosejev, Narayan Prusty, Adam Horton, Ryan Vice, Ethan Holmes, Tom Bray", + "synopsis": "Master the art of building dynamic, modern web applications with React About This Book Learn the hot new frontend web framework from Facebook – ReactJS, an easy way of developing the V in MVC and a better approach to software engineering in JavaScript A fast-paced guide to designing and building scalable and maintainable web apps with React.js Learn all the new ES6 features and be among the most prominent JavaScript developers who can write efficient JS programs as per the latest standards Master the art of building modern web applications using React Learn to build modern native iOS and Android applications using JavaScript and the incredible power of React Who This Book Is For This course is for web developers that want to unlock high performance dynamism in the applications that they create. If you want a comprehensive journey into one of the most important JavaScript frameworks around today, dive into this course. What You Will Learn Take control of the front end with reactive JavaScript programming Discover what ReactJS offers your development - before mastering it Create React elements with properties and children Use JSX to speed up your React development process Test your React components with the Jest test framework Learn the latest syntax of ES6 Execute ES6 in a non-supported ES6 environment Learn the principles of object-oriented programming Create a complete single-page application Use an application design plan to write smarter, more meaningful code Learn how to use animations to give extra style to your application Get to grips with the React Native environment Write your own custom native UI components Integrate native modules in Objective-C and Java that interact with JavaScript In Detail ReactJS has helped to transform the web as we know it. Designed by Facebook to help developers build rapid, responsive UI that can deal with data-intensive usage, it's an essential component in any web developer's skillset. This ReactJS course, in five connected modules, provides you with a fast, engaging and practical route into ReactJS—so you can build powerful, elegant, and modern web applications. Beginning with the Reactive Programming with JavaScript module, you will learn how to take advantage of a reactive and functional programming paradigm to rethink how you approach your JavaScript code. It's built to help you understand the concepts, relevant and applicable for any frontend developer. You'll then dive a little deeper into ReactJS. The second module gives you a rapid look through the fundamentals of ReactJS, showing you how to build a basic application and demonstrating how to implement the Flux architecture. In the third module you will get to grips with ES6—this will make you a more fluent JavaScript developer, giving you control over ReactJS. You can put your old JavaScript hacks aside and instead explore how to create ES6 custom iterators. In the final two modules you'll learn how to fully master ReactJS, exploring its wider ecosystem of tools that have helped to make it one of the most important tools in web development today. Ending with insights and guidance on React Native, the tool built for today's demand for native, intuitive user experiences and interfaces, with this course you can be confident in building dynamic and modern apps with React. Style and approach Consisting of five separate modules, journey from the fundamentals of reactive programming to the exciting possibilities of React Native. Each module builds on each other, helping you to incrementally develop your skills and knowledge.", + "pageCount": 910, + "stock": 5, + "publisher": "Packt Publishing Ltd", + "publishedDate": "2016-06-10", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=jUvZDQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Full-Stack Web Development with GraphQL and React", + "isbn": "9781801079174", + "author": "Sebastian Grebe", + "synopsis": "Unleash the power of GraphQL, React 17, Node, and Express to build a scalable and production-ready application from scratch to be deployed on AWS Key FeaturesBuild full-stack applications with modern APIs using GraphQL and React HooksIntegrate Apollo into React and build frontend components using GraphQLImplement a self-updating notification pop-up with a unique GraphQL feature called SubscriptionsBook Description React and GraphQL, when combined, provide you with a very dynamic, efficient, and stable tech stack to build web-based applications. GraphQL is a modern solution for querying an API that represents an alternative to REST and is the next evolution in web development. This book guides you in creating a full-stack web application from scratch using modern web technologies such as Apollo, Express.js, Node.js, and React. First, you'll start by configuring and setting up your development environment. Next, the book demonstrates how to solve complex problems with GraphQL, such as abstracting multi-table database architectures and handling image uploads using Sequelize. You'll then build a complete Graphbook from scratch. While doing so, you'll cover the tricky parts of connecting React to the backend, and maintaining and synchronizing state. In addition to this, you'll also learn how to write Reusable React components and use React Hooks. Later chapters will guide you through querying data and authenticating users in order to enable user privacy. Finally, you'll explore how to deploy your application on AWS and ensure continuous deployment using Docker and CircleCI. By the end of this web development book, you'll have learned how to build and deploy scalable full-stack applications with ease using React and GraphQL. What you will learnBuild a GraphQL API by implementing models and schemas with Apollo and SequelizeSet up an Apollo Client and build frontend components using ReactWrite Reusable React components and use React HooksAuthenticate and query user data using GraphQLUse Mocha to write test cases for your full-stack applicationDeploy your application to AWS using Docker and CircleCIWho this book is for This React GraphQL book is for web developers familiar with React and GraphQL who want to enhance their skills and build full-stack applications using industry standards like React, Apollo, Node.js, and SQL at scale while learning to solve complex problems with GraphQL.", + "pageCount": 473, + "stock": 4, + "publisher": "Packt Publishing Ltd", + "publishedDate": "2022-02-28", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=GPBbEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "React Components", + "isbn": "9781785883729", + "author": "Christopher Pitt", + "synopsis": "Explore the power of React components for cutting-edge web development About This Book Learn to build better websites by creating a variety of different components in React Conceptualize the design and build maintainable web apps with the help of components A fast-paced guide to help you learn about component-based development in React Who This Book Is For This book is ideal for developers who are familiar with the basics of React and are looking for a guide to building a wide range of components as well as develop component-driven UIs. What You Will Learn How to structure an app into components Working with nested components Work with nested components Set up communication across components Style the existing components Work with Material Design as a component Render components on the server Make the best of design patterns Make the app pluggable In Detail The reader will learn how to use React and its component-based architecture in order to develop modern user interfaces. A new holistic way of thinking about UI development will establish throughout this book and the reader will discover the power of React components with many examples. After reading the book and following the example application, the reader has built a small to a mid-size application with React using a component based UI architecture. The book will take the reader through a journey to discover the benefits of component-based user interfaces over the classical MVC architecture. Throughout the book, the reader will develop a wide range of components and then bring them together to build a component-based UI. By the end of this book, readers would have learned several techniques to build powerful components and how the component-based development is beneficial over regular web development. Style and approach This book is a compact, example-driven guide that provides a step-by-step approach.", + "pageCount": 182, + "stock": 3, + "publisher": "Packt Publishing Ltd", + "publishedDate": "2016-04-21", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=_97JDAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Encyclopedia of World Biography", + "isbn": "WISC:89063818827", + "author": "-", + "synopsis": "Presents brief biographical sketches which provide vital statistics as well as information on the importance of the person listed.", + "pageCount": 558, + "stock": 2, + "publisher": "Gale", + "publishedDate": "1998", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=UbWRXPJnwbQC&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Biography" + }, + { + "title": "Virgil Thomson", + "isbn": "UOM:39015010408246", + "author": "Michael Meckna", + "pageCount": 240, + "stock": 5, + "publisher": "Greenwood", + "publishedDate": "1986-08-13", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=sT0bAAAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Music" + }, + { + "title": "AWS CLI Command", + "isbn": "-", + "author": "RB ASHISH", + "synopsis": "Master the step by step guide to AWS CLI Command Amazon Web Services Cmd line Interface. With just single tool you can configure, control and manage all your AWS Services through command line and automate them with scripts. Some of the services includes are: • apigateway • autoscaling • batch • cloudformation • dynamodb • ec2 • glacier • iam • kms • lambda • machinelearning • rds • route53 • s3 • swf • waf and more.", + "pageCount": 26, + "stock": 5, + "publisher": "CreateSpace", + "publishedDate": "2018-10-08", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=4aFmDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Bulletin", + "isbn": "STANFORD:36105032873403", + "author": "-", + "pageCount": 246, + "stock": 4, + "publishedDate": "1980", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=rypRAQAAIAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Geology" + }, + { + "title": "Mohammad Amien Rais", + "isbn": "UOM:39015061569961", + "author": "Zaim Uchrowi", + "synopsis": "Biography of Mohammad Amien Rais, an Indonesian Muslim political leader.", + "pageCount": 400, + "stock": 2, + "publishedDate": "2004", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=U_1wAAAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Indonesia" + }, + { + "title": "Gian Carlo Menotti", + "isbn": "9780313095948", + "author": "Donald L. Hixon", + "synopsis": "Gian Carlo Menotti is a composer known chiefly for his popular operas, including Amahl and the Night Visitors, The Medium, and The Consul. He also wrote a considerable amount of choral, instrumental and chamber music. This addition to the Greenwood Press series Bio-Bibliographies in Music serves as a reference guide to Menotti's career. A brief biographical sketch precedes a chronologically arranged bibliography of general writings by and about Menotti followed by a detailed list of works, alphabetically arranged. A bibliography of writings about specific compositions, complete with selected contemporary critical reviews, includes data on premiers and other significant performances and discographies of recordings. Opera music scholars, along with Menotti fans, will appreciate this detailed guide to available research materials. Intended as a scholarly resource, this volume also includes two appendices, a chronological list of works and a genre list of works. An author index and a separate performer index are provided.", + "pageCount": 356, + "stock": 5, + "publisher": "Bloomsbury Publishing USA", + "publishedDate": "2000-02-28", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=iknEEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Music" + }, + { + "title": "Linux Device Drivers", + "isbn": "9780596005900", + "author": "Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman", + "synopsis": "Provides information on writing a driver in Linux, covering such topics as character devices, network interfaces, driver debugging, concurrency, and interrupts.", + "pageCount": 636, + "stock": 5, + "publisher": "\"O'Reilly Media, Inc.\"", + "publishedDate": "2005-02-07", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=MTibAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Allgemeines Künstlerlexikon Bio-bibliographischer Index A-Z", + "isbn": "UCSC:32106020097306", + "author": "-", + "pageCount": 904, + "stock": 4, + "publishedDate": "1999", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=U8kiAQAAIAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Allgemeines Künstlerlexikon" + }, + { + "title": "Bioethanol Production from Food Crops", + "isbn": "9780128137673", + "author": "Ramesh C. Ray, S Ramachandran", + "synopsis": "Bioethanol Production from Food Crops: Sustainable Sources, Interventions and Challenges comprehensively covers the global scenario of ethanol production from both food and non-food crops and other sources. The book guides readers through the balancing of the debate on food vs. fuel, giving important insights into resource management and the environmental and economic impact of this balance between demands. Sections cover Global Bioethanol from Food Crops and Forest Resource, Bioethanol from Bagasse and Lignocellulosic wastes, Bioethanol from algae, and Economics and Challenges, presenting a multidisciplinary approach to this complex topic. As biofuels continue to grow as a vital alternative energy source, it is imperative that the proper balance is reached between resource protection and human survival. This book provides important insights into achieving that balance. Presents technological interventions in ethanol production, from plant biomass, to food crops Addresses food security issues arising from bioethanol production Identifies development bottlenecks and areas where collaborative efforts can help develop more cost-effective technology", + "pageCount": 460, + "stock": 2, + "publisher": "Academic Press", + "publishedDate": "2018-08-20", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=sm9qDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Technology & Engineering" + }, + { + "title": "Proceedings of the 15th International Symposium on Bioluminescence and Chemiluminescence", + "isbn": "9789812839572", + "author": "Xun Shen, Xiao-Lin Yang, Xin-Rong Zhang", + "synopsis": "In the last decade, great advances have been made in fundamental research and in the applications of bioluminescence and chemiluminescence. These techniques have become vital tools for laboratory analysis. Bioluminescence imaging has emerged as a powerful new optical imaging technique, offering real-time monitoring of spatial and temporal progression of biological processes in living animals. Bioluminescence resonance energy transfer (BRET) methodology has also emerged as a powerful technique for the study of proteinprotein interactions. Luciferase reporter gene technology facilitates monitoring of gene expression and is used to probe molecular mechanisms in the regulation of gene expression. Chemiluminescence detection and analysis have also found diverse applications in life science research; for example, chemiluminescent labels and substrates are now widely used in immunoassay and nucleic acid probe-based assays. The latest advances in this exciting field, from fundamental research to cutting-edge applications, are explored in this most recent volume of the biannual symposium series, the Proceedings of the 15th International Symposium on Bioluminescence and Chemiluminescence. The volume highlights advances in fundamental knowledge of luciferase-based bioluminescence, photoprotein-based bioluminescence, fundamental aspects and applications of chemiluminescence, luminescence imaging, fluorescence quantum dots and other inorganic fluorescent materials, phosphorescence and ultraweak luminescence, and instrumentation for measurement and imaging of luminescence.", + "pageCount": 504, + "stock": 2, + "publisher": "World Scientific", + "publishedDate": "2008", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=47tpDQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Science" + }, + { + "title": "Healing across Boundaries", + "isbn": "9781317324737", + "author": "Makarand R. Paranjape", + "synopsis": "This unique volume initiates a dialogue between bio-medicine and alternative therapeutics. Undertaking a multidisciplinary exploration of the science and spirituality of healing and wellness, it offers varied perspectives from doctors, medical researchers, Ayurvedic practitioners, philosophers, psychologists, sociologists, and cultural critics. It expands the horizons of health sciences in engaging with diverse traditions — bio-medicine, Ayurveda, Siddha, and Jaina bio-ethics. The book will interest scholars and researchers in social and community medicine, biological sciences, sociology and social anthropology, as well as cultural studies.", + "pageCount": 268, + "stock": 4, + "publisher": "Routledge", + "publishedDate": "2015-08-12", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=zcBcCgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Medical" + }, + { + "title": "Aleister Crowley", + "isbn": "9781780283845", + "author": "Tobias Churton", + "synopsis": "At last, the unexpurgated, true story of the amazing Aleister Crowley—philosopher, poet, artists, writer, magus, explorer, parapsychology—and spy. Packed with fresh research and previously unpublished ‘Crowleyana.’ For 100 years, Aleister Crowley’s true achievements have been suppressed and his true character defaced in a campaign of vilification unparalleled in British history. Until now, Crowley’s life has not been written—it has been written over. Tobias Churton is a world authority on Freemasonry, Rosicrucianism, and Gnosticism. In writing Aleister Crowley, he enjoyed complete access to all Crowley’s restricted papers, unpublished letters and personal diaries kept in a trust at London’s Warburg Institute and in the Ordo Templi Orientis archives. Ninety percent of the authentic material here has never before been published.", + "pageCount": 497, + "stock": 3, + "publisher": "Watkins Media Limited", + "publishedDate": "2014-05-20", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=NFjZCwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Biography & Autobiography" + }, + { + "title": "Microbial Sensing in Fermentation", + "isbn": "9781119247982", + "author": "Satinder K. Brar, Ratul K. Das, Saurabh J. Sarma", + "synopsis": "A comprehensive review of the fundamental molecular mechanisms in fermentation and explores the microbiology of fermentation technology and industrial applications Microbial Sensing in Fermentation presents the fundamental molecular mechanisms involved in the process of fermentation and explores the applied art of microbiology and fermentation technology. The text contains descriptions regarding the extraordinary sensing ability of microorganisms towards small physicochemical changes in their surroundings. The contributors — noted experts in the field — cover a wide range of topics such as microbial metabolism and production (fungi, bacteria, yeast etc); refined and non-refined carbon sources; bioprocessing; microbial synthesis, responses and performance; and biochemical, molecular and extra/intracellular controlling. This resource contains a compilation of literature on biochemical and cellular level mechanisms for microbial controlled production and includes the most significant recent advances in industrial fermentation. The text offers a balanced approach between theory and practical application, and helps readers gain a clear understanding of microbial physiological adaptation during fermentation and its cumulative effect on productivity. This important book: Presents the fundamental molecular mechanisms involved in microbial sensing in relation to fermentation technology Includes information on the significant recent advances in industrial fermentation Contains contributions from a panel of highly-respected experts in their respective fields Offers a resource that will be essential reading for scientists, professionals and researchers from academia and industry with an interest in the biochemistry and microbiology of fermentation technology Written for researchers, graduate and undergraduate students from diverse backgrounds, such as biochemistry and applied microbiology, Microbial Sensing in Fermentation offers a review of the fundamental molecular mechanisms involved in the process of fermentation.", + "pageCount": 344, + "stock": 1, + "publisher": "John Wiley & Sons", + "publishedDate": "2018-10-08", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=v3JyDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Science" + }, + { + "title": "Apache Spark Graph Processing", + "isbn": "9781784398958", + "author": "Rindra Ramamonjison", + "synopsis": "Build, process and analyze large-scale graph data effectively with Spark About This Book Find solutions for every stage of data processing from loading and transforming graph data to Improve the scalability of your graphs with a variety of real-world applications with complete Scala code. A concise guide to processing large-scale networks with Apache Spark. Who This Book Is For This book is for data scientists and big data developers who want to learn the processing and analyzing graph datasets at scale. Basic programming experience with Scala is assumed. Basic knowledge of Spark is assumed. What You Will Learn Write, build and deploy Spark applications with the Scala Build Tool. Build and analyze large-scale network datasets Analyze and transform graphs using RDD and graph-specific operations Implement new custom graph operations tailored to specific needs. Develop iterative and efficient graph algorithms using message aggregation and Pregel abstraction Extract subgraphs and use it to discover common clusters Analyze graph data and solve various data science problems using real-world datasets. In Detail Apache Spark is the next standard of open-source cluster-computing engine for processing big data. Many practical computing problems concern large graphs, like the Web graph and various social networks. The scale of these graphs - in some cases billions of vertices, trillions of edges - poses challenges to their efficient processing. Apache Spark GraphX API combines the advantages of both data-parallel and graph-parallel systems by efficiently expressing graph computation within the Spark data-parallel framework. This book will teach the user to do graphical programming in Apache Spark, apart from an explanation of the entire process of graphical data analysis. You will journey through the creation of graphs, its uses, its exploration and analysis and finally will also cover the conversion of graph elements into graph structures. This book begins with an introduction of the Spark system, its libraries and the Scala Build Tool. Using a hands-on approach, this book will quickly teach you how to install and leverage Spark interactively on the command line and in a standalone Scala program. Then, it presents all the methods for building Spark graphs using illustrative network datasets. Next, it will walk you through the process of exploring, visualizing and analyzing different network characteristics. This book will also teach you how to transform raw datasets into a usable form. In addition, you will learn powerful operations that can be used to transform graph elements and graph structures. Furthermore, this book also teaches how to create custom graph operations that are tailored for specific needs with efficiency in mind. The later chapters of this book cover more advanced topics such as clustering graphs, implementing graph-parallel iterative algorithms and learning methods from graph data. Style and approach A step-by-step guide that will walk you through the key ideas and techniques for processing big graph data at scale, with practical examples that will ensure an overall understanding of the concepts of Spark.", + "pageCount": 148, + "stock": 5, + "publisher": "Packt Publishing Ltd", + "publishedDate": "2015-09-10", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=cgSKCgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "p-Adic Valued Distributions in Mathematical Physics", + "isbn": "9789401583565", + "author": "Andrei Y. Khrennikov", + "synopsis": "Numbers ... , natural, rational, real, complex, p-adic .... What do you know about p-adic numbers? Probably, you have never used any p-adic (nonrational) number before now. I was in the same situation few years ago. p-adic numbers were considered as an exotic part of pure mathematics without any application. I have also used only real and complex numbers in my investigations in functional analysis and its applications to the quantum field theory and I was sure that these number fields can be a basis of every physical model generated by nature. But recently new models of the quantum physics were proposed on the basis of p-adic numbers field Qp. What are p-adic numbers, p-adic analysis, p-adic physics, p-adic probability? p-adic numbers were introduced by K. Hensel (1904) in connection with problems of the pure theory of numbers. The construction of Qp is very similar to the construction of (p is a fixed prime number, p = 2,3,5, ... ,127, ... ). Both these number fields are completions of the field of rational numbers Q. But another valuation 1 . Ip is introduced on Q instead of the usual real valuation 1 . I· We get an infinite sequence of non isomorphic completions of Q : Q2, Q3, ... , Q127, ... , IR = Qoo· These fields are the only possibilities to com plete Q according to the famous theorem of Ostrowsky.", + "pageCount": 264, + "stock": 4, + "publisher": "Springer Science & Business Media", + "publishedDate": "2013-03-09", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=JxYaCQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Science" + }, + { + "title": "Menteri Pertanian: Bicara Flu Burung (Bungaran Saragih, Anton Apriyantono)", + "isbn": "9786233440561", + "author": "Pusat Data Dan Analisa Tempo", + "synopsis": "Menteri Pertanian: Bicara Flu Burung (Bungaran Saragih, Anton Apriyantono)", + "stock": 4, + "publisher": "Tempo Publishing", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=_EZSEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "-" + }, + { + "title": "Billy the Kid, a Bio-bibliography", + "isbn": "UOM:39015011373282", + "author": "Jon Tuska", + "pageCount": 264, + "stock": 3, + "publisher": "Greenwood", + "publishedDate": "1983", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=6op5AAAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "COLLECTIVE BIOGRAPHY" + }, + { + "title": "Mechanics of Bio-Sediment Transport", + "isbn": "9783662611586", + "author": "Hongwei Fang, Lei Huang, Huiming Zhao, Wei Cheng, Yishan Chen, Mehdi Fazeli, Qianqian Shang", + "synopsis": "The main focus of this book is the transport mechanics of sediment particles coated with microbial biofilm, which is called bio-sediment. The book also addresses the question of how to measure and simulate the considerable variation in the properties of natural sediment associated with microbial biofilm, ranging from the micro-scale surface morphology to the macro-scale sediment transport. Nowadays most studies to elucidate the mechanisms of sediment transport have concentrated on physical-chemical sediment properties, little work explicitly coupled sediment dynamics and the environmental effects under the influence of micro-ecosystem, thus leaving a serious gap in water and sediment sciences as well as water ecological research. With respect to physical-chemical sediment properties, this book has been undertaken to evaluate and quantify the effect of biological factors - biofilm on sediment transport mechanics. The chapters cover topics including development of bio-sediment and its properties; model of biofilm growth on sediment substratum; bedform and flow resistance of bio-sediment bed; incipient velocity and settling velocity of bio-sediment; bedload and suspended load transport for bio-sediment; numerical simulation of bio-sediment transport. Besides, the measurement technology, analysis method and expression approach introduced in this book combine the characteristics of hydraulic, environmental and microbial research, having more immediate innovation. This book will be of interest to researchers, managers, practitioners, policy and decision makers, international institutions, governmental and non-governmental organizations, educators, as well as graduate and undergraduate students in the field of hydraulics and river dynamics. It will help to understand the relevance of sediment transport and biofilm growth under the role of aqueous micro-ecosystem, to introduce better tools for the simulation and prediction of bio-sediment transport, and to provide a scientific basis and application foundation for the research of interaction between sediment particles and ecological and environmental factors.", + "pageCount": 412, + "stock": 2, + "publisher": "Springer Nature", + "publishedDate": "2020-04-07", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=597bDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Technology & Engineering" + }, + { + "title": "Blue Book of the State of Illinois", + "isbn": "SRLF:AA0008066094", + "author": "-", + "pageCount": 596, + "stock": 3, + "publishedDate": "1989", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=GLxWTomlm1oC&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Illinois" + }, + { + "title": "Quantum Bio-Informatics II", + "isbn": "9789814273756", + "author": "L. Accardi", + "synopsis": "The purpose of this proceedings volume is to look for interdisciplinary bridges in mathematics, physics, information and life sciences, in particular, research for new paradigms for information and life sciences on the basis of quantum theory. The main areas in this volume are all related to one of the following subjects: (1) mathematical foundation of quantum mechanics, (2) quantum information, (3) quantum algorithm and computation, (4) quantum communication, (5) white noise analysis and quantum dynamics, (6) chaos dynamics and adaptive dynamics, (7) experimental studies of quantum computer, (8) bio-informatics and (9) genome analysis.", + "pageCount": 357, + "stock": 4, + "publisher": "World Scientific", + "publishedDate": "2009-02-12", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=3GxkDQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers" + }, + { + "title": "Guide to Microforms in Print", + "isbn": "CORNELL:31924069121717", + "author": "-", + "pageCount": 164, + "stock": 1, + "publishedDate": "1995", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=01laAAAAYAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Microforms" + }, + { + "title": "Energy Technology 2019", + "isbn": "9783030062095", + "author": "Tao Wang, Xiaobo Chen, Donna Post Guillen, Lei Zhang, Ziqi Sun, Cong Wang, Nawshad Haque, John A. Howarter, Neale R Neelameggham, Shadia Ikhmayies, York R. Smith, L Tafaghodi, Amit Pandey", + "synopsis": "This collection addresses the need for sustainable technologies with reduced energy consumption and pollutants and the development and application of alternative sustainable energy to maintain a green environment and energy supply. Contributions focus on energy-efficient technologies including innovative ore beneficiation, smelting technologies, and recycling and waste heat recovery, as well as emerging novel energy technologies. Papers also cover various technological aspects of sustainable energy ecosystems, processes that improve energy efficiency, reduce thermal emissions, and reduce carbon dioxide and other greenhouse emissions. Papers from the following symposia are presented in the book: Energy Technologies and Carbon Dioxide Management Solar Cell Silicon Advanced Materials for Energy Conversion and Storage", + "pageCount": 308, + "stock": 1, + "publisher": "Springer", + "publishedDate": "2019-02-09", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=IUmHDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Technology & Engineering" + }, + { + "title": "How to Write a Professional Bio: For Authors, Speakers, and Entrepreneurs", + "isbn": "0988888297", + "author": "Jeniffer Thompson", + "synopsis": "In \"How To Write A Professional BIO,\" personal branding expert, Jeniffer Thompson, walks you through ten easy steps with her proven Bio-Writing Formula, shares before and after examples, and provides worksheets to gently guide you through the process.", + "pageCount": 112, + "stock": 3, + "publisher": "MCM Publishing", + "publishedDate": "2019-11-12", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=ZAVAzQEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Business & Economics" + }, + { + "title": "Decision-Making for Biomass-Based Production Chains", + "isbn": "9780128142790", + "author": "Sebnem Yilmaz Balaman", + "synopsis": "Decision-Making for Biomass-Based Production Chains: The Basic Concepts and Medothologies presents a comprehensive study of key-issues surrounding the integration of strategic, tactical and operational decision levels for supply chains in the biomass, biofuels and biorefining sectors. Comprehensive sections cover biomass resources, harvesting, collection, storage and distribution systems, along with the necessary technical and technological background of production systems. In addition, the basics of decision-making, problems and decision levels encountered in design, management and operation phases are covered. Case studies are supplied in each chapter, along with a discussion and comparative analysis of topics. The book presents a clear vision of advances in the field. Graduate students and those starting in this line of research will also find the necessary information on how to model this kind of complex system. Finally, this comprehensive resource can be used as a guide for non-expert industry decision-makers and government policymakers who need a thorough overview on the industry. Examines analytic methodologies for complex decision-making when designing, deploying and managing biomass and bio-based products supply chains Includes real-life examples of main sustainability indicators, standards and certification schemes from the European Union, United States and worldwide Explores the progress of decision-making procedures to provide a detailed perspective for effective selection of the most reliable solutions for each kind of problem Provides detailed, in-depth analyses of various models and frameworks for their implementation, challenges and solutions Presents multi-criteria and multi-objective decision-making and modeling approaches, including mathematical modeling, simulation-based modeling, and artificial intelligence-based modeling", + "pageCount": 258, + "stock": 3, + "publisher": "Academic Press", + "publishedDate": "2018-10-02", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=NxlxDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Science" + }, + { + "title": "IBN", + "isbn": "OSU:32435068395961", + "author": "-", + "pageCount": 770, + "stock": 3, + "publishedDate": "2002", + "lang": "un", + "imgUrl": "http://books.google.com/books/content?id=Zb5rhbm7qUsC&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Biography" + }, + { + "title": "Natural Fiber-Reinforced Biodegradable and Bioresorbable Polymer Composites", + "isbn": "9780081006696", + "author": "Alan Kin-tak Lau, Ada Pui Yan Hung", + "synopsis": "Natural Fiber-Reinforced Biodegradable and Bioresorbable Polymer Composites focuses on key areas of fundamental research and applications of biocomposites. Several key elements that affect the usage of these composites in real-life applications are discussed. There will be a comprehensive review on the different kinds of biocomposites at the beginning of the book, then the different types of natural fibers, bio-polymers, and green nanoparticle biocomposites are discussed as well as their potential for future development and use in engineering biomedical and domestic products. Recently mankind has realized that unless the environment is protected, he himself will be threatened by the over consumption of natural resources as well as a substantial reduction in the amount of fresh air produced in the world. Conservation of forests and the optimal utilization of agricultural and other renewable resources like solar, wind, and tidal energy, have become important topics worldwide. With such concern, the use of renewable resources—such as plant and animal-based, fiber-reinforced polymeric composites—are now becoming an important design criterion for designing and manufacturing components for a broad range of different industrial products. Research on biodegradable polymeric composites can contribute, to some extent, to a much greener and safer environment. For example, in the biomedical and bioengineering fields, the use of natural fiber mixed with biodegradable and bioresorbable polymers can produce joint and bone fixtures to alleviate pain in patients. Includes comprehensive information about the sources, properties, and biodegradability of natural fibers Discusses failure mechanisms and modeling of natural fibers composites Analyzes the effectiveness of using natural materials for enhancing mechanical, thermal, and biodegradable properties", + "pageCount": 208, + "stock": 1, + "publisher": "Woodhead Publishing", + "publishedDate": "2017-02-28", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=YABQCwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Technology & Engineering" + }, + { + "title": "Spectroscopy of Solid-State Laser-Type Materials", + "isbn": "9781461308997", + "author": "Baldassare Di Bartolo, Guzin Armagan", + "synopsis": "This book presents an account of the course \"Spectroscopy of Solid-State Laser-Type Materials\" held in Erice, Italy, from June 16 to 30, 1985. This meeting was organized by the International School of Atomic and Molecular Spectroscopy of the \"Ettore Majorana\" Centre for Scientific Culture. The objective of the course was to present and examine the recent advances in spectroscopy and theoretical modelling relevant to the interpretation of luminescence and laser phenomena in several classes of solid-state materials. The available solid-state matrices (e.g. halides, oxides, glasses, semiconductors) and the full range of possible activators (transition ions, rare earth ions, post-transition ions, actinides, color centres) were considered. By bringing together specialists in the fields of solid-state luminescence and of solid-state laser materials, this course provided a much-needed forum for the critical . assessment of past developments in the R&D of solid-state lasers. Additional objectives of the meeting were to identify new classes of host/activator systems that show promise of laser operation; to alert researchers in solid-state luminescence to current technological needs for solid-state tunable lasers operating in the visible and infrared spectral regions; and generally to provide the scientific background for advanced work in solid state lasers. A total of 71 participants came from 54 laboratories and 21 nations (Austria, Belgium, Canada, F.R. of Germany, France, Greece, Ireland, Israel, Italy, the Netherlands, P.R. of China, Poland, Rumania, Sweden, Switzerland, South Korea, Spain, Turkey, United Kingdom, U.S.A. and U.S.S.R.).", + "pageCount": 592, + "stock": 1, + "publisher": "Springer Science & Business Media", + "publishedDate": "2012-12-06", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=-jf2BwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Science" + }, + { + "title": "The Bookseller and the Stationery Trades' Journal", + "isbn": "PRNC:32101065564401", + "author": "-", + "pageCount": 1644, + "stock": 4, + "publishedDate": "1923", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=vWhVAAAAYAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Bibliography" + }, + { + "title": "Advanced Materials", + "isbn": "9783319789194", + "author": "Ivan A. Parinov, Shun-Hsyung Chang, Vijay K. Gupta", + "synopsis": "This book presents selected peer-reviewed contributions from the 2017 International Conference on “Physics and Mechanics of New Materials and Their Applications”, PHENMA 2017 (Jabalpur, India, 14–16 October, 2017), which is devoted to processing techniques, physics, mechanics, and applications of advanced materials. The book focuses on a wide spectrum of nanostructures, ferroelectric crystals, materials and composites as well as promising materials with special properties. It presents nanotechnology approaches, modern environmentally friendly piezoelectric and ferromagnetic techniques and physical and mechanical studies of the structural and physical–mechanical properties of materials. Various original mathematical and numerical methods are applied to the solution of different technological, mechanical and physical problems that are interesting from theoretical, modeling and experimental points of view. Further, the book highlights novel devices with high accuracy, longevity and extended capabilities to operate under wide temperature and pressure ranges and aggressive media, which show improved characteristics, thanks to the developed materials and composites, opening new possibilities for different physico-mechanical processes and phenomena.", + "pageCount": 640, + "stock": 1, + "publisher": "Springer", + "publishedDate": "2018-05-12", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=LZZaDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Technology & Engineering" + }, + { + "title": "The World of Organic Agriculture", + "isbn": "9781136535239", + "author": "Minou Yussefi-Menzler", + "synopsis": "The new edition of this annual publication (previously published solely by IFOAM and FiBL) documents recent developments in global organic agriculture. It includes contributions from representatives of the organic sector from throughout the world and provides comprehensive organic farming statistics that cover surface area under organic management, numbers of farms and specific information about commodities and land use in organic systems. The book also contains information on the global market of the burgeoning organic sector, the latest developments in organic certification, standards and regulations, and insights into current status and emerging trends for organic agriculture by continent from the worlds foremost experts. For this edition, all statistical data and regional review chapters have been thoroughly updated. Completely new chapters on organic agriculture in the Pacific, on the International Task Force on Harmonization and Equivalence in Organic Agriculture and on organic aquaculture have been added. Published with IFOAM and FiBL", + "pageCount": 268, + "stock": 4, + "publisher": "Routledge", + "publishedDate": "2010-09-23", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=laUeBAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Social Science" + }, + { + "title": "Puteri Harum dan kaisar", + "isbn": "UOM:39015062769032", + "author": "Hua Wen", + "pageCount": 142, + "stock": 4, + "publishedDate": "1961", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=N6PhdL0GmBcC&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "-" + }, + { + "title": "Bio-Japan", + "isbn": "WISC:89031126410", + "author": "John Elkington", + "pageCount": 124, + "stock": 2, + "publishedDate": "1985", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=dbjxAAAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Biotechnology" + }, + { + "title": "Dictionary of Early American Philosophers", + "isbn": "9781441171405", + "author": "John R. Shook", + "synopsis": "The Dictionary of Early American Philosophers, which contains over 400 entries by nearly 300 authors, provides an account of philosophical thought in the United States and Canada between 1600 and 1860. The label of \"philosopher\" has been broadly applied in this Dictionary to intellectuals who have made philosophical contributions regardless of academic career or professional title. Most figures were not academic philosophers, as few such positions existed then, but they did work on philosophical issues and explored philosophical questions involved in such fields as pedagogy, rhetoric, the arts, history, politics, economics, sociology, psychology, medicine, anthropology, religion, metaphysics, and the natural sciences. Each entry begins with biographical and career information, and continues with a discussion of the subject's writings, teaching, and thought. A cross-referencing system refers the reader to other entries. The concluding bibliography lists significant publications by the subject, posthumous editions and collected works, and further reading about the subject.", + "pageCount": 1288, + "stock": 1, + "publisher": "Bloomsbury Publishing USA", + "publishedDate": "2012-04-05", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=oOqoAwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Philosophy" + }, + { + "title": "Proceedings of the MRS International Meeting on Advanced Materials: Superconductivity", + "isbn": "PSU:000023056619", + "author": "Masao Dōyama", + "pageCount": 1072, + "stock": 4, + "publishedDate": "1989", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=OyRZAAAAYAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Materials" + }, + { + "title": "Mathematical Methods in Chemical and Biological Engineering", + "isbn": "9781482210392", + "author": "Binay Kanti Dutta", + "synopsis": "Mathematical Methods in Chemical and Biological Engineering describes basic to moderately advanced mathematical techniques useful for shaping the model-based analysis of chemical and biological engineering systems. Covering an ideal balance of basic mathematical principles and applications to physico-chemical problems, this book presents examples drawn from recent scientific and technical literature on chemical engineering, biological and biomedical engineering, food processing, and a variety of diffusional problems to demonstrate the real-world value of the mathematical methods. Emphasis is placed on the background and physical understanding of the problems to prepare students for future challenging and innovative applications.", + "pageCount": 694, + "stock": 4, + "publisher": "CRC Press", + "publishedDate": "2016-11-03", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=z2kNDgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Mathematics" + }, + { + "title": "Developing the Global Bioeconomy", + "isbn": "9780128052907", + "author": "Patrick Lamers, Erin Searcy, J. Richard Hess, Heinz Stichnothe", + "synopsis": "Developing the Global Bioeconomy: Technical, Market, and Environmental Lessons from Bioenergy brings together expertise from three IEA-Bioenergy subtasks on pyrolysis, international trade, and biorefineries to review the bioenergy sector and draw useful lessons for the full deployment of the bioeconomy. Despite the vast amount of politically driven strategies, there is little understanding on how current markets will transition towards a global bioeconomy. The question is not only how the bioeconomy can be developed, but also how it can be developed sustainably in terms of economic and environmental concerns. To answer this question, this book’s expert chapter authors seek to identify the types of biorefineries that are expected to be implemented and the types of feedstock that may be used. They also provide historical analysis of the developments of biopower and biofuel markets, integration opportunities into existing supply chains, and the conditions that would need to be created and enhanced to achieve a global biomass trade system that could support a global bioeconomy. As expectations that a future bioeconomy will rely on a series of tradable commodities, this book provides a central accounting of the state of the discussion in a multidisciplinary approach that is ideal for research and academic experts, and analysts in all areas of the bioenergy, biofuels, and bioeconomy sectors, as well as those interested in energy policy and economics. Examines the lessons learned by the bioenergy industry and how they can be applied to the full development of the bioeconomy Explores different transition strategies and how the current fossil based and future bio-based economy are intertwined Reviews the status of current biomass conversion pathways Presents an historical analysis of the developments of biopower and biofuel markets, integration opportunities into existing supply chains, and the conditions that would need to be created and enhanced to achieve a global biomass trade system", + "pageCount": 220, + "stock": 2, + "publisher": "Academic Press", + "publishedDate": "2016-05-02", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=gTqOCgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Technology & Engineering" + }, + { + "title": "Official Journal of the European Communities", + "isbn": "UOM:39015074622120", + "author": "-", + "pageCount": 1124, + "stock": 4, + "publishedDate": "1980-04", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=E2kNAQAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "European federation" + }, + { + "title": "JARQ.", + "isbn": "WISC:89098849797", + "author": "-", + "pageCount": 598, + "stock": 2, + "publishedDate": "2001", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=siXvBXvdy4oC&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Agriculture" + }, + { + "title": "Environmental Applications of Remote Sensing", + "isbn": "9789535124436", + "author": "Maged Marghany", + "synopsis": "Nowadays, the innovation in space technologies creates a new trend for the Earth observation and monitoring from space. This book contains high quality and compressive work on both microwave and optical remote sensing applications. This book is divided into five sections: (i) remote sensing for biomass estimation, (ii) remote sensing-based glacier studies, (iii) remote sensing for coastal and ocean applications, (iv) sewage leaks and environment disasters, and (v) remote sensing image processing. Each chapter offers an opportunity to expand the knowledge about various remote sensing techniques and persuade researchers to deliver new research novelty for environment studies.", + "pageCount": 420, + "stock": 1, + "publisher": "BoD – Books on Demand", + "publishedDate": "2016-06-08", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=Wm-QDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Science" + }, + { + "title": "Biomass Combustion Science, Technology and Engineering", + "isbn": "9780857097439", + "author": "Lasse Rosendahl", + "synopsis": "The utilisation of biomass is increasingly important for low- or zero-carbon power generation. Developments in conventional power plant fuel flexibility allow for both direct biomass combustion and co-firing with fossil fuels, while the integration of advanced technologies facilitates conversion of a wide range of biomass feedstocks into more readily combustible fuel. Biomass combustion science, technology and engineering reviews the science and technology of biomass combustion, conversion and utilisation. Part one provides an introduction to biomass supply chains and feedstocks, and outlines the principles of biomass combustion for power generation. Chapters also describe the categorisation and preparation of biomass feedstocks for combustion and gasification. Part two goes on to explore biomass combustion and co-firing, including direct combustion of biomass, biomass co-firing and gasification, fast pyrolysis of biomass for the production of liquids and intermediate pyrolysis technologies. Largescale biomass combustion and biorefineries are then the focus of part three. Following an overview of large-scale biomass combustion plants, key engineering issues and plant operation are discussed, before the book concludes with a chapter looking at the role of biorefineries in increasing the value of the end-products of biomass conversion. With its distinguished editor and international team of expert contributors, Biomass combustion science, technology and engineering provides a clear overview of this important area for all power plant operators, industrial engineers, biomass researchers, process chemists and academics working in this field. Reviews the science and technology of biomass combustion, conversion and utilisation Provides an introduction to biomass supply chains and feedstocks and outlines the principles of biomass combustion for power generation Describes the categorisation and preparation of biomass feedstocks for combustion and gasification", + "pageCount": 320, + "stock": 5, + "publisher": "Elsevier", + "publishedDate": "2013-04-04", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=MVtEAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Technology & Engineering" + } +] \ No newline at end of file diff --git a/server/jsons/fetchDatas.js b/server/jsons/fetchDatas.js index 4cd0969..f074422 100644 --- a/server/jsons/fetchDatas.js +++ b/server/jsons/fetchDatas.js @@ -4,27 +4,25 @@ const fs = require('fs'); async function fetchGoogleBooks() { try { - const response = await axios.get('https://www.googleapis.com/books/v1/volumes', { - params: { - key: process.env.GOOGLE_BOOKS_API_KEY, - q: 'javascript', - country: 'ID', - maxResults: 3, - printType: 'books', - }, - }); - - - // console.log(response); - let items = response.data.items || []; - - if (items.length > 0) { - items = items.map(item => { + const fetchData = async (query, maxResults) => { + const response = await axios.get('https://www.googleapis.com/books/v1/volumes', { + params: { + key: process.env.GOOGLE_BOOKS_API_KEY, + q: query, + country: 'ID', + maxResults, + printType: 'books', + }, + }); + + const items = response.data.items || []; + + return items.map(item => { const { title, authors, publisher, publishedDate, description, industryIdentifiers, pageCount, categories, imageLinks, language } = item.volumeInfo; return { title, isbn: industryIdentifiers ? industryIdentifiers[0].identifier : '-', - author: authors.join(', '), + author: authors ? authors.join(', ') : '-', synopsis: description, pageCount, stock: Math.ceil(Math.random() * 5), @@ -32,23 +30,24 @@ async function fetchGoogleBooks() { publishedDate, lang: language, imgUrl: imageLinks.thumbnail, - status: `available`, - category: categories ? categories.join(', ') : '-' - } + status: 'available', + category: categories ? categories.join(', ') : '-', + }; }); - } + }; + + const jsBooks = await fetchData('javascript', 20); + const reactBooks = await fetchData('react', 20); + const randomBooks = await fetchData('bio', 40); + + const books = [...jsBooks, ...reactBooks, ...randomBooks]; - const jsonBooks = JSON.stringify(items, null, 2); + const allBooks = JSON.stringify(books, null, 2); + fs.writeFileSync('./jsons/books.json', allBooks); - - const filePath = path.join(__dirname, 'books.json'); - - - fs.writeFileSync(filePath, jsonBooks); - + console.log('Data berhasil disimpan ke books.json'); } catch (error) { console.error(error); - // throw new Error('Terjadi kesalahan dalam permintaan.'); } } diff --git a/server/migrations/20231113173059-create-user.js b/server/migrations/20231113173059-create-user.js new file mode 100644 index 0000000..fd140e3 --- /dev/null +++ b/server/migrations/20231113173059-create-user.js @@ -0,0 +1,41 @@ +'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, + allowNull: false + }, + email: { + type: Sequelize.STRING, + allowNull: false + }, + password: { + type: Sequelize.STRING, + allowNull: false + }, + role: { + type: Sequelize.STRING, + allowNull: false + }, + 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/20231113173218-create-user-detail.js b/server/migrations/20231113173218-create-user-detail.js new file mode 100644 index 0000000..11d13a5 --- /dev/null +++ b/server/migrations/20231113173218-create-user-detail.js @@ -0,0 +1,50 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('UserDetails', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + userId: { + type: Sequelize.INTEGER, + allowNull: false, + references: { + model: 'Users', + key: 'id' + } + }, + name: { + type: Sequelize.STRING, + allowNull: false + }, + dob: { + type: Sequelize.DATE + }, + inumber: { + type: Sequelize.STRING, + allowNull: false + }, + address: { + type: Sequelize.TEXT + }, + gender: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('UserDetails'); + } +}; \ No newline at end of file diff --git a/server/migrations/20231113173504-create-book.js b/server/migrations/20231113173504-create-book.js new file mode 100644 index 0000000..d94119e --- /dev/null +++ b/server/migrations/20231113173504-create-book.js @@ -0,0 +1,63 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Books', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + title: { + type: Sequelize.STRING, + allowNull: false + }, + isbn: { + type: Sequelize.STRING + }, + author: { + type: Sequelize.STRING + }, + synopsis: { + type: Sequelize.TEXT + }, + pageCount: { + type: Sequelize.INTEGER + }, + stock: { + type: Sequelize.INTEGER, + allowNull: false + }, + publisher: { + type: Sequelize.STRING + }, + publishedDate: { + type: Sequelize.DATE + }, + lang: { + type: Sequelize.STRING + }, + imgUrl: { + type: Sequelize.STRING + }, + status: { + type: Sequelize.STRING + }, + category: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Books'); + } +}; \ No newline at end of file diff --git a/server/migrations/20231113173602-create-history.js b/server/migrations/20231113173602-create-history.js new file mode 100644 index 0000000..57a2408 --- /dev/null +++ b/server/migrations/20231113173602-create-history.js @@ -0,0 +1,49 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Histories', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + bookId: { + type: Sequelize.INTEGER, + allowNull: false, + references: { + model: 'Books', + key: 'id' + } + }, + userId: { + type: Sequelize.INTEGER, + allowNull: false, + references: { + model: 'Users', + key: 'id' + } + }, + deadline: { + type: Sequelize.DATE, + allowNull: false + }, + status: { + type: Sequelize.STRING, + allowNull: false + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Histories'); + } +}; \ No newline at end of file diff --git a/server/models/book.js b/server/models/book.js new file mode 100644 index 0000000..0623086 --- /dev/null +++ b/server/models/book.js @@ -0,0 +1,34 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Book 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 + } + } + Book.init({ + title: DataTypes.STRING, + isbn: DataTypes.STRING, + author: DataTypes.STRING, + synopsis: DataTypes.TEXT, + pageCount: DataTypes.INTEGER, + stock: DataTypes.INTEGER, + publisher: DataTypes.STRING, + publishedDate: DataTypes.DATE, + lang: DataTypes.STRING, + imgUrl: DataTypes.STRING, + status: DataTypes.STRING, + category: DataTypes.STRING + }, { + sequelize, + modelName: 'Book', + }); + return Book; +}; \ No newline at end of file diff --git a/server/models/history.js b/server/models/history.js new file mode 100644 index 0000000..b5dc146 --- /dev/null +++ b/server/models/history.js @@ -0,0 +1,26 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class History 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 + } + } + History.init({ + bookId: DataTypes.INTEGER, + userId: DataTypes.INTEGER, + deadline: DataTypes.DATE, + status: DataTypes.STRING + }, { + sequelize, + modelName: 'History', + }); + return History; +}; \ No newline at end of file diff --git a/server/models/user.js b/server/models/user.js new file mode 100644 index 0000000..826c9ed --- /dev/null +++ b/server/models/user.js @@ -0,0 +1,26 @@ +'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, + role: DataTypes.STRING + }, { + sequelize, + modelName: 'User', + }); + return User; +}; \ No newline at end of file diff --git a/server/models/userdetail.js b/server/models/userdetail.js new file mode 100644 index 0000000..b6555b4 --- /dev/null +++ b/server/models/userdetail.js @@ -0,0 +1,28 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class UserDetail 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 + } + } + UserDetail.init({ + userId: DataTypes.INTEGER, + name: DataTypes.STRING, + dob: DataTypes.DATE, + inumber: DataTypes.STRING, + address: DataTypes.TEXT, + gender: DataTypes.STRING + }, { + sequelize, + modelName: 'UserDetail', + }); + return UserDetail; +}; \ No newline at end of file From 8fa8d010c30e42c31b55f3119e1437141a4dbad1 Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Tue, 14 Nov 2023 08:41:45 +0700 Subject: [PATCH 06/27] Add migration, set up models, and seed book --- server/jsons/books.json | 577 ++++++++++-------- server/jsons/fetchDatas.js | 5 +- .../migrations/20231113173504-create-book.js | 9 +- server/models/book.js | 58 +- server/models/history.js | 54 +- server/models/user.js | 6 + server/models/userdetail.js | 1 + server/seeders/20231114013237-books-seeder.js | 33 + 8 files changed, 482 insertions(+), 261 deletions(-) create mode 100644 server/seeders/20231114013237-books-seeder.js diff --git a/server/jsons/books.json b/server/jsons/books.json index fdb8800..a3243ec 100644 --- a/server/jsons/books.json +++ b/server/jsons/books.json @@ -5,13 +5,14 @@ "author": "Vivian Siahaan, Rismon Hasiholan Sianipar", "synopsis": "Buku ini menyuguhkan lebih dari 100 kasus yang diimplementasikan langkah demi langkah. Buku ini ditujukan baik untuk pemula maupun pembelajar berpengalaman, yang hanya memfokuskan dan mendalami hanya pada elemen-elemen penting JavaScript. Buku ini merupakan buku “untuk semua kalangan”, yang didedikasikan untuk mereka yang menginginkan keseimbangan antara sisi teknis bahasa dan elemen-elemen menyenangkan. Buku ini menjelaskan bagaimana bahasa ini diterapkan dimulai dari contoh-contoh yang paling mendasar sampai yang lebih kompleks, dengan progres yang memandu Anda contoh demi contoh sampai Anda menguasainya. Kebutuhan akan contoh-contoh yang baik sangat diperlukan untuk mendapatkan hasil yang baik. Kami berharap bahwa Anda menikmati buku bahasa pemrograman Web ini dengan cara yang menyenangkan.", "pageCount": 201, - "stock": 3, + "stock": 2, "publisher": "BALIGE PUBLISHING", "publishedDate": "2020-03-14", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=qovWDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 469 }, { "title": "JavaScript Untuk Profesional", @@ -19,13 +20,14 @@ "author": "Vivian Siahaan, Rismon Hasiholan Sianipar", "synopsis": "JavaScript merupakan bahasa skript populer yang dipakai untuk menciptakan halaman Web yang dapat berinteraksi dengan pengguna dan dapat merespon event yang terjadi pada halaman. JavaScript merupakan perekat yang menyatukan halaman-halaman Web. Akan sangat susah menjumpai halaman Web komersial yang tidak memuat kode JavaScript. JavaScript, awalnya dikenal sebagai LiveScript, dikembangkan oleh Brendan Eich di Netscape pada tahun 1995 yang menjadi bagian terintegrasi di dalam Netscape Navigator 2.0. JavaScript merupakan bahasa skript yang menghidupkan halaman-halaman HTML. JavaScript dapat dijalankan pada hampir semua platform. JavaScript merupakan bahasa sisi-klien yang didesain pada browser komputer Anda, bukan pada server. Ia dibangun secara langsung ke dalam browser, Microsoft Internet Explorer, Mozilla Firefox, Google Chrome, Opera, hampir semua browser. Dalam sintaksis, JavaScript mirip dengan C, Perl, dan Java. Program JavaScript dipakai untuk mendeteksi dan beraksi terhadap event-event yang disebabkan oleh pengguna. Anda dapat memperbaiki situs Web dengan bantuan navigasional, kotak dialog, citra dinamis, dan lainnya. JavaScript dapat digunakan untuk mengendalikan tampilan halaman. JavaScript dipakai untuk memvalidasi apa yang diketikkan pengguna ke dalam sebuah form sebelum pengiriman form ke server dilakukan. JavaScript berperan sebagai bahasa pemrograman, yang memiliki konstruksi-konstruksi dasar seperti variabel dan tipe data, look kontrol, statemen if/else, statemen switch, fungsi, dan objek. JavaScript dapat dipakai untuk perhitungan aritmatik, pemanipulasian tanggal dan waktu, pemodifikasian array, string dan objek. Ia juga dapat menangani event yang diinisiasi pengguna, dan menetapkan pewaktu. Kombinasi dari HTMl, CSS, dan JavaScript dapat menghasilkan halaman Web yang terstruktur, bergaya, dan interaktif. Para perancang Web sepakat bahwa ketiganya merupakan bagian penting dari sebuah halaman Web. Topik-topik yang dibahas pada buku ini meliputi: Sejarah JavaScript; Tipe Data; Literal, dan Variabel; Kotak Dialog; Operator; Kondisi; Fungsi; Objek; Objek Inti JavaScript; Objek Browser; Form; Citra dan Link; Penanganan Event; CSS dan JavaScript.", "pageCount": 434, - "stock": 5, + "stock": 4, "publisher": "SPARTA PUBLISHER", "publishedDate": "2018-11-21", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=OFd1DwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 1656 }, { "title": "JavaScript: Dari A Sampai Z", @@ -33,13 +35,14 @@ "author": "Vivian Siahaan, Rismon Hasiholan Sianipar", "synopsis": "JavaScript merupakan bahasa skript populer yang dipakai untuk menciptakan halaman Web yang dapat berinteraksi dengan pengguna dan dapat merespon event yang terjadi pada halaman. JavaScript merupakan perekat yang menyatukan halaman-halaman Web. Akan sangat susah menjumpai halaman Web komersial yang tidak memuat kode JavaScript. JavaScript, awalnya dikenal sebagai LiveScript, dikembangkan oleh Brendan Eich di Netscape pada tahun 1995 yang menjadi bagian terintegrasi di dalam Netscape Navigator 2.0. JavaScript merupakan bahasa skript yang menghidupkan halaman-halaman HTML. JavaScript dapat dijalankan pada hampir semua platform. JavaScript merupakan bahasa sisi-klien yang didesain pada browser komputer Anda, bukan pada server. Ia dibangun secara langsung ke dalam browser, Microsoft Internet Explorer, Mozilla Firefox, Google Chrome, Opera, hampir semua browser. Dalam sintaksis, JavaScript mirip dengan C, Perl, dan Java. Program JavaScript dipakai untuk mendeteksi dan beraksi terhadap event-event yang disebabkan oleh pengguna. Anda dapat memperbaiki situs Web dengan bantuan navigasional, kotak dialog, citra dinamis, dan lainnya. JavaScript dapat digunakan untuk mengendalikan tampilan halaman. JavaScript dipakai untuk memvalidasi apa yang diketikkan pengguna ke dalam sebuah form sebelum pengiriman form ke server dilakukan. JavaScript berperan sebagai bahasa pemrograman, yang memiliki konstruksi-konstruksi dasar seperti variabel dan tipe data, look kontrol, statemen if/else, statemen switch, fungsi, dan objek. JavaScript dapat dipakai untuk perhitungan aritmatik, pemanipulasian tanggal dan waktu, pemodifikasian array, string dan objek. Ia juga dapat menangani event yang diinisiasi pengguna, dan menetapkan pewaktu. Kombinasi dari HTMl, CSS, dan JavaScript dapat menghasilkan halaman Web yang terstruktur, bergaya, dan interaktif. Para perancang Web sepakat bahwa ketiganya merupakan bagian penting dari sebuah halaman Web. Topik-topik yang dibahas pada buku ini meliputi: Sejarah JavaScript; Tipe Data; Literal, dan Variabel; Kotak Dialog; Operator; Kondisi; Fungsi; Objek; Objek Inti JavaScript; Objek Browser; Form; Citra dan Link; Penanganan Event; CSS dan JavaScript.", "pageCount": 436, - "stock": 2, + "stock": 3, "publisher": "Sparta Publisher", "publishedDate": "2018-12-26", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=IYxeDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 4747 }, { "title": "Semua Bisa Menjadi Programmer JavaScript & Node.js", @@ -47,13 +50,14 @@ "author": "Ir. Yuniar Supardi", "synopsis": "JavaScript merupakan program skrip untuk client sehingga penulis juga menyatukan materi Node.js yang merupakan program skrip server untuk JavaScript. Belajar Node.js membuat pengembang dengan bahasa JavaScript dapat membuat skrip web, baik untuk sisi klien dan server. Bahasa Skrip JavaScript menjadi bahasa skrip nomor satu di dunia, apalagi dengan adanya Node.js membuat JavaScript semakin populer, tentu bahasa ini menjadi bahasa pesaing utama Python. Keunggulan buku ini memandu Anda membuat program web menggunakan JavaScript dan Node.js dengan pembahasan yang mudah dan sistematik, sehingga Anda dengan mudah belajar dari buku ini. Dalam buku ini juga Anda dipandu bagaimana membuat program web dengan database MySQL dan SQLite pada Node.js. Topik yang dibahas dalam buku ini mencakup: - Sekilas JavaScript & Node.js - Komponen Program JavaScript - Objek GUI JavaScript - Kejadian (Event) JavaScript - Marquee dan Frame JavaScript - Node.js - NPM Node.js - Modul Node.js - Modul Http - Modul File System - Modul Url - Form Node.js - Upload File Node.js - CRUD MySQL Pada Node.js - SQLite Pada Node.js - dan Lain-lain.", "pageCount": 240, - "stock": 4, + "stock": 5, "publisher": "Elex Media Komputindo", "publishedDate": "2021-04-13", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=CG0qEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 932 }, { "title": "HTML5 dan Javascript untuk Pemula", @@ -67,7 +71,8 @@ "lang": "id", "imgUrl": "http://books.google.com/books/content?id=e14zEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 4962 }, { "title": "Javascript untuk pemula", @@ -81,7 +86,8 @@ "lang": "id", "imgUrl": "http://books.google.com/books/content?id=VgE9EAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 2200 }, { "title": "Buku Sakti HTML, CSS & Javascript", @@ -95,46 +101,21 @@ "lang": "id", "imgUrl": "http://books.google.com/books/content?id=5srzDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 2420 }, { "title": "Seri Pemrograman Internet : Panduan Pemrograman JavaScript (sampai dengan JavaScript 1.2)", "isbn": "979533462X", "author": "Antony Pranata", "pageCount": 336, - "stock": 2, + "stock": 4, "publisher": "Penerbit Andi", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=v9H5RV_paEIC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "-" - }, - { - "title": "Beginning JavaScript", - "isbn": "9781118903742", - "author": "Jeremy McPeak", - "synopsis": "The bestselling JavaScript guide, updated with current features and best practices Beginning JavaScript 5th Edition shows you how to work effectively with JavaScript frameworks, functions, and modern browsers, and teaches more effective coding practices using HTML5. This new edition has been extensively updated to reflect the way JavaScript is most commonly used today, introducing you to the latest tools and techniques available to JavaScript developers. Coverage includes modern coding practices using HTML5 markup, the JSON data format, DOM APIs, the jQuery framework, and more. Exercises with solutions provide plenty of opportunity to practice, and the companion website offers downloadable code for all examples given in the book. Learn JavaScript using the most up to date coding style Understand JSON, functions, events, and feature detection Utilize the new HTML5 elements and the related API Explore new features including geolocation, local storage, and more JavaScript has shaped the Web from a passive medium into one that is rich, dynamic, and interactive. No matter the technology on the server side, it's JavaScript that makes it come alive in the browser. To learn JavaScript the way it's used today, Beginning JavaScript, 5th Edition is your concise guide.", - "pageCount": 768, - "stock": 4, - "publisher": "John Wiley & Sons", - "publishedDate": "2015-02-18", - "lang": "en", - "imgUrl": "http://books.google.com/books/content?id=SjekBgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", - "status": "available", - "category": "Computers" - }, - { - "title": "JavaScript", - "isbn": "9788850327577", - "author": "Kevin Yank, Cameron Adams", - "pageCount": 310, - "stock": 4, - "publisher": "Apogeo Editore", - "publishedDate": "2008", - "lang": "it", - "imgUrl": "http://books.google.com/books/content?id=o4p6_GSlqMEC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", - "status": "available", - "category": "Computers" + "category": "-", + "pricePerWeek": 2734 }, { "title": "Pemrograman Javascript: Teori Dan Implementasi", @@ -142,13 +123,14 @@ "author": "Rismon Hasiholan Sianipar", "synopsis": "JavaScript sangat populer! Hampir pada semua komputer terpasang JavaScript di dalam browser Microsoft Internet Explorer, Mozilla Firefox, Google Chrome, Opera, dan lainnya. JavaScript juga merupakan bahasa skript populer yang memiliki banyak nama samaran lain, seperti Mocha, LiveScript, Jscript, dan ECMAScript. JavaScript merupakan bahasa skript populer yang dipakai untuk menciptakan halaman Web yang dapat berinteraksi dengan pengguna dan dapat merespon event yang terjadi pada halaman. JavaScript merupakan perekat yang menyatukan halaman-halaman Web. Akan sangat susah menjumpai halaman Web komersial yang tidak memuat kode JavaScript. Ada banyak buku yang didedikasikan untuk membahas beberapa aspek dari bahasa JavaScript dan jika Anda masih “baru” dengan bahasa ini, akan sangat sulit untuk mengetahui di mana harus memulainya. Buku ini merupakan buku “untuk semua kalangan”, yang didedikasikan untuk mereka yang menginginkan keseimbangan antara sisi teknis bahasa dan elemen-elemen menyenangkan, sebuah buku yang mendiskusikan permasalahan-permasalahan lintas-platform, dan sebuah buku yang tidak mengharuskan Anda seorang guru sebelum Anda memulainya. Buku ini menjelaskan bagaimana bahasa ini diterapkan dimulai dari contoh-contoh yang paling mendasar sampai yang lebih kompleks, dengan progres yang memandu Anda contoh demi contoh sampai Anda menguasainya. Karena saya seorang guru, saya merasa kebutuhan akan contoh-contoh yang baik diperlukan untuk mendapatkan hasil yang baik. Saya telah banyak belajar dan berharap bahwa Anda menikmati buku bahasa pemrograman Web ini dengan cara yang menyenangkan. Berikut merupakan topik-topik yang dibahas pada buku ini: Bab 1. Sejarah JavaScript Bab 2. Tipe Data, Literal, dan Variabel Bab 3. Kotak Dialog Bab 4. Operator Bab 5. Kondisi Bab 6. Fungsi Bab 7. Objek Bab 8. Objek Inti JavaScript Bab 9. Objek Browser Bab 10. Form Bab 11. Citra dan Link Bab 12. Penanganan Event Bab 13. CSS dan JavaScript", "pageCount": 440, - "stock": 3, + "stock": 1, "publisher": "Penerbit INFORMATIKA", "publishedDate": "2015-05-28", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=8QZ2DwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "-" + "category": "-", + "pricePerWeek": 3697 }, { "title": "Javascript guempil", @@ -156,13 +138,14 @@ "author": "malik kurosaki", "synopsis": "javascript itu mudah , mungkin akan ada pertanyaan bagaimana kok mudah ..? wong lihat tulisannya aja uda bikin cidera otak . Itu juga yang saya pikirkan waktu pertama kali ingin mempelajari javascript , sebelumnya sudah mempelajari html dan css, beda sekali jika dibandingkan dengan html atau css pada dasarnya html lebih kepada tata letaak dan pada fungsi tagnya sedangkan css memberi keindahan dan warna agar terlihat lebih hidup. Ibarat sebuah pohon html adalah dahan batang dan ranting yang mengatur dimana bunga atau buah atau daun ditempatkan sedangkan css mmberikan warna bentuk daun bentuk bunga pada pohon tersebut maka dari situ bisalah tercipta sebuah gambaran pohon yang hidup. Penulisan sebuah program pada web bisa dikatakan seni jika kita melihatnya dalam bingkai seni ,karena tak jarang kita cendrung senang jika melihat sebuah eb tertata dengan rapi dan cantik, disitulah dibutuhkan keterampilan tangan dan seni untuk menciptakan sebuah web yang indah.", "pageCount": 20, - "stock": 3, + "stock": 5, "publisher": "blackangel media", "publishedDate": "2018-05-15", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=E_JaDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 146 }, { "title": "7 Materi Pemrograman Web untuk Pemula 3: JavaScript & MariaDB", @@ -170,13 +153,14 @@ "author": "Rohi Abdulloh", "synopsis": "Teknologi pemrograman web terus berkembang begitu cepat. Para pemula tentu akan semakin tertinggal jika tidak cepat mengejar. Buku ini membahas 7 materi pemrograman web sekaligus yang menjadi materi utama dalam mempelajari pemrograman web. Materi yang diberikan akan sangat membantu para pemula yang ingin menguasai pemrograman web dan menjadi web programmer dalam waktu singkat. Pembahasan dimulai dari pengetahuan dasar tentang pemrograman web, dilanjutkan dengan pembahasan 7 materi pemrograman web, satu demi satu disertai dengan contoh skrip beserta hasilnya. Disertai juga pembuatan aplikasi sederhana yang akan membantu pembaca menguasai pembuatan modul aplikasi. Untuk menunjang latihan, penulis juga menyertakan puluhan bonus skrip aplikatif. Dengan menguasai buku ini, pembaca dapat menjadi web programmer yang siap dan mampu membuat aplikasi web secara mandiri. Pembahasan selengkapnya mencakup: • Dasar web programming • HTML • CSS • MariaDB • PHP • Javascript • Bootstrap • Laravel", "pageCount": 175, - "stock": 2, + "stock": 5, "publisher": "PT Elex Media Komputindo", "publishedDate": "2022-07-29", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=NYl-EAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 698 }, { "title": "JavaScript by Example", @@ -184,27 +168,14 @@ "author": "Ellie Quigley", "synopsis": "This is the definitive JavaScript tutorial for the serious nonprogrammer who is interested in mastering the full power of the language. Includes hundreds of example JavaScript programs that demonstrate both the fun and practical aspects.", "pageCount": 756, - "stock": 2, + "stock": 3, "publisher": "Prentice Hall Professional", "publishedDate": "2004", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=IAJv2N1n9JAC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" - }, - { - "title": "JavaScript", - "isbn": "9781119367956", - "author": "T. J. Crowder", - "synopsis": "All of JavaScript's newest features, in depth, made easy to understand. JavaScript is a rapidly changing language and it can be challenging to keep up with all the new toys being added. JavaScript: The New Toys explores the newest features of the world's most popular programming language while also showing readers how to track what's coming next. After setting the stage by covering who manages the process of improving JavaScript, how new features get introduced, terminology, and a high-level overview of new features, it details each new or updated item in depth, with example uses, possible pitfalls, and expert recommendations for updating old habits in light of new features. JavaScript: The New Toys: Covers all the additions to JavaScript in ES2015-ES2020 plus a preview of what's coming next Explores the latest syntax: nullish coalescing, optional chaining, let and const, class syntax, private methods, private fields, new.target, numeric separators, BigInt, destructuring, default parameters, arrow functions, async functions, await, generator functions, ... (rest and spread), template literals, binary and octal literals, ** (exponentiation), computed property/method names, for-of, for-await-of, shorthand properties, and others Details the new features and patterns including modules, promises, iteration, generators, Symbol, Proxy, reflection, typed arrays, Atomics, shared memory, WeakMap, WeakSet, and more Highlights common pitfalls and explains how to avoid them Shows how to follow the improvements process and even participate in the process yourself Explains how to use new features even before they're widely supported With its comprehensive coverage and friendly, accessible style, JavaScript: The New Toys provides an invaluable resource for programmers everywhere, whether they work in web development, Node.js, Electron, Windows Universal Apps, or another JavaScript environment.", - "pageCount": 608, - "stock": 1, - "publisher": "John Wiley & Sons", - "publishedDate": "2020-07-21", - "lang": "en", - "imgUrl": "http://books.google.com/books/content?id=-i3rDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", - "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 137 }, { "title": "Pemrograman Web Berbasis HTML 5, PHP, Dan JavaScript", @@ -212,13 +183,59 @@ "author": "Edy Winarno ST, M.Eng, Ali Zaki & SmitDev Community", "synopsis": "Buku ini menjelaskan cara melakukan pemrograman web dengan mudah memakai 3 bahasa pemrograman pokok, yaitu HTML5, PHP, dan JavaScript. Anda akan belajar bagaimana memanfaatkan HTML5 sebagai antarmuka awal, selanjutnya mengenal PHP untuk memberikan kemampuan pengolahan data client-server di web, lalu menggunakan JavaScript untuk memberikan sentuhan dinamis. Setiap penjelasan dilengkapi dengan contoh program dan di bagian akhir ditutup dengan pembuatan program yang melibatkan ketiganya. *Bonus pada buku fisik (CD, voucher, pembatas buku) tidak disertakan dalam buku digital (e-book)", "pageCount": 248, - "stock": 4, + "stock": 1, "publisher": "Elex Media Komputindo", "publishedDate": "2014-06-23", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=YuVyDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Education" + "category": "Education", + "pricePerWeek": 1501 + }, + { + "title": "Grafika Dalam JavaScript", + "isbn": "-", + "author": "Vivian Siahaan, Rismon Hasiholan Sianipar", + "synopsis": "Selamat datang ke dunia grafika! Jika Anda memegang buku di tangan Anda, berarti Anda tertarik dengan visualisasi data, sembari berharap dapat mengembangkan halaman web dengan grafik-grafik yang interaktif. Atau, mungkin tujuan Anda adalah memperbarui pengetahuan Anda tentang pustaka jqPlot, D3, atau Highcharts. Apapun harapan Anda, diharapkan buku ini membantu Anda untuk mencapainya. Ketika Anda menyajikan data untuk menunjukkan relasi atau untuk mencari perbandingan atau untuk menyoroti tren, Anda membuat grafik. Grafik merupakan sebuah struktur yang memuat simbol, seperti garis, batang, irisan, dan lainnya. Grafik berperan sebagai perangkat yang dapat membantu Anda mencerna dan memahami relasi pada data. Selain beragam grafika dan pustaka JavaScript, buku ini merangkum sejumlah topik: pustaka jQuery, HTML5, dan kanvas, widget dan kontrol, manipulasi grafika dengan teknologi SVG (scalable vector graphics), dan lainnya. Buku ini kaya akan beragam topik dengan banyak contoh, masing-masing diberikan secara bertahap, sehingga diharapkan Anda hanya fokus pada bagian-bagian kode yang diterapkan. Pengembangan grafik menjadi mudah begitu Anda mengetahui prosesnya dan memiliki perangkat yang tepat. Oleh karena itu, buku ini menyajikan kode-kode utuh yang bisa Anda manipulasi sesuai dengan kebutuhan visualisasi data Anda. Berikut merupakan topik-topik yang dibahas pada buku ini: Bab 1. Tabel HTML Sederhana Bab 2. Menggambar Kurva Garis Bab 3. Menggambar Grafik Batang Bab 4. Menggambar Grafik Pie Bab 5. Mengenalkan jqPlot Bab 6. Grafik Garis dengan jqPlot Bab 7. Grafik Batang dengan jqPlot Bab 8. Grafik Pie dan Donut dengan jqPlot Bab 9. Grafik Candlestick, Scatter, Bubble, dan Funnel dengan jqPlot Bab 10. Kontrol dan Widget Bab 11. Grafik dengan Highcharts Bab 12. Grafik Garis dengan D3 Bab 13. Grafik Batang dan Pie dengan D3 Bab 14. Grafik Lainnya dengan D3", + "pageCount": 387, + "stock": 1, + "publisher": "BALIGE PUBLISHING", + "publishedDate": "2018-10-02", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=-oFeDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers", + "pricePerWeek": 3228 + }, + { + "title": "Dasar CSS dan JavaScript", + "isbn": "-", + "author": "Vivian Siahaan, Rismon Hasiholan Sianipar", + "synopsis": "Pada buku ini, Anda akan dikenalkan tentang XHTML (Extensible Hypertext Markup Language) yang dapat dipakai untuk membungkus informasi sehingga dapat diinterpretasi oleh penjelajah web. Pada awal buku ini, Anda akan fokus mempelajari pemformatan dan penyajian informasi. Untuk melakukannya, Anda akan menggunakan sebuah teknologi W3C yang dinamakan dengan CSS (Cascading Style Sheets) yang memampukan pembuat dokumen untuk menetapkan presentasi elemen-elemen sebuah halaman web (misalnya, jenis huruf (font), pengaturan spasi, warna, dll) yang terpisah dari struktur dokumen (bagian kepala, teks tubuh, link, dan lainnya). Pemisahan struktur dokumen dari presentasi elemen akan menyederhanakan pemodifikasian sebuah halaman web. Selanjutnya Anda akan menuliskan sebuah skrip JavaScript. Adalah hal yang penting untuk memahami jenis blok pembangun yang tersedia dan untuk menggunakan prinsip-prinsi konstruksi program yang teruji. Pada buku ini, Anda akan mempelajari konstruksi seleksi, repetisi, array, dan objek dalam JavaScript. Selanjutnya, pada Anda akan dikenalkan mengenai DOM (Document Object Model). DOM memberikan Anda akses terhadap semua elemen pada suatu halaman web. Di dalam penjelajah web, formulir paragraf, tabel, dan lainnya, direpresentasikan pada sebuah hierarki objek. Dengan menggunakan JavaScript, Anda dapat menciptakan, memodifikasi, dan menghilangkan elemen-elemen di dalam halaman web secara dinamis. Setiap penjelajah internet (Web Browser) memiliki versi HTML dinamis (DHTML) yang berbeda, yang masing-masing menyediakan fungsionalitas yang sama. Namun, meskipun masing-masing memiliki kapabilitas yang sama, setiap model tersebut tidak kompatibel satu sama lain. Dalam usaha meningkatkan kompatibilitas lintas-penjelajah, W3C memberlakukan DOM terstandarisasi. Firefox, IE7, dan banyak penjelajah web lainnya mengimplementasikan hampir semua fitur DOM dari W3C. Pada buku ini, akan didiskusikan mengenai filter dan transisi. Penerapan filter terhadap teks dan citra menyebabkan perubahan yang persisten. Transisi bersifat temporer; penerapan sebuah transisi memampukan Anda untuk mengalihkan dari satu halaman ke halaman lain dengan efek visual seperti random dissolve. Filter dan transisi tidak menambahkan konten pada halaman Anda, tetapi keduanya dapat dipakai untuk menangkap atensi pengguna. Setiap efek visual yang diterapkan dengan filter dan transisi dapat diprogram (programabel), sehingga efek tersebut dapat diubah secara dinamis oleh program untuk merespon event yang dilakukan pengguna, seperti klik mouse dan penekanan-kunci. Filter dan transisi sangat mudah digunakan sehingga para perancang halaman web dapat menggunakannya dengan usaha yang minimal. Bagian dari keindahan filter dan transisi DHTML (dynamic HTML) adalah bahwa keduanya merupakan paket yang terintegrasi di dalam Internet Explorer. Anda tidak lagi memerlukan program paket grafis untuk memanfaatkannya. Filter dan transisi ditetapkan dengan properti filter dari CSS. Kapabilitas ini serupa dengan kapabilitas grafis dari perangkat lunak semacam PowerPoint dari Microsoft. Anda dapat memiliki halaman baru atau potong halaman web yang memudar. Anda dapat memiliki sebuah halaman yang secara acak menjelma (randomly dissolve) menjadi halaman berikutnya. Anda dapat membuat potongan halaman menjadi transparan atau semitransparan sehingga Anda dapat melihat apa yang ada di baliknya. Anda dapat mengaburkan teks atau citra untuk memberikannya ilusi gerakan. Anda dapat menciptakan bayangan pada elemen untuk memberikannya efek tiga-dimensi. Anda bahkan dapat menggabungkan beberapa efek untuk menghasilkan pelbagai efek yang lebih besar.", + "pageCount": 238, + "stock": 4, + "publisher": "Sparta Publisher", + "publishedDate": "2018-11-07", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=m4heDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers", + "pricePerWeek": 3810 + }, + { + "title": "Beginning JavaScript", + "isbn": "9781118903339", + "author": "Jeremy McPeak", + "synopsis": "The bestselling JavaScript guide, updated with current features and best practices Beginning JavaScript 5th Edition shows you how to work effectively with JavaScript frameworks, functions, and modern browsers, and teaches more effective coding practices using HTML5. This new edition has been extensively updated to reflect the way JavaScript is most commonly used today, introducing you to the latest tools and techniques available to JavaScript developers. Coverage includes modern coding practices using HTML5 markup, the JSON data format, DOM APIs, the jQuery framework, and more. Exercises with solutions provide plenty of opportunity to practice, and the companion website offers downloadable code for all examples given in the book. Learn JavaScript using the most up to date coding style Understand JSON, functions, events, and feature detection Utilize the new HTML5 elements and the related API Explore new features including geolocation, local storage, and more JavaScript has shaped the Web from a passive medium into one that is rich, dynamic, and interactive. No matter the technology on the server side, it's JavaScript that makes it come alive in the browser. To learn JavaScript the way it's used today, Beginning JavaScript, 5th Edition is your concise guide.", + "pageCount": 774, + "stock": 3, + "publisher": "John Wiley & Sons", + "publishedDate": "2015-03-09", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=nfiRBgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers", + "pricePerWeek": 2636 }, { "title": "JavaScript Demystified", @@ -232,7 +249,8 @@ "lang": "en", "imgUrl": "http://books.google.com/books/content?id=0bmK3Ey9LLUC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 412 }, { "title": "Professional JavaScript for Web Developers", @@ -240,13 +258,14 @@ "author": "Nicholas C. Zakas", "synopsis": "This book provides a developer-level introduction along with more advanced and useful features of JavaScript. Coverage includes: JavaScript use with HTML to create dynamic webpages, language concepts including syntax and flow control statements variable handling given their loosely typed nature built-in reference types such as object and array object-oriented programing powerful aspects of function expressions Browser Object Model allowing interaction with the browser itself detecting the client and its capabilities Document Object Model (DOM) objects available in DOM Level 1 how DOM Levels 2 and 3 augmented the DOM events, legacy support, and how the DOM redefined how events should work enhancing form interactions and working around browser limitations using the canvas tag to create on-the-fly graphics JavaScript API changes in HTML5 how browsers handle JavaScript errors and error handling features of JavaScript used to read and manipulate XML data the JSON data format as an alternative to XML Ajax techniques including the use of XMLHttpRequest object and CORS complex patterns including function currying, partial function application, and dynamic functions offline detection and storing data on the client machine techniques for JavaScript in an enterprise environment for better maintainability This book is aimed at three groups of readers: Experienced object-oriented programming developers looking to learn JavaScript as it relates to traditional OO languages such as Java and C++; Web application developers attempting to enhance site usability; novice JavaScript developers. Nicholas C. Zakas worked with the Web for over a decade. He has worked on corporate intranet applications used by some of the largest companies in the world and large-scale consumer websites such as MyYahoo! and the Yahoo! homepage. He regularly gives talks at companies and conferences regarding front-end best practices and new technology.", "pageCount": 960, - "stock": 4, + "stock": 1, "publisher": "John Wiley & Sons", "publishedDate": "2012-01-18", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=5pr15F4JbCUC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 1077 }, { "title": "Coding with JavaScript For Dummies", @@ -254,13 +273,14 @@ "author": "Chris Minnick, Eva Holland", "synopsis": "Go from beginner to builder quickly with this hands-on JavaScript guide Coding with JavaScript For Dummies provides easy, hands-on instruction for anyone looking to learn this popular client-side language. No experience? No problem! This friendly guide starts from the very beginning and walks you through the basics, then shows you how to apply what you've learned to real projects. You'll start building right away, including web page elements and simple applications, so you can immediately see how JavaScript is used in the real world. Online exercises allow you to test your code and expand your skills, and the easy-to-follow instruction provides step-by-step guidance toward understanding the JavaScript syntax, applications, and language. JavaScript enhances static web pages by providing dynamic elements that can adapt and react to user action. It's a need-to-know tool for aspiring web designers, but anyone can benefit from understanding this core development language. Coding with JavaScript For Dummies takes you from beginner to builder quickly as you: Learn what JavaScript does, how it works, and where to use it Master the core elements of JavaScript and immediately put it to work Build interactive web elements and try out your code online Create basic applications as you apply JavaScript to the app development workflow Anytime a website responds to your movement around the screen, that's JavaScript. It makes websites more functional, more beautiful, and more engaging, and your site visitors will demand nothing less. If you want to build a better website, you need JavaScript. If you need JavaScript, Coding with JavaScript For Dummies gets you started off quickly and painlessly, with plenty of hands-on practice.", "pageCount": 371, - "stock": 3, + "stock": 2, "publisher": "John Wiley & Sons", "publishedDate": "2015-05-26", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=MhNhBgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 3756 }, { "title": "Eloquent JavaScript", @@ -268,13 +288,14 @@ "author": "Marijn Haverbeke", "synopsis": "Provides information and examples on writing JavaScript code, covering such topics as syntax, control, data, regular expressions, and scripting.", "pageCount": 227, - "stock": 1, + "stock": 2, "publisher": "No Starch Press", "publishedDate": "2011", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=9U5I_tskq9MC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 1313 }, { "title": "React in Action", @@ -288,21 +309,8 @@ "lang": "en", "imgUrl": "http://books.google.com/books/content?id=S8gBMQAACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Computers" - }, - { - "title": "Beginning ReactJS Foundations Building User Interfaces with ReactJS", - "isbn": "9781119685586", - "author": "Chris Minnick", - "synopsis": "Quickly learn the most widely used front-end development language with ease and confidence React JS Foundations: Building User Interfaces with ReactJS - An Approachable Guide walks readers through the fundamental concepts of programming with the explosively popular front-end tool known as React JS. Written by an accomplished full-stack engineer, speaker, and community organizer, React JS Foundations teaches readers how to understand React and how to begin building applications with it. The book: Explains and clarifies technical terminology with relevant and modern examples to assist people new to programming understand the language Helps experienced programmers quickly get up to speed with React Is stocked throughout with practical and applicable examples of day-to-day React work Perfect for beginner, intermediate, and advanced programmers alike, React JS Foundations will quickly bring you up to speed on one of the most useful and widely used front-end languages on the web today. You can start building your first application today.", - "pageCount": 726, - "stock": 5, - "publisher": "John Wiley & Sons", - "publishedDate": "2022-02-03", - "lang": "en", - "imgUrl": "http://books.google.com/books/content?id=J89cEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", - "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 1945 }, { "title": "React 17 Design Patterns and Best Practices", @@ -310,13 +318,14 @@ "author": "Carlos Santana Roldan", "synopsis": "Build scalable, maintainable, and powerful React web apps with design patterns and insightful best practices Key Features Make the most of design patterns in React – including render props and controlled and uncontrolled inputs Master React Hooks with the help of this updated third edition Work through examples that can be used to create reusable code and extensible designs Book Description Filled with useful React patterns that you can use in your projects straight away, this book will help you save time and build better web applications with ease. React 17 Design Patterns and Best Practices is a hands-on guide for those who want to take their coding skills to a new level. You'll spend most of your time working your way through the principles of writing maintainable and clean code, but you'll also gain a deeper insight into the inner workings of React. As you progress through the chapters, you'll learn how to build components that are reusable across the application, how to structure applications, and create forms that actually work. Then you'll build on your knowledge by exploring how to style React components and optimize them to make applications faster and more responsive. Once you've mastered the rest, you'll learn how to write tests effectively and how to contribute to React and its ecosystem. By the end of this book, you'll be able to avoid the process of trial and error and developmental headaches. Instead, you'll be able to use your new skills to efficiently build and deploy real-world React web applications you can be proud of. What you will learn Get to grips with the techniques of styling and optimizing React components Create components using the new React Hooks Use server-side rendering to make applications load faster Get up to speed with the new React Suspense technique and using GraphQL in your projects Write a comprehensive set of tests to create robust and maintainable code Build high-performing applications by optimizing components Who this book is for This book is for web developers who want to understand React better and apply it to real-life app development. You'll need an intermediate-level experience with React and JavaScript before you get started.", "pageCount": 381, - "stock": 4, + "stock": 3, "publisher": "Packt Publishing Ltd", "publishedDate": "2021-05-17", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=viIvEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 1973 }, { "title": "Hands-On Design Patterns with React Native", @@ -324,13 +333,14 @@ "author": "Mateusz Grzesiukiewicz", "synopsis": "Learn how to write cross platform React Native code by using effective design patterns in the JavaScript world. Get to know industry standard patterns as well as situational patterns. Decouple your application with these set of “Idea patterns”. Key FeaturesMobile development in React Native should be done in a reusable way. Learn how to build scalable applications using JavaScript patterns that are battle tested.Try effective techniques on your own using over 80 standalone examples.Book Description React Native helps developers reuse code across different mobile platforms like iOS and Android. This book will show you effective design patterns in the React Native world and will make you ready for professional development in big teams. The book will focus only on the patterns that are relevant to JavaScript, ECMAScript, React and React Native. However, you can successfully transfer a lot of the skills and techniques to other languages. I call them “Idea patterns”. This book will start with the most standard development patterns in React like component building patterns, styling patterns in React Native and then extend these patterns to your mobile application using real world practical examples. Each chapter comes with full, separate source code of applications that you can build and run on your phone. The book is also diving into architectural patterns. Especially how to adapt MVC to React environment. You will learn Flux architecture and how Redux is implementing it. Each approach will be presented with its pros and cons. You will learn how to work with external data sources using libraries like Redux thunk and Redux Saga. The end goal is the ability to recognize the best solution for a given problem for your next mobile application. What you will learnExplore the design Patterns in React NativeLearn the best practices for React Native developmentExplore common React patterns that are highly used within React Native developmentLearn to decouple components and use dependency injection in your applicationsExplore the best ways of fetching data from the backend systemsLearn the styling patterns and how to implement custom mobile designsExplore the best ways to organize your application code in big codebasesWho this book is for The ideal target audience for this book are people eager to learn React Native design patterns who already know the basics of JavaScript. We can assume that the target audience already knows how to write Hello World in JavaScript and know what are the functions, recursive functions, JavaScript types and loops.", "pageCount": 297, - "stock": 4, + "stock": 2, "publisher": "Packt Publishing Ltd", "publishedDate": "2018-09-29", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=Iv1wDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 3210 }, { "title": "Menguasai React JS Untuk Pemula", @@ -338,13 +348,14 @@ "author": "Rohi Abdulloh", "synopsis": "Buku ini ditujukan bagi siapa saja yang ingin menguasai React. Pembahasan dimulai teori dasar JavaScript, sehingga buku ini dapat diikuti oleh orang yang baru mengenal JavaScript sekalipun. Buku ini dibuat dengan skrip berwarna, harapannya akan lebih mudah diikuti dan dipahami. Setiap pembahasan disertai contoh skrip dan hasilnya. File-file latihan pada buku ini diminta melalui email penulis dengan menyertakan bukti pembelian buku. Total halaman buku ini sampai 400 lebih halaman. Materi yang dibahas meliputi: - Teori dasar JavaScript - Teori dasr React - Menggunakan Component Library - Menggunakan Material UI - Menerapkan Routing dan AJAX - Integrasi dengan Laravel dan Inertia Buku ini ditulis oleh penulis yang sudah berpengalaman menulis buku-buku best seller. Bahkan buku-bukunya banyak yang dikoleksi oleh pembaca. Salah satu keunggulan dari buku-bukunya yaitu mudah diikuti oleh pemula sekalipun.", "pageCount": 407, - "stock": 3, + "stock": 5, "publisher": "Rohi Abdulloh", "publishedDate": "2020-11-25", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=jq4LEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Young Adult Nonfiction" + "category": "Young Adult Nonfiction", + "pricePerWeek": 141 }, { "title": "React.js Essentials", @@ -352,12 +363,13 @@ "author": "Artemij Fedosejev", "synopsis": "This book will help you understand why big organizations use React.js to build web applications with maintainable and performant user interfaces. From creating UI elements to testing and exploring scaling solutions, this book will take you through building your own maintainable React.js application in no time.", "pageCount": 0, - "stock": 2, + "stock": 1, "publishedDate": "2015", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=xEApjgEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Application software" + "category": "Application software", + "pricePerWeek": 1252 }, { "title": "Learning React", @@ -365,13 +377,14 @@ "author": "Kirupa Chinnathambi", "synopsis": "Learning React A hands-on guide to building web applications using React and Redux As far as new web frameworks and libraries go, React is quite the runaway success. It not only deals with the most common problems developers face when building complex apps, it throws in a few additional tricks that make building the visuals for such apps much, much easier. What React isn’t, though, is beginner-friendly and approachable. Until now. In Learning React, author Kirupa Chinnathambi brings his fresh, clear, and very personable writing style to help web developers new to React understand its fundamentals and how to use it to build really performant (and awesome) apps. The only book on the market that helps you get your first React app up and running in just minutes, Learning Reactis chock-full of colorful illustrations to help you visualize difficult concepts and practical step-by-step examples to show you how to apply what you learn. Build your first React app Create components to define parts of your UI Combine components into other components to build more complex UIs Use JSX to specify visuals without writing full-fledged JavaScript Deal with maintaining state Work with React’s way of styling content Make sense of the mysterious component lifecycle Build multi-page apps using routing and views Optimize your React workflow using tools such as Node, Babel, webpack, and others Use Redux to make managing your app data and state easy Contents at a Glance 1 Introducing React 2 Building Your First React App 3 Components in React 4 Styling in React 5 Creating Complex Components 6 Transferring Properties 7 Meet JSX... Again! 8 Dealing with State in React 9 Going from Data to UI in React 10 Events in React 11 The Component Lifecycle 12 Accessing DOM Elements in React 13 Setting Up Your React Dev Environment 14 Working with External Data in React 15 Building an Awesome Todo List App in React 16 Creating a Sliding Menu in React 17 Avoiding Unnecessary Renders in React 18 Creating a Single-Page App in React Using React Router 19 Introduction to Redux 20 Using Redux with React", "pageCount": 747, - "stock": 3, + "stock": 5, "publisher": "Addison-Wesley Professional", "publishedDate": "2018-04-26", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=7KVYDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 1793 }, { "title": "Pro React 16", @@ -379,13 +392,14 @@ "author": "Adam Freeman", "synopsis": "Use the enormously popular React framework to build dynamic JavaScript applications that take advantage of the capabilities of modern browsers and devices. You will learn how React brings the power of strong architecture and responsive data to the client, providing the foundation for complex and rich user interfaces. Best-selling author Adam Freeman explains how to get the most from React. He begins by describing the React architecture and the benefits it offers and then shows you how to use React and its associated tools and libraries in your projects, starting from the nuts and bolts and building up to the most advanced and sophisticated features, going in-depth to give you the knowledge you need. Each topic is presented clearly and concisely. Chapters include common problems and how to avoid them. What You’ll Learn Gain a solid understanding of the React design Create rich and dynamic web app clients using React Create data stores using Redux Consume data using REST and GraphQL Test your React projects Who This Book Is For JavaScript developers who want to use React to create dynamic client-side applications", "pageCount": 745, - "stock": 2, + "stock": 3, "publisher": "Apress", "publishedDate": "2019-03-20", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=dKD8vwEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 1965 }, { "title": "React Projects", @@ -393,13 +407,14 @@ "author": "Roy Derks", "synopsis": "Build cross-platform applications of varying complexity for the web, mobile, and VR devices using React tooling Key FeaturesBuild React applications at scale using effective React patterns and best practicesExplore React features such as Hooks, the Context API, and the Suspense APIExtend React’s integration with React Native for building cross-platform mobile apps and gamesBook Description Developed by Facebook, React is a popular library for building impressive user interfaces. React extends its capabilities to the mobile platform using the React Native framework and integrates with popular web and mobile tools to build scalable applications. React Projects is your guide to learning React development by using modern development patterns and integrating React with powerful web tools such as GraphQL, Expo, and React 360. You'll start building a real-world project right from the first chapter and get hands on with developing scalable applications as you advance to building more complex projects. Throughout the book, you'll use the latest versions of React and React Native to explore features such as Higher Order Components (HOC), Context, and Hooks on multiple platforms, which will help you build full stack web and mobile applications efficiently. Finally, you'll delve into unit testing with Jest to build test-driven apps. By the end of this React book, you'll have developed the skills necessary to start building scalable React apps across web and mobile platforms. What you will learnCreate a wide range of applications using various modern React tools and frameworksDiscover how React Hooks modernize state management for React appsDevelop progressive web applications using React componentsBuild test-driven React applications using the Jest and Enzyme frameworksUnderstand full stack development using React, Apollo, and GraphQLPerform server-side rendering using React and React RouterDesign gestures and animations for a cross-platform game using React NativeWho this book is for The book is for JavaScript developers who want to explore React tooling and frameworks for building cross-platform applications. Basic knowledge of web development, ECMAScript, and React will assist with understanding key concepts covered in this book.", "pageCount": 465, - "stock": 3, + "stock": 1, "publisher": "Packt Publishing Ltd", "publishedDate": "2019-12-20", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=2HvGDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 2791 }, { "title": "Learning React Native", @@ -407,26 +422,28 @@ "author": "Bonnie Eisenman", "synopsis": "Get a practical introduction to React Native, the JavaScript framework for writing and deploying fully featured mobile apps that render natively. The second edition of this hands-on guide shows you how to build applications that target iOS, Android, and other mobile platforms instead of browsers—apps that can access platform features such as the camera, user location, and local storage. Through code examples and step-by-step instructions, web developers and frontend engineers familiar with React will learn how to build and style interfaces, use mobile components, and debug and deploy apps. You’ll learn how to extend React Native using third-party libraries or your own Java and Objective-C libraries. Understand how React Native works under the hood with native UI components Examine how React Native’s mobile-based components compare to basic HTML elements Create and style your own React Native components and applications Take advantage of platform-specific APIs, as well as modules from the framework’s community Incorporate platform-specific components into cross-platform apps Learn common pitfalls of React Native development, and tools for dealing with them Combine a large application’s many screens into a cohesive UX Handle state management in a large app with the Redux library", "pageCount": 242, - "stock": 4, + "stock": 3, "publisher": "\"O'Reilly Media, Inc.\"", "publishedDate": "2017-10-23", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=xAg7DwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 4965 }, { "title": "A simpel basic tutor programming", "isbn": "-", "author": "-", "synopsis": "tutorial buku tentang awal pembuatan project dengan react native", - "stock": 2, + "stock": 3, "publisher": "Lan Dev", "publishedDate": "2017-01-17", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=kbjPDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Young Adult Nonfiction" + "category": "Young Adult Nonfiction", + "pricePerWeek": 4138 }, { "title": "Fullstack React", @@ -434,13 +451,14 @@ "author": "Accomazzo Anthony, Murray Nathaniel, Ari Lerner", "synopsis": "LEARN REACT TODAY The up-to-date, in-depth, complete guide to React and friends. Become a ReactJS expert today", "pageCount": 836, - "stock": 2, + "stock": 5, "publisher": "Fullstack.IO", "publishedDate": "2017-03", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=ppjUtAEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 1192 }, { "title": "React and React Native", @@ -448,13 +466,14 @@ "author": "Adam Boduch, Roy Derks", "synopsis": "Get up to speed with React, React Native, GraphQL and Apollo for building cross-platform native apps with the help of practical examples Key FeaturesCovers the latest features of React such as Hooks, Suspense, NativeBase, and Apollo in this updated third editionGet to grips with the React architecture for writing easy-to-manage web and mobile applicationsUnderstand GraphQL and Apollo for building a scalable backend for your cross-platform appsBook Description React and React Native, Facebook's innovative User Interface (UI) libraries, are designed to help you build robust cross-platform web and mobile applications. This updated third edition is improved and updated to cover the latest version of React. The book particularly focuses on the latest developments in the React ecosystem, such as modern Hook implementations, code splitting using lazy components and Suspense, user interface framework components using Material-UI, and Apollo. In terms of React Native, the book has been updated to version 0.62 and demonstrates how to apply native UI components for your existing mobile apps using NativeBase. You will begin by learning about the essential building blocks of React components. Next, you'll progress to working with higher-level functionalities in application development, before putting this knowledge to use by developing user interface components for the web and for native platforms. In the concluding chapters, you'll learn how to bring your application together with a robust data architecture. By the end of this book, you'll be able to build React applications for the web and React Native applications for multiple mobile platforms. What you will learnDelve into the React architecture, component properties, state, and contextGet to grips with React Hooks for handling functions and componentsImplement code splitting in React using lazy components and SuspenseBuild robust user interfaces for mobile and desktop apps using Material-UIWrite shared components for Android and iOS mobile apps using React NativeSimplify layout design for React Native apps using NativeBaseWrite GraphQL schemas to power web and mobile appsImplement web and mobile components that are driven by ApolloWho this book is for This book is for any JavaScript developer who wants to start learning how to use Facebook's UI libraries, React and React Native, for mobile and web application development. Although no prior knowledge of React is needed, working knowledge of JavaScript programming will help you understand the concepts covered in the book more effectively.", "pageCount": 505, - "stock": 4, + "stock": 5, "publisher": "Packt Publishing Ltd", "publishedDate": "2020-04-30", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=XCLhDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 1838 }, { "title": "Full-Stack React, TypeScript, and Node", @@ -462,13 +481,14 @@ "author": "David Choi", "synopsis": "Discover the current landscape of full-stack development and how to leverage modern web technologies for building production-ready React.js applications to deploy on AWS Key FeaturesUnderstand the architecture of React and single-page applicationsBuild a modern Web API for your SPA using Node.js, Express, and GraphQLGain a clear and practical understanding of how to build a complete full-stack applicationBook Description React sets the standard for building high-performance client-side web apps. Node.js is a scalable application server that is used in thousands of websites, while GraphQL is becoming the standard way for large websites to provide data and services to their users. Together, these technologies, when reinforced with the capabilities of TypeScript, provide a cutting-edge stack for complete web application development. This book takes a hands-on approach to implementing modern web technologies and the associated methodologies for building full-stack apps. You’ll begin by gaining a strong understanding of TypeScript and how to use it to build high-quality web apps. The chapters that follow delve into client-side development with React using the new Hooks API and Redux. Next, you’ll get to grips with server-side development with Express, including authentication with Redis-based sessions and accessing databases with TypeORM. The book will then show you how to use Apollo GraphQL to build web services for your full-stack app. Later, you’ll learn how to build GraphQL schemas and integrate them with React using Hooks. Finally, you’ll focus on how to deploy your application onto an NGINX server using the AWS cloud. By the end of this book, you’ll be able to build and deploy complete high-performance web applications using React, Node, and GraphQL. What you will learnDiscover TypeScript’s most important features and how they can be used to improve code quality and maintainabilityUnderstand what React Hooks are and how to build React apps using themImplement state management for your React app using ReduxSet up an Express project with TypeScript and GraphQL from scratchBuild a fully functional online forum app using React and GraphQLAdd authentication to your web app using RedisSave and retrieve data from a Postgres database using TypeORMConfigure NGINX on the AWS cloud to deploy and serve your appsWho this book is for The book is for web developers who want to go beyond front-end web development and enter the world of full-stack web development by learning about modern web technologies and how they come together. A good understanding of JavaScript programming is required before getting started with this web development book.", "pageCount": 648, - "stock": 4, + "stock": 3, "publisher": "Packt Publishing Ltd", "publishedDate": "2020-12-18", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=uUMQEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 747 }, { "title": "React: Cross-Platform Application Development with React Native", @@ -476,13 +496,14 @@ "author": "Emilio Rodriguez Martinez", "synopsis": "With React Native, you can build native mobile apps that are much more powerful, interactive, and faster by using JavaScript. React Native helps web and mobile developers to build cross-platform apps at a high level. This book takes you through four projects to help understand of the framework and build mobile apps with native user experience.", "pageCount": 183, - "stock": 2, + "stock": 4, "publisher": "Packt Publishing Ltd", "publishedDate": "2018-03-13", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=MZRRDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 150 }, { "title": "React Native for Mobile Development", @@ -490,13 +511,29 @@ "author": "Akshat Paul, Abhishek Nalwaya", "synopsis": "Develop native iOS and Android apps with ease using React Native. Learn by doing through an example-driven approach, and have a substantial running app at the end of each chapter. This second edition is fully updated to include ES7 (ECMAScript 7), the latest version of React Native (including Redux), and development on Android. You will start by setting up React Native and exploring the anatomy of React Native apps. You'll then move on to Redux data flow, how it differs from flux, and how you can include it in your React Native project to solve state management differently and efficiently. You will also learn how to boost your development by including popular packages developed by the React Native community that will help you write less; do more. Finally, you'll learn to how write test cases using Jest and submit your application to the App Store. React Native challenges the status quo of native iOS and Android development with revolutionary components, asynchronous execution, unique methods for touch handling, and much more. This book reveals the the path-breaking concepts of React.js and acquaints you with the React way of thinking so you can learn to create stunning user interfaces. What You'll Learn Build stunning iOS and Android applications Understand the Redux design pattern and use it in your project Interact with iOS and android device capabilities such as addressbook, camera, GPS and more with your apps Test and launch your application to the App StoreWho This Book Is For Anyone with JavaScript experience who wants to build native mobile applications but dreads the thought of programming in Objective-C or Java. Developers who have experience with JavaScript but are new or not acquainted to React Native or ReactJS.", "pageCount": 243, - "stock": 1, + "stock": 2, "publisher": "Apress", "publishedDate": "2019-06-12", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=0DidDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 3154 + }, + { + "title": "Advanced Web Development with React", + "isbn": "9789389423600", + "author": "Mohan Mehul", + "synopsis": "Level up your React and Next.js skills with advanced concepts about SSR and PWA Key Featuresa- Covers latest and core React concepts including React hooks and React reconcilera- Covers about Server Side Rendering with React and how to use it using Next.jsa- Covers about Progressive Web Apps in React and how to create thema- Covers intermediate and advanced React concepts like state managementa- Covers overview of React for beginners to catch with advanced concepts latera- Covers bleeding-edge React concepts on the future of React and how it would work eventuallyDescriptionThe book starts by introducing the reader to React, what it is and why you need a library like React to work with medium to large scale applications. We then move on to implementing simple client-side programs with React, uncovering modern React practices like React hooks and diving deep into various kinds of hooks. We then move to implement React on the server using Server-Side Rendering to bring benefits of the SEO world to the dynamic rendering nature of front-end libraries. For this, we use Next.js, a very popular implementation of Server-Side Rendering which comes with tons of good practices already baked in. We also take a look at how Progressive Web Apps can be created out of existing React codebases and what benefits it provides us. Finally, we end the book with some React internals (how to React works) and some bleeding-edge features in React which are expected to roll out in 2-3 years fully and would impact how to React works under the hood.What will you learna- What React is and how to get started with ita- Modern ways to code React applicationsa- Implementing Server-Side rendering with/without Next.js on the top of React librarya- Working with Progressive Web Apps in Reacta- How to React works under the hooda- Future of React and bleeding-edge React tech you can use todayWho this book is forThe reader is expected to have a decent understanding of JavaScript/HTML/CSS, and possibly, worked with React a little bit beforehand. Although the first 2 chapters cover basics of React, still it is recommended for users with at least a bit of knowledge and experience with React.Table of Contents1. React 1012. Setting up React3. Components4. State Management with React5. Server Side React6. Introduction to Next.js7. More with Next.js8. Progressive Web Apps9. Bleeding edge ReactAbout the AuthorMehul Mohan is an entrepreneur, developer and a security researcher. Currently, he is pursuing his bachelor's degree in CSE at BITS Pilani. He is a WWDC'19 Scholar, and runs codedamn - a platform for people to learn coding. You'll often find him creating programming tutorials on his YouTube channel, codedamn, having over 100,000 subscribers. He has been acknowledged by companies such as Google, Microsoft, Sony, etc. for his contributions as a security researcher. Your Blog links: https://codedamn.com https://mehulmohan.com His LinkedIn Profile: https://linkedin.com/in/mehulmpt", + "pageCount": 184, + "stock": 3, + "publisher": "BPB Publications", + "publishedDate": "2020-02-26", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=0bpIEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "status": "available", + "category": "Computers", + "pricePerWeek": 1628 }, { "title": "Panduan Membuat Aplikasi Ujian Online Dengan Laravel 8, React dan Inertia", @@ -504,55 +541,59 @@ "author": "Rohi Abdulloh", "synopsis": "Ebook ini membahas step by step pembuatan aplikasi ujian online menggunakan Laravel 8, React dan Inertia. Laravel merupakan framework PHP paling populer saat ini untuk pengembangan aplikasi pada sisi back end. Sedangkan React merupakan framework JavaScript yang paling populer untuk pengembangan aplikasi pada sisi front end. Cara termudah mengintegrasikan Laravel dan React yaitu dengan menggunakan Inertia yang memungkinkan menggunakan Laravel dan React tanpa membuat Rest API. Beberapa fitur dalam aplikasi ini meliputi: · Import soal dari excel, sehingga soal tidak perlu input satu-satu ke aplikasi. · Import dan eksport peserta ujian dengan password dapat dibuat sendiri atau dibuat oleh aplikasi. · Export nilai dan jawaban yang dapat digunakan untuk keperluan analisis soal. · Pilihan acak soal, acak jawaban dan tampilkan hasil ujian ke siswa yang dapat diatur sesuai kebutuhan. · Pembagian sesi ujian, sehingga peserta hanya dapat mengakses ujian pada waktu yang sudah dijadwalkan. · Count down timer yang akan menghentikan ujian jika waktunya selesai. · Jika ada kejadian tak terduga, misal mati lampu atau komputer rusak, peserta dapat melanjutkan dengan waktu yang tersisa. Demo aplikasi dapat dilihat di: https://www.youtube.com/watch?v=loHmBPIc6Dg", "pageCount": 168, - "stock": 2, + "stock": 4, "publisher": "Rohi Abdulloh", "publishedDate": "2021-05-05", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=cqcsEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 248 }, { - "title": "React: Building Modern Web Applications", - "isbn": "9781786462848", - "author": "Jonathan Hayward, Artemij Fedosejev, Narayan Prusty, Adam Horton, Ryan Vice, Ethan Holmes, Tom Bray", - "synopsis": "Master the art of building dynamic, modern web applications with React About This Book Learn the hot new frontend web framework from Facebook – ReactJS, an easy way of developing the V in MVC and a better approach to software engineering in JavaScript A fast-paced guide to designing and building scalable and maintainable web apps with React.js Learn all the new ES6 features and be among the most prominent JavaScript developers who can write efficient JS programs as per the latest standards Master the art of building modern web applications using React Learn to build modern native iOS and Android applications using JavaScript and the incredible power of React Who This Book Is For This course is for web developers that want to unlock high performance dynamism in the applications that they create. If you want a comprehensive journey into one of the most important JavaScript frameworks around today, dive into this course. What You Will Learn Take control of the front end with reactive JavaScript programming Discover what ReactJS offers your development - before mastering it Create React elements with properties and children Use JSX to speed up your React development process Test your React components with the Jest test framework Learn the latest syntax of ES6 Execute ES6 in a non-supported ES6 environment Learn the principles of object-oriented programming Create a complete single-page application Use an application design plan to write smarter, more meaningful code Learn how to use animations to give extra style to your application Get to grips with the React Native environment Write your own custom native UI components Integrate native modules in Objective-C and Java that interact with JavaScript In Detail ReactJS has helped to transform the web as we know it. Designed by Facebook to help developers build rapid, responsive UI that can deal with data-intensive usage, it's an essential component in any web developer's skillset. This ReactJS course, in five connected modules, provides you with a fast, engaging and practical route into ReactJS—so you can build powerful, elegant, and modern web applications. Beginning with the Reactive Programming with JavaScript module, you will learn how to take advantage of a reactive and functional programming paradigm to rethink how you approach your JavaScript code. It's built to help you understand the concepts, relevant and applicable for any frontend developer. You'll then dive a little deeper into ReactJS. The second module gives you a rapid look through the fundamentals of ReactJS, showing you how to build a basic application and demonstrating how to implement the Flux architecture. In the third module you will get to grips with ES6—this will make you a more fluent JavaScript developer, giving you control over ReactJS. You can put your old JavaScript hacks aside and instead explore how to create ES6 custom iterators. In the final two modules you'll learn how to fully master ReactJS, exploring its wider ecosystem of tools that have helped to make it one of the most important tools in web development today. Ending with insights and guidance on React Native, the tool built for today's demand for native, intuitive user experiences and interfaces, with this course you can be confident in building dynamic and modern apps with React. Style and approach Consisting of five separate modules, journey from the fundamentals of reactive programming to the exciting possibilities of React Native. Each module builds on each other, helping you to incrementally develop your skills and knowledge.", - "pageCount": 910, - "stock": 5, + "title": "React and React Native", + "isbn": "9781786469571", + "author": "Adam Boduch", + "synopsis": "Use React and React Native to build applications for desktop browsers, mobile browsers, and even as native mobile apps About This Book Build React and React Native applications using familiar component concepts Dive deep into each platform, from routing in React to creating native mobile applications that can run offline Use Facebook's Relay, React and GraphQL technologies, to create a unified architecture that powers both web and native applications Who This Book Is For This book is written for any JavaScript developer—beginner or expert—who wants to start learning how to put both of Facebook's UI libraries to work. No knowledge of React is needed, though a working knowledge of ES2015 will help you follow along better. What You Will Learn Craft reusable React components Control navigation using the React Router to help keep your UI in sync with URLs Build isomorphic web applications using Node.js Use the Flexbox layout model to create responsive mobile designs Leverage the native APIs of Android and iOS to build engaging applications with React Native Respond to gestures in a way that's intuitive for the user Use Relay to build a unified data architecture for your React UIs In Detail React and React Native allow you to build cross-platform desktop and mobile applications using Facebook's innovative UI libraries. Combined with the Flux data architecture and Relay, you can now create powerful and feature-complete applications from just one code base! This book is split into three parts. The first part shows you how to start crafting composable UIs using React, from rendering with JSX and creating reusable components through to routing and creating isomorphic applications that run on Node. We then move on to showing you how to take the concepts of React and apply them to building Native UIs using React Native. You'll find out how to build responsive and streamlined UIs that can properly handle user interactions in a mobile environment. You'll also learn how to access device-specific APIs such as the geolocation API, and how to handle offline development with React Native. Finally, we'll tie all of these skills together and shows you how you can create React applications that run on every major platform. As well as understanding application state in depth, you'll learn how to leverage Relay to make feature-complete, data-driven web and native mobile applications. Style and approach Split into three major sections to help organize your learning, this hands-on, code-first book will help you get up to speed with React and React Native—the UI framework that powers Netflix, Yahoo, and Facebook.", + "pageCount": 485, + "stock": 4, "publisher": "Packt Publishing Ltd", - "publishedDate": "2016-06-10", + "publishedDate": "2017-03-08", "lang": "en", - "imgUrl": "http://books.google.com/books/content?id=jUvZDQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "imgUrl": "http://books.google.com/books/content?id=jLkrDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 3665 }, { - "title": "Full-Stack Web Development with GraphQL and React", - "isbn": "9781801079174", - "author": "Sebastian Grebe", - "synopsis": "Unleash the power of GraphQL, React 17, Node, and Express to build a scalable and production-ready application from scratch to be deployed on AWS Key FeaturesBuild full-stack applications with modern APIs using GraphQL and React HooksIntegrate Apollo into React and build frontend components using GraphQLImplement a self-updating notification pop-up with a unique GraphQL feature called SubscriptionsBook Description React and GraphQL, when combined, provide you with a very dynamic, efficient, and stable tech stack to build web-based applications. GraphQL is a modern solution for querying an API that represents an alternative to REST and is the next evolution in web development. This book guides you in creating a full-stack web application from scratch using modern web technologies such as Apollo, Express.js, Node.js, and React. First, you'll start by configuring and setting up your development environment. Next, the book demonstrates how to solve complex problems with GraphQL, such as abstracting multi-table database architectures and handling image uploads using Sequelize. You'll then build a complete Graphbook from scratch. While doing so, you'll cover the tricky parts of connecting React to the backend, and maintaining and synchronizing state. In addition to this, you'll also learn how to write Reusable React components and use React Hooks. Later chapters will guide you through querying data and authenticating users in order to enable user privacy. Finally, you'll explore how to deploy your application on AWS and ensure continuous deployment using Docker and CircleCI. By the end of this web development book, you'll have learned how to build and deploy scalable full-stack applications with ease using React and GraphQL. What you will learnBuild a GraphQL API by implementing models and schemas with Apollo and SequelizeSet up an Apollo Client and build frontend components using ReactWrite Reusable React components and use React HooksAuthenticate and query user data using GraphQLUse Mocha to write test cases for your full-stack applicationDeploy your application to AWS using Docker and CircleCIWho this book is for This React GraphQL book is for web developers familiar with React and GraphQL who want to enhance their skills and build full-stack applications using industry standards like React, Apollo, Node.js, and SQL at scale while learning to solve complex problems with GraphQL.", - "pageCount": 473, - "stock": 4, - "publisher": "Packt Publishing Ltd", - "publishedDate": "2022-02-28", + "title": "React", + "isbn": "1976210232", + "author": "Lionel Lopez", + "synopsis": "REACT This book/tutorial is about ReactJS and it is designed to move you from beginner to advanced programming. This book is based on 17 chapters well managed and it will helps you to become a React JS expert in less than 7 days. Each chapter will contain a certain number of relevant topics with illustrations and exercises where necessary, this will all be finished off with an end of chapter quiz for an easy and enjoyable learning. Benefits of reading this book that you're not going to find anywhere else: It helps you to understand React Easily. You can learn how to install Node JS based on ReactJS. With React you can build applications fast. ReactJS is SEO friendly. It makes code writing simple. We can use React with other libraries. React JS is very light weight front-end framework which allows developers to create web applications faster. Great Community Support. Supports State Management using Redux. CLICK ADD TO CART TO GET THIS AMAZING BOOK!", + "pageCount": 206, + "stock": 2, + "publisher": "Createspace Independent Publishing Platform", + "publishedDate": "2017-09-07", "lang": "en", - "imgUrl": "http://books.google.com/books/content?id=GPBbEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "imgUrl": "http://books.google.com/books/content?id=vHj7swEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Computers" + "category": "-", + "pricePerWeek": 4386 }, { - "title": "React Components", - "isbn": "9781785883729", - "author": "Christopher Pitt", - "synopsis": "Explore the power of React components for cutting-edge web development About This Book Learn to build better websites by creating a variety of different components in React Conceptualize the design and build maintainable web apps with the help of components A fast-paced guide to help you learn about component-based development in React Who This Book Is For This book is ideal for developers who are familiar with the basics of React and are looking for a guide to building a wide range of components as well as develop component-driven UIs. What You Will Learn How to structure an app into components Working with nested components Work with nested components Set up communication across components Style the existing components Work with Material Design as a component Render components on the server Make the best of design patterns Make the app pluggable In Detail The reader will learn how to use React and its component-based architecture in order to develop modern user interfaces. A new holistic way of thinking about UI development will establish throughout this book and the reader will discover the power of React components with many examples. After reading the book and following the example application, the reader has built a small to a mid-size application with React using a component based UI architecture. The book will take the reader through a journey to discover the benefits of component-based user interfaces over the classical MVC architecture. Throughout the book, the reader will develop a wide range of components and then bring them together to build a component-based UI. By the end of this book, readers would have learned several techniques to build powerful components and how the component-based development is beneficial over regular web development. Style and approach This book is a compact, example-driven guide that provides a step-by-step approach.", - "pageCount": 182, - "stock": 3, + "title": "React: Building Modern Web Applications", + "isbn": "9781786462848", + "author": "Jonathan Hayward, Artemij Fedosejev, Narayan Prusty, Adam Horton, Ryan Vice, Ethan Holmes, Tom Bray", + "synopsis": "Master the art of building dynamic, modern web applications with React About This Book Learn the hot new frontend web framework from Facebook – ReactJS, an easy way of developing the V in MVC and a better approach to software engineering in JavaScript A fast-paced guide to designing and building scalable and maintainable web apps with React.js Learn all the new ES6 features and be among the most prominent JavaScript developers who can write efficient JS programs as per the latest standards Master the art of building modern web applications using React Learn to build modern native iOS and Android applications using JavaScript and the incredible power of React Who This Book Is For This course is for web developers that want to unlock high performance dynamism in the applications that they create. If you want a comprehensive journey into one of the most important JavaScript frameworks around today, dive into this course. What You Will Learn Take control of the front end with reactive JavaScript programming Discover what ReactJS offers your development - before mastering it Create React elements with properties and children Use JSX to speed up your React development process Test your React components with the Jest test framework Learn the latest syntax of ES6 Execute ES6 in a non-supported ES6 environment Learn the principles of object-oriented programming Create a complete single-page application Use an application design plan to write smarter, more meaningful code Learn how to use animations to give extra style to your application Get to grips with the React Native environment Write your own custom native UI components Integrate native modules in Objective-C and Java that interact with JavaScript In Detail ReactJS has helped to transform the web as we know it. Designed by Facebook to help developers build rapid, responsive UI that can deal with data-intensive usage, it's an essential component in any web developer's skillset. This ReactJS course, in five connected modules, provides you with a fast, engaging and practical route into ReactJS—so you can build powerful, elegant, and modern web applications. Beginning with the Reactive Programming with JavaScript module, you will learn how to take advantage of a reactive and functional programming paradigm to rethink how you approach your JavaScript code. It's built to help you understand the concepts, relevant and applicable for any frontend developer. You'll then dive a little deeper into ReactJS. The second module gives you a rapid look through the fundamentals of ReactJS, showing you how to build a basic application and demonstrating how to implement the Flux architecture. In the third module you will get to grips with ES6—this will make you a more fluent JavaScript developer, giving you control over ReactJS. You can put your old JavaScript hacks aside and instead explore how to create ES6 custom iterators. In the final two modules you'll learn how to fully master ReactJS, exploring its wider ecosystem of tools that have helped to make it one of the most important tools in web development today. Ending with insights and guidance on React Native, the tool built for today's demand for native, intuitive user experiences and interfaces, with this course you can be confident in building dynamic and modern apps with React. Style and approach Consisting of five separate modules, journey from the fundamentals of reactive programming to the exciting possibilities of React Native. Each module builds on each other, helping you to incrementally develop your skills and knowledge.", + "pageCount": 910, + "stock": 1, "publisher": "Packt Publishing Ltd", - "publishedDate": "2016-04-21", + "publishedDate": "2016-06-10", "lang": "en", - "imgUrl": "http://books.google.com/books/content?id=_97JDAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", + "imgUrl": "http://books.google.com/books/content?id=jUvZDQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 2136 }, { "title": "Encyclopedia of World Biography", @@ -560,13 +601,14 @@ "author": "-", "synopsis": "Presents brief biographical sketches which provide vital statistics as well as information on the importance of the person listed.", "pageCount": 558, - "stock": 2, + "stock": 3, "publisher": "Gale", "publishedDate": "1998", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=UbWRXPJnwbQC&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Biography" + "category": "Biography", + "pricePerWeek": 1929 }, { "title": "Virgil Thomson", @@ -579,7 +621,22 @@ "lang": "en", "imgUrl": "http://books.google.com/books/content?id=sT0bAAAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Music" + "category": "Music", + "pricePerWeek": 4032 + }, + { + "title": "Mohammad Amien Rais", + "isbn": "UOM:39015061569961", + "author": "Zaim Uchrowi", + "synopsis": "Biography of Mohammad Amien Rais, an Indonesian Muslim political leader.", + "pageCount": 400, + "stock": 5, + "publishedDate": "2004", + "lang": "id", + "imgUrl": "http://books.google.com/books/content?id=U_1wAAAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Indonesia", + "pricePerWeek": 2265 }, { "title": "AWS CLI Command", @@ -587,13 +644,14 @@ "author": "RB ASHISH", "synopsis": "Master the step by step guide to AWS CLI Command Amazon Web Services Cmd line Interface. With just single tool you can configure, control and manage all your AWS Services through command line and automate them with scripts. Some of the services includes are: • apigateway • autoscaling • batch • cloudformation • dynamodb • ec2 • glacier • iam • kms • lambda • machinelearning • rds • route53 • s3 • swf • waf and more.", "pageCount": 26, - "stock": 5, + "stock": 4, "publisher": "CreateSpace", "publishedDate": "2018-10-08", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=4aFmDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 930 }, { "title": "Bulletin", @@ -605,20 +663,8 @@ "lang": "en", "imgUrl": "http://books.google.com/books/content?id=rypRAQAAIAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Geology" - }, - { - "title": "Mohammad Amien Rais", - "isbn": "UOM:39015061569961", - "author": "Zaim Uchrowi", - "synopsis": "Biography of Mohammad Amien Rais, an Indonesian Muslim political leader.", - "pageCount": 400, - "stock": 2, - "publishedDate": "2004", - "lang": "id", - "imgUrl": "http://books.google.com/books/content?id=U_1wAAAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", - "status": "available", - "category": "Indonesia" + "category": "Geology", + "pricePerWeek": 4426 }, { "title": "Gian Carlo Menotti", @@ -632,7 +678,8 @@ "lang": "en", "imgUrl": "http://books.google.com/books/content?id=iknEEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Music" + "category": "Music", + "pricePerWeek": 865 }, { "title": "Linux Device Drivers", @@ -646,19 +693,8 @@ "lang": "en", "imgUrl": "http://books.google.com/books/content?id=MTibAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" - }, - { - "title": "Allgemeines Künstlerlexikon Bio-bibliographischer Index A-Z", - "isbn": "UCSC:32106020097306", - "author": "-", - "pageCount": 904, - "stock": 4, - "publishedDate": "1999", - "lang": "en", - "imgUrl": "http://books.google.com/books/content?id=U8kiAQAAIAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", - "status": "available", - "category": "Allgemeines Künstlerlexikon" + "category": "Computers", + "pricePerWeek": 4646 }, { "title": "Bioethanol Production from Food Crops", @@ -672,7 +708,8 @@ "lang": "en", "imgUrl": "http://books.google.com/books/content?id=sm9qDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Technology & Engineering" + "category": "Technology & Engineering", + "pricePerWeek": 1656 }, { "title": "Proceedings of the 15th International Symposium on Bioluminescence and Chemiluminescence", @@ -680,13 +717,27 @@ "author": "Xun Shen, Xiao-Lin Yang, Xin-Rong Zhang", "synopsis": "In the last decade, great advances have been made in fundamental research and in the applications of bioluminescence and chemiluminescence. These techniques have become vital tools for laboratory analysis. Bioluminescence imaging has emerged as a powerful new optical imaging technique, offering real-time monitoring of spatial and temporal progression of biological processes in living animals. Bioluminescence resonance energy transfer (BRET) methodology has also emerged as a powerful technique for the study of proteinprotein interactions. Luciferase reporter gene technology facilitates monitoring of gene expression and is used to probe molecular mechanisms in the regulation of gene expression. Chemiluminescence detection and analysis have also found diverse applications in life science research; for example, chemiluminescent labels and substrates are now widely used in immunoassay and nucleic acid probe-based assays. The latest advances in this exciting field, from fundamental research to cutting-edge applications, are explored in this most recent volume of the biannual symposium series, the Proceedings of the 15th International Symposium on Bioluminescence and Chemiluminescence. The volume highlights advances in fundamental knowledge of luciferase-based bioluminescence, photoprotein-based bioluminescence, fundamental aspects and applications of chemiluminescence, luminescence imaging, fluorescence quantum dots and other inorganic fluorescent materials, phosphorescence and ultraweak luminescence, and instrumentation for measurement and imaging of luminescence.", "pageCount": 504, - "stock": 2, + "stock": 3, "publisher": "World Scientific", "publishedDate": "2008", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=47tpDQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Science" + "category": "Science", + "pricePerWeek": 4563 + }, + { + "title": "Allgemeines Künstlerlexikon Bio-bibliographischer Index A-Z", + "isbn": "UCSC:32106020097306", + "author": "-", + "pageCount": 904, + "stock": 4, + "publishedDate": "1999", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=U8kiAQAAIAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "Allgemeines Künstlerlexikon", + "pricePerWeek": 843 }, { "title": "Healing across Boundaries", @@ -694,13 +745,14 @@ "author": "Makarand R. Paranjape", "synopsis": "This unique volume initiates a dialogue between bio-medicine and alternative therapeutics. Undertaking a multidisciplinary exploration of the science and spirituality of healing and wellness, it offers varied perspectives from doctors, medical researchers, Ayurvedic practitioners, philosophers, psychologists, sociologists, and cultural critics. It expands the horizons of health sciences in engaging with diverse traditions — bio-medicine, Ayurveda, Siddha, and Jaina bio-ethics. The book will interest scholars and researchers in social and community medicine, biological sciences, sociology and social anthropology, as well as cultural studies.", "pageCount": 268, - "stock": 4, + "stock": 2, "publisher": "Routledge", "publishedDate": "2015-08-12", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=zcBcCgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Medical" + "category": "Medical", + "pricePerWeek": 1566 }, { "title": "Aleister Crowley", @@ -708,13 +760,14 @@ "author": "Tobias Churton", "synopsis": "At last, the unexpurgated, true story of the amazing Aleister Crowley—philosopher, poet, artists, writer, magus, explorer, parapsychology—and spy. Packed with fresh research and previously unpublished ‘Crowleyana.’ For 100 years, Aleister Crowley’s true achievements have been suppressed and his true character defaced in a campaign of vilification unparalleled in British history. Until now, Crowley’s life has not been written—it has been written over. Tobias Churton is a world authority on Freemasonry, Rosicrucianism, and Gnosticism. In writing Aleister Crowley, he enjoyed complete access to all Crowley’s restricted papers, unpublished letters and personal diaries kept in a trust at London’s Warburg Institute and in the Ordo Templi Orientis archives. Ninety percent of the authentic material here has never before been published.", "pageCount": 497, - "stock": 3, + "stock": 2, "publisher": "Watkins Media Limited", "publishedDate": "2014-05-20", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=NFjZCwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Biography & Autobiography" + "category": "Biography & Autobiography", + "pricePerWeek": 939 }, { "title": "Microbial Sensing in Fermentation", @@ -722,13 +775,14 @@ "author": "Satinder K. Brar, Ratul K. Das, Saurabh J. Sarma", "synopsis": "A comprehensive review of the fundamental molecular mechanisms in fermentation and explores the microbiology of fermentation technology and industrial applications Microbial Sensing in Fermentation presents the fundamental molecular mechanisms involved in the process of fermentation and explores the applied art of microbiology and fermentation technology. The text contains descriptions regarding the extraordinary sensing ability of microorganisms towards small physicochemical changes in their surroundings. The contributors — noted experts in the field — cover a wide range of topics such as microbial metabolism and production (fungi, bacteria, yeast etc); refined and non-refined carbon sources; bioprocessing; microbial synthesis, responses and performance; and biochemical, molecular and extra/intracellular controlling. This resource contains a compilation of literature on biochemical and cellular level mechanisms for microbial controlled production and includes the most significant recent advances in industrial fermentation. The text offers a balanced approach between theory and practical application, and helps readers gain a clear understanding of microbial physiological adaptation during fermentation and its cumulative effect on productivity. This important book: Presents the fundamental molecular mechanisms involved in microbial sensing in relation to fermentation technology Includes information on the significant recent advances in industrial fermentation Contains contributions from a panel of highly-respected experts in their respective fields Offers a resource that will be essential reading for scientists, professionals and researchers from academia and industry with an interest in the biochemistry and microbiology of fermentation technology Written for researchers, graduate and undergraduate students from diverse backgrounds, such as biochemistry and applied microbiology, Microbial Sensing in Fermentation offers a review of the fundamental molecular mechanisms involved in the process of fermentation.", "pageCount": 344, - "stock": 1, + "stock": 4, "publisher": "John Wiley & Sons", "publishedDate": "2018-10-08", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=v3JyDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Science" + "category": "Science", + "pricePerWeek": 1803 }, { "title": "Apache Spark Graph Processing", @@ -736,13 +790,14 @@ "author": "Rindra Ramamonjison", "synopsis": "Build, process and analyze large-scale graph data effectively with Spark About This Book Find solutions for every stage of data processing from loading and transforming graph data to Improve the scalability of your graphs with a variety of real-world applications with complete Scala code. A concise guide to processing large-scale networks with Apache Spark. Who This Book Is For This book is for data scientists and big data developers who want to learn the processing and analyzing graph datasets at scale. Basic programming experience with Scala is assumed. Basic knowledge of Spark is assumed. What You Will Learn Write, build and deploy Spark applications with the Scala Build Tool. Build and analyze large-scale network datasets Analyze and transform graphs using RDD and graph-specific operations Implement new custom graph operations tailored to specific needs. Develop iterative and efficient graph algorithms using message aggregation and Pregel abstraction Extract subgraphs and use it to discover common clusters Analyze graph data and solve various data science problems using real-world datasets. In Detail Apache Spark is the next standard of open-source cluster-computing engine for processing big data. Many practical computing problems concern large graphs, like the Web graph and various social networks. The scale of these graphs - in some cases billions of vertices, trillions of edges - poses challenges to their efficient processing. Apache Spark GraphX API combines the advantages of both data-parallel and graph-parallel systems by efficiently expressing graph computation within the Spark data-parallel framework. This book will teach the user to do graphical programming in Apache Spark, apart from an explanation of the entire process of graphical data analysis. You will journey through the creation of graphs, its uses, its exploration and analysis and finally will also cover the conversion of graph elements into graph structures. This book begins with an introduction of the Spark system, its libraries and the Scala Build Tool. Using a hands-on approach, this book will quickly teach you how to install and leverage Spark interactively on the command line and in a standalone Scala program. Then, it presents all the methods for building Spark graphs using illustrative network datasets. Next, it will walk you through the process of exploring, visualizing and analyzing different network characteristics. This book will also teach you how to transform raw datasets into a usable form. In addition, you will learn powerful operations that can be used to transform graph elements and graph structures. Furthermore, this book also teaches how to create custom graph operations that are tailored for specific needs with efficiency in mind. The later chapters of this book cover more advanced topics such as clustering graphs, implementing graph-parallel iterative algorithms and learning methods from graph data. Style and approach A step-by-step guide that will walk you through the key ideas and techniques for processing big graph data at scale, with practical examples that will ensure an overall understanding of the concepts of Spark.", "pageCount": 148, - "stock": 5, + "stock": 3, "publisher": "Packt Publishing Ltd", "publishedDate": "2015-09-10", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=cgSKCgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 1393 }, { "title": "p-Adic Valued Distributions in Mathematical Physics", @@ -750,38 +805,27 @@ "author": "Andrei Y. Khrennikov", "synopsis": "Numbers ... , natural, rational, real, complex, p-adic .... What do you know about p-adic numbers? Probably, you have never used any p-adic (nonrational) number before now. I was in the same situation few years ago. p-adic numbers were considered as an exotic part of pure mathematics without any application. I have also used only real and complex numbers in my investigations in functional analysis and its applications to the quantum field theory and I was sure that these number fields can be a basis of every physical model generated by nature. But recently new models of the quantum physics were proposed on the basis of p-adic numbers field Qp. What are p-adic numbers, p-adic analysis, p-adic physics, p-adic probability? p-adic numbers were introduced by K. Hensel (1904) in connection with problems of the pure theory of numbers. The construction of Qp is very similar to the construction of (p is a fixed prime number, p = 2,3,5, ... ,127, ... ). Both these number fields are completions of the field of rational numbers Q. But another valuation 1 . Ip is introduced on Q instead of the usual real valuation 1 . I· We get an infinite sequence of non isomorphic completions of Q : Q2, Q3, ... , Q127, ... , IR = Qoo· These fields are the only possibilities to com plete Q according to the famous theorem of Ostrowsky.", "pageCount": 264, - "stock": 4, + "stock": 2, "publisher": "Springer Science & Business Media", "publishedDate": "2013-03-09", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=JxYaCQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Science" + "category": "Science", + "pricePerWeek": 1101 }, { "title": "Menteri Pertanian: Bicara Flu Burung (Bungaran Saragih, Anton Apriyantono)", "isbn": "9786233440561", "author": "Pusat Data Dan Analisa Tempo", "synopsis": "Menteri Pertanian: Bicara Flu Burung (Bungaran Saragih, Anton Apriyantono)", - "stock": 4, + "stock": 1, "publisher": "Tempo Publishing", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=_EZSEAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "-" - }, - { - "title": "Billy the Kid, a Bio-bibliography", - "isbn": "UOM:39015011373282", - "author": "Jon Tuska", - "pageCount": 264, - "stock": 3, - "publisher": "Greenwood", - "publishedDate": "1983", - "lang": "en", - "imgUrl": "http://books.google.com/books/content?id=6op5AAAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", - "status": "available", - "category": "COLLECTIVE BIOGRAPHY" + "category": "-", + "pricePerWeek": 3090 }, { "title": "Mechanics of Bio-Sediment Transport", @@ -789,25 +833,27 @@ "author": "Hongwei Fang, Lei Huang, Huiming Zhao, Wei Cheng, Yishan Chen, Mehdi Fazeli, Qianqian Shang", "synopsis": "The main focus of this book is the transport mechanics of sediment particles coated with microbial biofilm, which is called bio-sediment. The book also addresses the question of how to measure and simulate the considerable variation in the properties of natural sediment associated with microbial biofilm, ranging from the micro-scale surface morphology to the macro-scale sediment transport. Nowadays most studies to elucidate the mechanisms of sediment transport have concentrated on physical-chemical sediment properties, little work explicitly coupled sediment dynamics and the environmental effects under the influence of micro-ecosystem, thus leaving a serious gap in water and sediment sciences as well as water ecological research. With respect to physical-chemical sediment properties, this book has been undertaken to evaluate and quantify the effect of biological factors - biofilm on sediment transport mechanics. The chapters cover topics including development of bio-sediment and its properties; model of biofilm growth on sediment substratum; bedform and flow resistance of bio-sediment bed; incipient velocity and settling velocity of bio-sediment; bedload and suspended load transport for bio-sediment; numerical simulation of bio-sediment transport. Besides, the measurement technology, analysis method and expression approach introduced in this book combine the characteristics of hydraulic, environmental and microbial research, having more immediate innovation. This book will be of interest to researchers, managers, practitioners, policy and decision makers, international institutions, governmental and non-governmental organizations, educators, as well as graduate and undergraduate students in the field of hydraulics and river dynamics. It will help to understand the relevance of sediment transport and biofilm growth under the role of aqueous micro-ecosystem, to introduce better tools for the simulation and prediction of bio-sediment transport, and to provide a scientific basis and application foundation for the research of interaction between sediment particles and ecological and environmental factors.", "pageCount": 412, - "stock": 2, + "stock": 3, "publisher": "Springer Nature", "publishedDate": "2020-04-07", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=597bDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Technology & Engineering" + "category": "Technology & Engineering", + "pricePerWeek": 2104 }, { "title": "Blue Book of the State of Illinois", "isbn": "SRLF:AA0008066094", "author": "-", "pageCount": 596, - "stock": 3, + "stock": 4, "publishedDate": "1989", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=GLxWTomlm1oC&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Illinois" + "category": "Illinois", + "pricePerWeek": 1204 }, { "title": "Quantum Bio-Informatics II", @@ -815,25 +861,41 @@ "author": "L. Accardi", "synopsis": "The purpose of this proceedings volume is to look for interdisciplinary bridges in mathematics, physics, information and life sciences, in particular, research for new paradigms for information and life sciences on the basis of quantum theory. The main areas in this volume are all related to one of the following subjects: (1) mathematical foundation of quantum mechanics, (2) quantum information, (3) quantum algorithm and computation, (4) quantum communication, (5) white noise analysis and quantum dynamics, (6) chaos dynamics and adaptive dynamics, (7) experimental studies of quantum computer, (8) bio-informatics and (9) genome analysis.", "pageCount": 357, - "stock": 4, + "stock": 3, "publisher": "World Scientific", "publishedDate": "2009-02-12", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=3GxkDQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Computers" + "category": "Computers", + "pricePerWeek": 393 + }, + { + "title": "Billy the Kid, a Bio-bibliography", + "isbn": "UOM:39015011373282", + "author": "Jon Tuska", + "pageCount": 264, + "stock": 3, + "publisher": "Greenwood", + "publishedDate": "1983", + "lang": "en", + "imgUrl": "http://books.google.com/books/content?id=6op5AAAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", + "status": "available", + "category": "COLLECTIVE BIOGRAPHY", + "pricePerWeek": 2109 }, { "title": "Guide to Microforms in Print", "isbn": "CORNELL:31924069121717", "author": "-", "pageCount": 164, - "stock": 1, + "stock": 3, "publishedDate": "1995", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=01laAAAAYAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Microforms" + "category": "Microforms", + "pricePerWeek": 707 }, { "title": "Energy Technology 2019", @@ -841,13 +903,14 @@ "author": "Tao Wang, Xiaobo Chen, Donna Post Guillen, Lei Zhang, Ziqi Sun, Cong Wang, Nawshad Haque, John A. Howarter, Neale R Neelameggham, Shadia Ikhmayies, York R. Smith, L Tafaghodi, Amit Pandey", "synopsis": "This collection addresses the need for sustainable technologies with reduced energy consumption and pollutants and the development and application of alternative sustainable energy to maintain a green environment and energy supply. Contributions focus on energy-efficient technologies including innovative ore beneficiation, smelting technologies, and recycling and waste heat recovery, as well as emerging novel energy technologies. Papers also cover various technological aspects of sustainable energy ecosystems, processes that improve energy efficiency, reduce thermal emissions, and reduce carbon dioxide and other greenhouse emissions. Papers from the following symposia are presented in the book: Energy Technologies and Carbon Dioxide Management Solar Cell Silicon Advanced Materials for Energy Conversion and Storage", "pageCount": 308, - "stock": 1, + "stock": 3, "publisher": "Springer", "publishedDate": "2019-02-09", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=IUmHDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Technology & Engineering" + "category": "Technology & Engineering", + "pricePerWeek": 8 }, { "title": "How to Write a Professional Bio: For Authors, Speakers, and Entrepreneurs", @@ -861,7 +924,8 @@ "lang": "en", "imgUrl": "http://books.google.com/books/content?id=ZAVAzQEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Business & Economics" + "category": "Business & Economics", + "pricePerWeek": 3087 }, { "title": "Decision-Making for Biomass-Based Production Chains", @@ -869,13 +933,14 @@ "author": "Sebnem Yilmaz Balaman", "synopsis": "Decision-Making for Biomass-Based Production Chains: The Basic Concepts and Medothologies presents a comprehensive study of key-issues surrounding the integration of strategic, tactical and operational decision levels for supply chains in the biomass, biofuels and biorefining sectors. Comprehensive sections cover biomass resources, harvesting, collection, storage and distribution systems, along with the necessary technical and technological background of production systems. In addition, the basics of decision-making, problems and decision levels encountered in design, management and operation phases are covered. Case studies are supplied in each chapter, along with a discussion and comparative analysis of topics. The book presents a clear vision of advances in the field. Graduate students and those starting in this line of research will also find the necessary information on how to model this kind of complex system. Finally, this comprehensive resource can be used as a guide for non-expert industry decision-makers and government policymakers who need a thorough overview on the industry. Examines analytic methodologies for complex decision-making when designing, deploying and managing biomass and bio-based products supply chains Includes real-life examples of main sustainability indicators, standards and certification schemes from the European Union, United States and worldwide Explores the progress of decision-making procedures to provide a detailed perspective for effective selection of the most reliable solutions for each kind of problem Provides detailed, in-depth analyses of various models and frameworks for their implementation, challenges and solutions Presents multi-criteria and multi-objective decision-making and modeling approaches, including mathematical modeling, simulation-based modeling, and artificial intelligence-based modeling", "pageCount": 258, - "stock": 3, + "stock": 2, "publisher": "Academic Press", "publishedDate": "2018-10-02", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=NxlxDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Science" + "category": "Science", + "pricePerWeek": 605 }, { "title": "IBN", @@ -887,7 +952,8 @@ "lang": "un", "imgUrl": "http://books.google.com/books/content?id=Zb5rhbm7qUsC&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Biography" + "category": "Biography", + "pricePerWeek": 4423 }, { "title": "Natural Fiber-Reinforced Biodegradable and Bioresorbable Polymer Composites", @@ -895,13 +961,14 @@ "author": "Alan Kin-tak Lau, Ada Pui Yan Hung", "synopsis": "Natural Fiber-Reinforced Biodegradable and Bioresorbable Polymer Composites focuses on key areas of fundamental research and applications of biocomposites. Several key elements that affect the usage of these composites in real-life applications are discussed. There will be a comprehensive review on the different kinds of biocomposites at the beginning of the book, then the different types of natural fibers, bio-polymers, and green nanoparticle biocomposites are discussed as well as their potential for future development and use in engineering biomedical and domestic products. Recently mankind has realized that unless the environment is protected, he himself will be threatened by the over consumption of natural resources as well as a substantial reduction in the amount of fresh air produced in the world. Conservation of forests and the optimal utilization of agricultural and other renewable resources like solar, wind, and tidal energy, have become important topics worldwide. With such concern, the use of renewable resources—such as plant and animal-based, fiber-reinforced polymeric composites—are now becoming an important design criterion for designing and manufacturing components for a broad range of different industrial products. Research on biodegradable polymeric composites can contribute, to some extent, to a much greener and safer environment. For example, in the biomedical and bioengineering fields, the use of natural fiber mixed with biodegradable and bioresorbable polymers can produce joint and bone fixtures to alleviate pain in patients. Includes comprehensive information about the sources, properties, and biodegradability of natural fibers Discusses failure mechanisms and modeling of natural fibers composites Analyzes the effectiveness of using natural materials for enhancing mechanical, thermal, and biodegradable properties", "pageCount": 208, - "stock": 1, + "stock": 3, "publisher": "Woodhead Publishing", "publishedDate": "2017-02-28", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=YABQCwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Technology & Engineering" + "category": "Technology & Engineering", + "pricePerWeek": 1126 }, { "title": "Spectroscopy of Solid-State Laser-Type Materials", @@ -915,19 +982,21 @@ "lang": "en", "imgUrl": "http://books.google.com/books/content?id=-jf2BwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Science" + "category": "Science", + "pricePerWeek": 1098 }, { "title": "The Bookseller and the Stationery Trades' Journal", "isbn": "PRNC:32101065564401", "author": "-", "pageCount": 1644, - "stock": 4, + "stock": 1, "publishedDate": "1923", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=vWhVAAAAYAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Bibliography" + "category": "Bibliography", + "pricePerWeek": 2239 }, { "title": "Advanced Materials", @@ -935,13 +1004,14 @@ "author": "Ivan A. Parinov, Shun-Hsyung Chang, Vijay K. Gupta", "synopsis": "This book presents selected peer-reviewed contributions from the 2017 International Conference on “Physics and Mechanics of New Materials and Their Applications”, PHENMA 2017 (Jabalpur, India, 14–16 October, 2017), which is devoted to processing techniques, physics, mechanics, and applications of advanced materials. The book focuses on a wide spectrum of nanostructures, ferroelectric crystals, materials and composites as well as promising materials with special properties. It presents nanotechnology approaches, modern environmentally friendly piezoelectric and ferromagnetic techniques and physical and mechanical studies of the structural and physical–mechanical properties of materials. Various original mathematical and numerical methods are applied to the solution of different technological, mechanical and physical problems that are interesting from theoretical, modeling and experimental points of view. Further, the book highlights novel devices with high accuracy, longevity and extended capabilities to operate under wide temperature and pressure ranges and aggressive media, which show improved characteristics, thanks to the developed materials and composites, opening new possibilities for different physico-mechanical processes and phenomena.", "pageCount": 640, - "stock": 1, + "stock": 4, "publisher": "Springer", "publishedDate": "2018-05-12", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=LZZaDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Technology & Engineering" + "category": "Technology & Engineering", + "pricePerWeek": 3777 }, { "title": "The World of Organic Agriculture", @@ -949,37 +1019,40 @@ "author": "Minou Yussefi-Menzler", "synopsis": "The new edition of this annual publication (previously published solely by IFOAM and FiBL) documents recent developments in global organic agriculture. It includes contributions from representatives of the organic sector from throughout the world and provides comprehensive organic farming statistics that cover surface area under organic management, numbers of farms and specific information about commodities and land use in organic systems. The book also contains information on the global market of the burgeoning organic sector, the latest developments in organic certification, standards and regulations, and insights into current status and emerging trends for organic agriculture by continent from the worlds foremost experts. For this edition, all statistical data and regional review chapters have been thoroughly updated. Completely new chapters on organic agriculture in the Pacific, on the International Task Force on Harmonization and Equivalence in Organic Agriculture and on organic aquaculture have been added. Published with IFOAM and FiBL", "pageCount": 268, - "stock": 4, + "stock": 3, "publisher": "Routledge", "publishedDate": "2010-09-23", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=laUeBAAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Social Science" + "category": "Social Science", + "pricePerWeek": 4189 }, { "title": "Puteri Harum dan kaisar", "isbn": "UOM:39015062769032", "author": "Hua Wen", "pageCount": 142, - "stock": 4, + "stock": 1, "publishedDate": "1961", "lang": "id", "imgUrl": "http://books.google.com/books/content?id=N6PhdL0GmBcC&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "-" + "category": "-", + "pricePerWeek": 1060 }, { "title": "Bio-Japan", "isbn": "WISC:89031126410", "author": "John Elkington", "pageCount": 124, - "stock": 2, + "stock": 3, "publishedDate": "1985", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=dbjxAAAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Biotechnology" + "category": "Biotechnology", + "pricePerWeek": 3334 }, { "title": "Dictionary of Early American Philosophers", @@ -987,25 +1060,27 @@ "author": "John R. Shook", "synopsis": "The Dictionary of Early American Philosophers, which contains over 400 entries by nearly 300 authors, provides an account of philosophical thought in the United States and Canada between 1600 and 1860. The label of \"philosopher\" has been broadly applied in this Dictionary to intellectuals who have made philosophical contributions regardless of academic career or professional title. Most figures were not academic philosophers, as few such positions existed then, but they did work on philosophical issues and explored philosophical questions involved in such fields as pedagogy, rhetoric, the arts, history, politics, economics, sociology, psychology, medicine, anthropology, religion, metaphysics, and the natural sciences. Each entry begins with biographical and career information, and continues with a discussion of the subject's writings, teaching, and thought. A cross-referencing system refers the reader to other entries. The concluding bibliography lists significant publications by the subject, posthumous editions and collected works, and further reading about the subject.", "pageCount": 1288, - "stock": 1, + "stock": 2, "publisher": "Bloomsbury Publishing USA", "publishedDate": "2012-04-05", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=oOqoAwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Philosophy" + "category": "Philosophy", + "pricePerWeek": 4763 }, { "title": "Proceedings of the MRS International Meeting on Advanced Materials: Superconductivity", "isbn": "PSU:000023056619", "author": "Masao Dōyama", "pageCount": 1072, - "stock": 4, + "stock": 2, "publishedDate": "1989", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=OyRZAAAAYAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Materials" + "category": "Materials", + "pricePerWeek": 3033 }, { "title": "Mathematical Methods in Chemical and Biological Engineering", @@ -1013,13 +1088,14 @@ "author": "Binay Kanti Dutta", "synopsis": "Mathematical Methods in Chemical and Biological Engineering describes basic to moderately advanced mathematical techniques useful for shaping the model-based analysis of chemical and biological engineering systems. Covering an ideal balance of basic mathematical principles and applications to physico-chemical problems, this book presents examples drawn from recent scientific and technical literature on chemical engineering, biological and biomedical engineering, food processing, and a variety of diffusional problems to demonstrate the real-world value of the mathematical methods. Emphasis is placed on the background and physical understanding of the problems to prepare students for future challenging and innovative applications.", "pageCount": 694, - "stock": 4, + "stock": 5, "publisher": "CRC Press", "publishedDate": "2016-11-03", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=z2kNDgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Mathematics" + "category": "Mathematics", + "pricePerWeek": 2845 }, { "title": "Developing the Global Bioeconomy", @@ -1027,37 +1103,40 @@ "author": "Patrick Lamers, Erin Searcy, J. Richard Hess, Heinz Stichnothe", "synopsis": "Developing the Global Bioeconomy: Technical, Market, and Environmental Lessons from Bioenergy brings together expertise from three IEA-Bioenergy subtasks on pyrolysis, international trade, and biorefineries to review the bioenergy sector and draw useful lessons for the full deployment of the bioeconomy. Despite the vast amount of politically driven strategies, there is little understanding on how current markets will transition towards a global bioeconomy. The question is not only how the bioeconomy can be developed, but also how it can be developed sustainably in terms of economic and environmental concerns. To answer this question, this book’s expert chapter authors seek to identify the types of biorefineries that are expected to be implemented and the types of feedstock that may be used. They also provide historical analysis of the developments of biopower and biofuel markets, integration opportunities into existing supply chains, and the conditions that would need to be created and enhanced to achieve a global biomass trade system that could support a global bioeconomy. As expectations that a future bioeconomy will rely on a series of tradable commodities, this book provides a central accounting of the state of the discussion in a multidisciplinary approach that is ideal for research and academic experts, and analysts in all areas of the bioenergy, biofuels, and bioeconomy sectors, as well as those interested in energy policy and economics. Examines the lessons learned by the bioenergy industry and how they can be applied to the full development of the bioeconomy Explores different transition strategies and how the current fossil based and future bio-based economy are intertwined Reviews the status of current biomass conversion pathways Presents an historical analysis of the developments of biopower and biofuel markets, integration opportunities into existing supply chains, and the conditions that would need to be created and enhanced to achieve a global biomass trade system", "pageCount": 220, - "stock": 2, + "stock": 1, "publisher": "Academic Press", "publishedDate": "2016-05-02", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=gTqOCgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Technology & Engineering" + "category": "Technology & Engineering", + "pricePerWeek": 4654 }, { "title": "Official Journal of the European Communities", "isbn": "UOM:39015074622120", "author": "-", "pageCount": 1124, - "stock": 4, + "stock": 3, "publishedDate": "1980-04", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=E2kNAQAAMAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "European federation" + "category": "European federation", + "pricePerWeek": 519 }, { "title": "JARQ.", "isbn": "WISC:89098849797", "author": "-", "pageCount": 598, - "stock": 2, + "stock": 1, "publishedDate": "2001", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=siXvBXvdy4oC&printsec=frontcover&img=1&zoom=1&source=gbs_api", "status": "available", - "category": "Agriculture" + "category": "Agriculture", + "pricePerWeek": 320 }, { "title": "Environmental Applications of Remote Sensing", @@ -1065,13 +1144,14 @@ "author": "Maged Marghany", "synopsis": "Nowadays, the innovation in space technologies creates a new trend for the Earth observation and monitoring from space. This book contains high quality and compressive work on both microwave and optical remote sensing applications. This book is divided into five sections: (i) remote sensing for biomass estimation, (ii) remote sensing-based glacier studies, (iii) remote sensing for coastal and ocean applications, (iv) sewage leaks and environment disasters, and (v) remote sensing image processing. Each chapter offers an opportunity to expand the knowledge about various remote sensing techniques and persuade researchers to deliver new research novelty for environment studies.", "pageCount": 420, - "stock": 1, + "stock": 3, "publisher": "BoD – Books on Demand", "publishedDate": "2016-06-08", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=Wm-QDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Science" + "category": "Science", + "pricePerWeek": 518 }, { "title": "Biomass Combustion Science, Technology and Engineering", @@ -1079,12 +1159,13 @@ "author": "Lasse Rosendahl", "synopsis": "The utilisation of biomass is increasingly important for low- or zero-carbon power generation. Developments in conventional power plant fuel flexibility allow for both direct biomass combustion and co-firing with fossil fuels, while the integration of advanced technologies facilitates conversion of a wide range of biomass feedstocks into more readily combustible fuel. Biomass combustion science, technology and engineering reviews the science and technology of biomass combustion, conversion and utilisation. Part one provides an introduction to biomass supply chains and feedstocks, and outlines the principles of biomass combustion for power generation. Chapters also describe the categorisation and preparation of biomass feedstocks for combustion and gasification. Part two goes on to explore biomass combustion and co-firing, including direct combustion of biomass, biomass co-firing and gasification, fast pyrolysis of biomass for the production of liquids and intermediate pyrolysis technologies. Largescale biomass combustion and biorefineries are then the focus of part three. Following an overview of large-scale biomass combustion plants, key engineering issues and plant operation are discussed, before the book concludes with a chapter looking at the role of biorefineries in increasing the value of the end-products of biomass conversion. With its distinguished editor and international team of expert contributors, Biomass combustion science, technology and engineering provides a clear overview of this important area for all power plant operators, industrial engineers, biomass researchers, process chemists and academics working in this field. Reviews the science and technology of biomass combustion, conversion and utilisation Provides an introduction to biomass supply chains and feedstocks and outlines the principles of biomass combustion for power generation Describes the categorisation and preparation of biomass feedstocks for combustion and gasification", "pageCount": 320, - "stock": 5, + "stock": 3, "publisher": "Elsevier", "publishedDate": "2013-04-04", "lang": "en", "imgUrl": "http://books.google.com/books/content?id=MVtEAgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api", "status": "available", - "category": "Technology & Engineering" + "category": "Technology & Engineering", + "pricePerWeek": 1933 } ] \ No newline at end of file diff --git a/server/jsons/fetchDatas.js b/server/jsons/fetchDatas.js index f074422..fc484c3 100644 --- a/server/jsons/fetchDatas.js +++ b/server/jsons/fetchDatas.js @@ -1,4 +1,4 @@ -require('dotenv').config(); +// require('dotenv').config(); const axios = require('axios'); const fs = require('fs'); @@ -32,6 +32,7 @@ async function fetchGoogleBooks() { imgUrl: imageLinks.thumbnail, status: 'available', category: categories ? categories.join(', ') : '-', + pricePerWeek: Math.ceil(Math.random() * 1000 * 5) }; }); }; @@ -52,5 +53,5 @@ async function fetchGoogleBooks() { } -fetchGoogleBooks(); +// fetchGoogleBooks(); // module.exports = fetchGoogleBooks; \ No newline at end of file diff --git a/server/migrations/20231113173504-create-book.js b/server/migrations/20231113173504-create-book.js index d94119e..a608f22 100644 --- a/server/migrations/20231113173504-create-book.js +++ b/server/migrations/20231113173504-create-book.js @@ -33,7 +33,7 @@ module.exports = { type: Sequelize.STRING }, publishedDate: { - type: Sequelize.DATE + type: Sequelize.STRING }, lang: { type: Sequelize.STRING @@ -42,11 +42,16 @@ module.exports = { type: Sequelize.STRING }, status: { - type: Sequelize.STRING + type: Sequelize.STRING, + allowNull: false }, category: { type: Sequelize.STRING }, + pricePerWeek: { + type: Sequelize.INTEGER, + allowNull: false + }, createdAt: { allowNull: false, type: Sequelize.DATE diff --git a/server/models/book.js b/server/models/book.js index 0623086..9c5ddd4 100644 --- a/server/models/book.js +++ b/server/models/book.js @@ -11,21 +11,69 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Book.hasMany(models.History, { + foreignKey: 'bookId' + }); } } Book.init({ - title: DataTypes.STRING, + title: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + msg: `Title is required!` + }, + notNull: { + msg: `Title is required!` + } + } + }, isbn: DataTypes.STRING, author: DataTypes.STRING, synopsis: DataTypes.TEXT, pageCount: DataTypes.INTEGER, - stock: DataTypes.INTEGER, + stock: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notEmpty: { + msg: `Stock is required!` + }, + notNull: { + msg: `Stock is required!` + } + } + }, publisher: DataTypes.STRING, - publishedDate: DataTypes.DATE, + publishedDate: DataTypes.STRING, lang: DataTypes.STRING, imgUrl: DataTypes.STRING, - status: DataTypes.STRING, - category: DataTypes.STRING + status: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + msg: `Status is required!` + }, + notNull: { + msg: `Status is required!` + } + } + }, + category: DataTypes.STRING, + pricePerWeek: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notEmpty: { + msg: `Price per week is required!` + }, + notNull: { + msg: `Price per week is required!` + } + } + } }, { sequelize, modelName: 'Book', diff --git a/server/models/history.js b/server/models/history.js index b5dc146..cdbeeeb 100644 --- a/server/models/history.js +++ b/server/models/history.js @@ -11,13 +11,59 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + History.belongsTo(models.User); + History.belongsTo(models.Book); } } History.init({ - bookId: DataTypes.INTEGER, - userId: DataTypes.INTEGER, - deadline: DataTypes.DATE, - status: DataTypes.STRING + bookId: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notEmpty: { + msg: `Book is required!` + }, + notNull: { + msg: `Book is required!` + } + } + }, + userId: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notEmpty: { + msg: `User is required!` + }, + notNull: { + msg: `User is required!` + } + } + }, + deadline: { + type: DataTypes.DATE, + allowNull: false, + validate: { + notEmpty: { + msg: `Deadline is required!` + }, + notNull: { + msg: `Deadline is required!` + } + } + }, + status: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + msg: `Status is required!` + }, + notNull: { + msg: `Status is required!` + } + } + }, }, { sequelize, modelName: 'History', diff --git a/server/models/user.js b/server/models/user.js index 826c9ed..8ee728f 100644 --- a/server/models/user.js +++ b/server/models/user.js @@ -11,6 +11,12 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + User.hasOne(models.UserDetail, { + foreignKey: 'userId' + }); + User.hasMany(models.History, { + foreignKey: 'userId' + }); } } User.init({ diff --git a/server/models/userdetail.js b/server/models/userdetail.js index b6555b4..ec90689 100644 --- a/server/models/userdetail.js +++ b/server/models/userdetail.js @@ -11,6 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + UserDetail.belongsTo(models.User); } } UserDetail.init({ diff --git a/server/seeders/20231114013237-books-seeder.js b/server/seeders/20231114013237-books-seeder.js new file mode 100644 index 0000000..358f249 --- /dev/null +++ b/server/seeders/20231114013237-books-seeder.js @@ -0,0 +1,33 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + let booksJson = require('../jsons/books.json'); + booksJson.map(book => { + book.createdAt = book.updatedAt = new Date(); + return book; + }); + + await queryInterface.bulkInsert('Books', booksJson); + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + }, + + async down (queryInterface, Sequelize) { + await queryInterface.bulkDelete('Books', null, {}); + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + } +}; From 8f35fad479d2f86943bd1117367518da264c235d Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Tue, 14 Nov 2023 11:50:46 +0700 Subject: [PATCH 07/27] Add coloumn loginType for Google Sign In OAuth --- server/helpers/bcryptjs.js | 14 +++ server/helpers/jwt.js | 14 +++ server/middlewares/authentication.js | 28 ++++++ server/middlewares/authorization.js | 18 ++++ server/middlewares/errorHandler.js | 61 ++++++++++++ .../migrations/20231113173059-create-user.js | 4 + server/models/user.js | 65 ++++++++++++- server/models/userdetail.js | 52 +++++++++- server/package-lock.json | 94 +++++++++++++++++++ server/package.json | 1 + 10 files changed, 343 insertions(+), 8 deletions(-) create mode 100644 server/helpers/bcryptjs.js create mode 100644 server/helpers/jwt.js create mode 100644 server/middlewares/authentication.js create mode 100644 server/middlewares/authorization.js create mode 100644 server/middlewares/errorHandler.js diff --git a/server/helpers/bcryptjs.js b/server/helpers/bcryptjs.js new file mode 100644 index 0000000..36acdf3 --- /dev/null +++ b/server/helpers/bcryptjs.js @@ -0,0 +1,14 @@ +const bcryptjs = require('bcryptjs'); + +const bcryptHash = (req) => { + const salt = bcryptjs.genSaltSync(16); + const hash = bcryptjs.hashSync(req, salt); + return hash; +} + +const bcryptCompare = (req, hashed) => { + const compare = bcryptjs.compareSync(req, hashed); + return compare; +} + +module.exports = { bcryptHash, bcryptCompare }; \ No newline at end of file diff --git a/server/helpers/jwt.js b/server/helpers/jwt.js new file mode 100644 index 0000000..ce23fa2 --- /dev/null +++ b/server/helpers/jwt.js @@ -0,0 +1,14 @@ +const jwt = require('jsonwebtoken'); +const secretKey = process.env.SECRET_KEY; + +const createToken = (req) => { + const token = jwt.sign(req, secretKey); + return token; +} + +const verifyToken = (req) => { + const decoded = jwt.verify(req, secretKey); + return decoded; +} + +module.exports = { createToken, verifyToken }; \ No newline at end of file diff --git a/server/middlewares/authentication.js b/server/middlewares/authentication.js new file mode 100644 index 0000000..aff4f6b --- /dev/null +++ b/server/middlewares/authentication.js @@ -0,0 +1,28 @@ + +const { verifyToken } = require("../helpers/jwt"); +const { User } = require("../models"); + +const authentication = async (request, response, next) => { + try { + if (!request.headers.authorization) throw ({ name: "Unauthenticated" }); + const token = request.headers.authorization.split(' ').at(-1); + + if (!token) throw ({ name: "Unauthenticated" }); + + const { id } = verifyToken(token); + const user = await User.findByPk(id); + + if (!user) throw ({ name: "Unauthenticated" }); + request.user = { + id: user.id, + email: user.email, + role: user.role + }; + + next(); + } catch (error) { + next(error); + } +} + +module.exports = authentication; \ No newline at end of file diff --git a/server/middlewares/authorization.js b/server/middlewares/authorization.js new file mode 100644 index 0000000..d47fe2a --- /dev/null +++ b/server/middlewares/authorization.js @@ -0,0 +1,18 @@ +const { User, Book } = require("../models"); + +const authorization = { + AdminOnly: async (request, response, next) => { + try { + const user = await User.findByPk(request.user.id); + if (!user) throw ({ name: "Unauthorized" }); + if (user.role !== 'admin') throw ({ name: "Unauthorized" }); + + next(); + } catch (error) { + next(error); + } + }, + +} + +module.exports = authorization; \ No newline at end of file diff --git a/server/middlewares/errorHandler.js b/server/middlewares/errorHandler.js new file mode 100644 index 0000000..275574e --- /dev/null +++ b/server/middlewares/errorHandler.js @@ -0,0 +1,61 @@ +const errorHandler = { + handler : (error, request, response, next) => { + let statusCode, message; + + switch (error.name) { + case 'SequelizeValidationError': + case 'SequelizeUniqueConstraintError': + statusCode = 400; + message = error.errors.map(er => { + return er.message; + }); + break; + + case 'EmptyEmail': + statusCode = 400; + message = `Email must be exist`; + break; + + case 'EmptyPassword': + statusCode = 400; + message = `Password must be exist`; + break; + + case 'Error': + statusCode = 400; + message = `Unsupported ZIP file`; + break; + + case 'NotMatched': + statusCode = 401; + message = `Invalid password/email!`; + break; + + case 'JsonWebTokenError': + case 'Unauthenticated': + statusCode = 401; + message = `Unauthenticated`; + break; + + case 'Unauthorized': + statusCode = 403; + message = `You're not authorized`; + break; + + case 'NotFound': + statusCode = 404; + message = `Not Found`; + break; + + default: + statusCode = 500; + message = `Internal Server Error`; + break; + } + + response.status(statusCode).json({ message }); + } + +} + +module.exports = errorHandler; \ No newline at end of file diff --git a/server/migrations/20231113173059-create-user.js b/server/migrations/20231113173059-create-user.js index fd140e3..59bc419 100644 --- a/server/migrations/20231113173059-create-user.js +++ b/server/migrations/20231113173059-create-user.js @@ -25,6 +25,10 @@ module.exports = { type: Sequelize.STRING, allowNull: false }, + accountType: { + type: Sequelize.STRING, + allowNull: false + }, createdAt: { allowNull: false, type: Sequelize.DATE diff --git a/server/models/user.js b/server/models/user.js index 8ee728f..9bf4de7 100644 --- a/server/models/user.js +++ b/server/models/user.js @@ -2,6 +2,7 @@ const { Model } = require('sequelize'); +const { bcryptHash } = require('../helpers/bcryptjs'); module.exports = (sequelize, DataTypes) => { class User extends Model { /** @@ -20,13 +21,69 @@ module.exports = (sequelize, DataTypes) => { } } User.init({ - username: DataTypes.STRING, - email: DataTypes.STRING, - password: DataTypes.STRING, - role: DataTypes.STRING + username: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + msg: `Username is required!` + }, + notNull: { + msg: `Username is required!` + } + } + }, + email: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + msg: `Email is required!` + }, + notNull: { + msg: `Email is required!` + } + } + }, + password: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + msg: `Password is required!` + }, + notNull: { + msg: `Password is required!` + } + } + }, + role: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + msg: `Role is required!` + }, + notNull: { + msg: `Role is required!` + } + } + }, + accountType: { + type: DataTypes.STRING, + allowNull: false, + validate: { + isIn: [['manual', 'google']], + } + } }, { sequelize, modelName: 'User', }); + + User.beforeCreate((user) => { + user.password = bcryptHash(user.password); + }); + return User; }; \ No newline at end of file diff --git a/server/models/userdetail.js b/server/models/userdetail.js index ec90689..3c7a074 100644 --- a/server/models/userdetail.js +++ b/server/models/userdetail.js @@ -15,10 +15,54 @@ module.exports = (sequelize, DataTypes) => { } } UserDetail.init({ - userId: DataTypes.INTEGER, - name: DataTypes.STRING, - dob: DataTypes.DATE, - inumber: DataTypes.STRING, + userId: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notEmpty: { + msg: `User is required!` + }, + notNull: { + msg: `User is required!` + } + } + }, + name: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + msg: `Name is required!` + }, + notNull: { + msg: `Name is required!` + } + } + }, + dob: { + type: DataTypes.DATE, + allowNull: false, + validate: { + notEmpty: { + msg: `Date of birth is required!` + }, + notNull: { + msg: `Date of birth is required!` + } + } + }, + inumber: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + msg: `Inumber is required!` + }, + notNull: { + msg: `Inumber is required!` + } + } + }, address: DataTypes.TEXT, gender: DataTypes.STRING }, { diff --git a/server/package-lock.json b/server/package-lock.json index 1d0388f..0220fd6 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -13,6 +13,7 @@ "bcryptjs": "^2.4.3", "cors": "^2.8.5", "express": "^4.18.2", + "jsonwebtoken": "^9.0.2", "pg": "^8.11.3", "sequelize": "^6.35.0" }, @@ -1691,6 +1692,11 @@ "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", @@ -2164,6 +2170,14 @@ "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", @@ -3831,6 +3845,51 @@ "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", @@ -3872,6 +3931,41 @@ "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", diff --git a/server/package.json b/server/package.json index 613c9dd..8014068 100644 --- a/server/package.json +++ b/server/package.json @@ -14,6 +14,7 @@ "bcryptjs": "^2.4.3", "cors": "^2.8.5", "express": "^4.18.2", + "jsonwebtoken": "^9.0.2", "pg": "^8.11.3", "sequelize": "^6.35.0" }, From 5c47604bb9a286533d40aad7699a577398ec8f2b Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Tue, 14 Nov 2023 16:19:57 +0700 Subject: [PATCH 08/27] Add CRUD Of User --- server/.env.example | 4 + server/controllers/UserController.js | 96 +++++++++++++++++++ server/middlewares/errorHandler.js | 15 ++- .../migrations/20231113173059-create-user.js | 3 +- .../20231113173602-create-history.js | 10 +- server/models/history.js | 15 +-- server/models/user.js | 36 ++++--- server/models/userdetail.js | 10 ++ 8 files changed, 156 insertions(+), 33 deletions(-) create mode 100644 server/controllers/UserController.js diff --git a/server/.env.example b/server/.env.example index e69de29..c831a5e 100644 --- a/server/.env.example +++ b/server/.env.example @@ -0,0 +1,4 @@ +NODE_ENV= +GOOGLE_BOOKS_API_KEY= +G_CLIENT= +G_SECRET= \ No newline at end of file diff --git a/server/controllers/UserController.js b/server/controllers/UserController.js new file mode 100644 index 0000000..acb9cf6 --- /dev/null +++ b/server/controllers/UserController.js @@ -0,0 +1,96 @@ +const { bcryptCompare } = require("../helpers/bcryptjs"); +const { createToken } = require("../helpers/jwt"); +const { User, UserDetail } = require("../models"); + +class UserController { + static async getAll(request, response) { + try { + const users = await User.findAndCountAll({ + include: { + model: UserDetail + } + }); + + response.status(200).json(users); + } catch (error) { + next(error); + } + } + + static async getById(request, response, next) { + try { + const user = await User.findByPk(request.params.id, { + include: { + model: UserDetail + } + }); + + if (!user) throw ({ name: "NotFound" }); + + response.status(200).json(user); + } catch (error) { + next(error); + } + } + + static async create(request, response, next) { + const { username, email, password, role = 'member', accountType = 'manual', name, dob, address, gender } = request.body; + try { + const user = await User.create({ username, email, password, role, accountType }); + await UserDetail.create({ userId: user.id, name, dob, address, gender }); + response.status(201).json({ id: user.id, email: user.email, role: user.role }); + } catch (error) { + next(error); + } + } + + static async update(request, response, next) { + const { username, email, password, name, dob, address, gender } = request.body; + try { + let user = await User.findByPk(request.params.id, { + include: { + model: UserDetail + } + }); + + await user.update({ username, email, password }); + await user.UserDetail.update({ name, dob, address, gender }); + + response.status(200).json(user); + } catch (error) { + next(error); + } + } + + static async delete(request, response, next) { + try { + let user = await User.findByPk(request.params.id); + + await user.destroy(); + response.status(200).json({ message: `User with id: ${user.id} success to delete` }); + } catch (error) { + next(error); + } + } + + static async login(request, response, next) { + const { username, email, password } = request.body; + try { + if (!username || username === "") throw ({ name: `EmptyUsername` }); + if (!email || email === "") throw ({ name: `EmptyEmail` }); + if (!password || password === "") throw ({ name: `EmptyPassword` }); + + const user = await User.findOne({ where: { email } }); + if (!user || !bcryptCompare(password, user.password)) throw ({ name: "NotMatched" }); + + const token = createToken({ id: user.id }); + response.status(200).json({ access_token: token, email: user.email, role: user.role }); + } catch (error) { + next(error); + } + } + + +} + +module.exports = UserController; \ No newline at end of file diff --git a/server/middlewares/errorHandler.js b/server/middlewares/errorHandler.js index 275574e..4c04676 100644 --- a/server/middlewares/errorHandler.js +++ b/server/middlewares/errorHandler.js @@ -11,24 +11,29 @@ const errorHandler = { }); break; + case 'EmptyUsername': + statusCode = 400; + message = `Username is required`; + break; + case 'EmptyEmail': statusCode = 400; - message = `Email must be exist`; + message = `Email is required`; break; case 'EmptyPassword': statusCode = 400; - message = `Password must be exist`; + message = `Password is required`; break; - case 'Error': + case 'EmptyEmailPassword': statusCode = 400; - message = `Unsupported ZIP file`; + message = `Email/Password is required`; break; case 'NotMatched': statusCode = 401; - message = `Invalid password/email!`; + message = `Invalid Email/Password!`; break; case 'JsonWebTokenError': diff --git a/server/migrations/20231113173059-create-user.js b/server/migrations/20231113173059-create-user.js index 59bc419..9eddb4a 100644 --- a/server/migrations/20231113173059-create-user.js +++ b/server/migrations/20231113173059-create-user.js @@ -15,7 +15,8 @@ module.exports = { }, email: { type: Sequelize.STRING, - allowNull: false + allowNull: false, + unique: true }, password: { type: Sequelize.STRING, diff --git a/server/migrations/20231113173602-create-history.js b/server/migrations/20231113173602-create-history.js index 57a2408..495e973 100644 --- a/server/migrations/20231113173602-create-history.js +++ b/server/migrations/20231113173602-create-history.js @@ -25,8 +25,14 @@ module.exports = { key: 'id' } }, - deadline: { - type: Sequelize.DATE, + qna: { + type: Sequelize.TEXT, + }, + question: { + type: Sequelize.TEXT, + }, + point: { + type: Sequelize.INTEGER, allowNull: false }, status: { diff --git a/server/models/history.js b/server/models/history.js index cdbeeeb..b49130d 100644 --- a/server/models/history.js +++ b/server/models/history.js @@ -40,18 +40,9 @@ module.exports = (sequelize, DataTypes) => { } } }, - deadline: { - type: DataTypes.DATE, - allowNull: false, - validate: { - notEmpty: { - msg: `Deadline is required!` - }, - notNull: { - msg: `Deadline is required!` - } - } - }, + qna : DataTypes.TEXT, + question : DataTypes.TEXT, + point : DataTypes.TEXT, status: { type: DataTypes.STRING, allowNull: false, diff --git a/server/models/user.js b/server/models/user.js index 9bf4de7..8dab47d 100644 --- a/server/models/user.js +++ b/server/models/user.js @@ -13,10 +13,12 @@ module.exports = (sequelize, DataTypes) => { static associate(models) { // define association here User.hasOne(models.UserDetail, { - foreignKey: 'userId' + foreignKey: 'userId', + onDelete: 'CASCADE' }); User.hasMany(models.History, { - foreignKey: 'userId' + foreignKey: 'userId', + onDelete: 'CASCADE' }); } } @@ -36,24 +38,32 @@ module.exports = (sequelize, DataTypes) => { email: { type: DataTypes.STRING, allowNull: false, - validate: { - notEmpty: { - msg: `Email is required!` + unique : true, + validate : { + notNull : { + msg : `Email is required!` }, - notNull: { - msg: `Email is required!` + notEmpty : { + msg : `Email is required!` + }, + isEmail : { + msg : `Must be an email!` } } }, password: { type: DataTypes.STRING, allowNull: false, - validate: { - notEmpty: { - msg: `Password is required!` + validate : { + notNull : { + msg : `Password is required!` }, - notNull: { - msg: `Password is required!` + notEmpty : { + msg : `Password is required!` + }, + len : { + args: [5, Infinity], + msg: "Password must be at least 5 characters!" } } }, @@ -73,7 +83,7 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.STRING, allowNull: false, validate: { - isIn: [['manual', 'google']], + isIn: [['manual', 'github']], } } }, { diff --git a/server/models/userdetail.js b/server/models/userdetail.js index 3c7a074..84d7af4 100644 --- a/server/models/userdetail.js +++ b/server/models/userdetail.js @@ -69,5 +69,15 @@ module.exports = (sequelize, DataTypes) => { sequelize, modelName: 'UserDetail', }); + + UserDetail.beforeCreate((userDetail) => { + let inumber = 'M-'; + inumber += new Date().getFullYear() + `-`; + inumber += userDetail.id + '-'; + userDetail.gender ? inumber += 'F-' : inumber += 'M-'; + inumber += 'IPUSTAKA' + userDetail.inumber = inumber; + }); + return UserDetail; }; \ No newline at end of file From d88aff4111ad68f7b33708ebf7eb96c1bfdbf400 Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Tue, 14 Nov 2023 20:32:58 +0700 Subject: [PATCH 09/27] add create and update for history controller --- server/.env.example | 3 +- server/app.js | 4 +- server/controllers/HistoryController.js | 60 +++++ server/controllers/UserController.js | 8 +- server/helpers/openai.js | 20 ++ .../20231113173218-create-user-detail.js | 3 - .../20231113173602-create-history.js | 1 - server/models/history.js | 17 +- server/models/userdetail.js | 16 +- server/package-lock.json | 209 ++++++++++++++++++ server/package.json | 1 + server/routes/index.js | 3 + server/seeders/20231114093153-user-seeder.js | 52 +++++ 13 files changed, 358 insertions(+), 39 deletions(-) create mode 100644 server/controllers/HistoryController.js create mode 100644 server/helpers/openai.js create mode 100644 server/seeders/20231114093153-user-seeder.js diff --git a/server/.env.example b/server/.env.example index c831a5e..4c55e0f 100644 --- a/server/.env.example +++ b/server/.env.example @@ -1,4 +1,5 @@ NODE_ENV= GOOGLE_BOOKS_API_KEY= G_CLIENT= -G_SECRET= \ No newline at end of file +G_SECRET= +OpenAI_KEY= \ No newline at end of file diff --git a/server/app.js b/server/app.js index 0a0ba51..204197c 100644 --- a/server/app.js +++ b/server/app.js @@ -1,4 +1,4 @@ -if (process.env.NODE_ENV === 'development') { +if (process.env.NODE_ENV !== "production") { require('dotenv').config(); } @@ -8,7 +8,7 @@ const app = express(); app.use(cors()); app.use(express.json()); -app.use(express.urlencoded({extended: true})); +app.use(express.urlencoded({ extended: true })); app.use(require('./routes')); module.exports = app; \ No newline at end of file diff --git a/server/controllers/HistoryController.js b/server/controllers/HistoryController.js new file mode 100644 index 0000000..9b3dfc1 --- /dev/null +++ b/server/controllers/HistoryController.js @@ -0,0 +1,60 @@ +const OpenAI = require('openai'); +const { History } = require('../models'); +const { generateAnsPromt } = require('../helpers/openai'); + +class HistoryController { + static async create(req, res, next) { + try { + const history = await History.create({ userId: req.user.id, status: 'unpaid' }); + const openai = new OpenAI({ + apiKey: process.env.OpenAI_KEY + }); + + const question = `randomize saya 5 pertanyaan yang jawabannya cukup ya atau tidak mengenai topik pemrograman khususnya materi dasar javascript, reactjs, dan express js cukup pertanyaan mudah dan singkat untuk junior programmer atau bahkan orang awam. cukup jawab tanpa deskripsi apa pun cukup dengan format seperti di bawah ini di mana 5 pertanyaan tersebut dalam 1 array! perhatikan dengan benar format di bawah ini! dan jangan berikan respons dalam bentuk list di list + format responsnya harus seperti ini, perhatikan! pertanyaan1;;pertanyaan 2;;pertanyaan3`; + + const { choices } = await openai.chat.completions.create({ + model: 'gpt-3.5-turbo', + messages: [{ "role": "user", "content": question }], + max_tokens: 210 + }); + + let questions = choices[0].message.content; + history.update({ question: questions }); + questions = questions.split(';;'); + res.status(201).json({ messages: `Successfully create history`, data: questions }); + } catch (error) { + console.log(error); + next(error); + } + } + + static async update(req, res, next) { + const { answer, historyId } = req.body + try { + const history = History.findByPk(historyId); + const promt = generateAnsPromt(history.question, answer); + + const openai = new OpenAI({ + apiKey: process.env.OpenAI_KEY + }); + + const { choices } = await openai.chat.completions.create({ + model: 'gpt-3.5-turbo', + messages: [{ "role": "user", "content": promt }], + max_tokens: 210 + }); + + let questions = choices[0].message.content; + history.update({ point: +questions }); + + res.status(200).json({ messages: `Successfully get point`, data: questions }); + } catch (error) { + console.log(error); + next(error); + } + } + +} + +module.exports = HistoryController; \ No newline at end of file diff --git a/server/controllers/UserController.js b/server/controllers/UserController.js index acb9cf6..6b2f31c 100644 --- a/server/controllers/UserController.js +++ b/server/controllers/UserController.js @@ -34,10 +34,10 @@ class UserController { } static async create(request, response, next) { - const { username, email, password, role = 'member', accountType = 'manual', name, dob, address, gender } = request.body; + const { username, email, password, role = 'member', accountType = 'manual', name, address, gender } = request.body; try { const user = await User.create({ username, email, password, role, accountType }); - await UserDetail.create({ userId: user.id, name, dob, address, gender }); + await UserDetail.create({ userId: user.id, name, address, gender }); response.status(201).json({ id: user.id, email: user.email, role: user.role }); } catch (error) { next(error); @@ -45,7 +45,7 @@ class UserController { } static async update(request, response, next) { - const { username, email, password, name, dob, address, gender } = request.body; + const { username, email, password, name, address, gender } = request.body; try { let user = await User.findByPk(request.params.id, { include: { @@ -54,7 +54,7 @@ class UserController { }); await user.update({ username, email, password }); - await user.UserDetail.update({ name, dob, address, gender }); + await user.UserDetail.update({ name, address, gender }); response.status(200).json(user); } catch (error) { diff --git a/server/helpers/openai.js b/server/helpers/openai.js new file mode 100644 index 0000000..0ce6cfb --- /dev/null +++ b/server/helpers/openai.js @@ -0,0 +1,20 @@ +const generateAnsPromt = (q, answer) => { + let question = q.split(';;'); + let result = `berikan nilai terhadap jawaban atas pertanyaan di bawah ini.`; + + for (let i = 0; i < 5; i++) { + result += ' ' + question[i] + ' jawabannya ' + answer[i] + '. '; + } + + result += 'cukup keluarkan respons dalam bentuk integer javascript. setiap jawaban benar mendapat 20 poin. Tidak perlu mengeluarkan respons deskripsi apa pun cukup integer total poinnya dalam bentuk js. cukup jawab misal 10 atau 50, tidak perlu ada deklarasi atau console log cukup angkanya saja' + return result; +} + +const generateBookPromt = (desc) => { + let result = `berikan saya 1 buku yang menggambarkan atau yang isinya mirip atau sesuai dengan deskripsi di bawah ini. `; + result += ` ${desc} ` + result += 'cukup keluarkan respons dalam bentuk string javascript. Tidak perlu mengeluarkan respons deskripsi apa pun cukup judul bukunya saja. cukup jawab misal Laskar Pelangi atau Atomic Habbits, tidak perlu ada deklarasi atau console log cukup judul bukunya saja' + return result; +} + +module.exports = { generateAnsPromt, generateBookPromt }; \ No newline at end of file diff --git a/server/migrations/20231113173218-create-user-detail.js b/server/migrations/20231113173218-create-user-detail.js index 11d13a5..fc64890 100644 --- a/server/migrations/20231113173218-create-user-detail.js +++ b/server/migrations/20231113173218-create-user-detail.js @@ -21,9 +21,6 @@ module.exports = { type: Sequelize.STRING, allowNull: false }, - dob: { - type: Sequelize.DATE - }, inumber: { type: Sequelize.STRING, allowNull: false diff --git a/server/migrations/20231113173602-create-history.js b/server/migrations/20231113173602-create-history.js index 495e973..f443e8d 100644 --- a/server/migrations/20231113173602-create-history.js +++ b/server/migrations/20231113173602-create-history.js @@ -11,7 +11,6 @@ module.exports = { }, bookId: { type: Sequelize.INTEGER, - allowNull: false, references: { model: 'Books', key: 'id' diff --git a/server/models/history.js b/server/models/history.js index b49130d..1a401a4 100644 --- a/server/models/history.js +++ b/server/models/history.js @@ -11,23 +11,12 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - History.belongsTo(models.User); - History.belongsTo(models.Book); + History.belongsTo(models.User, { foreignKey: 'userId' }); + History.belongsTo(models.Book, { foreignKey: 'bookId' }); } } History.init({ - bookId: { - type: DataTypes.INTEGER, - allowNull: false, - validate: { - notEmpty: { - msg: `Book is required!` - }, - notNull: { - msg: `Book is required!` - } - } - }, + bookId: DataTypes.INTEGER, userId: { type: DataTypes.INTEGER, allowNull: false, diff --git a/server/models/userdetail.js b/server/models/userdetail.js index 84d7af4..fa9ee03 100644 --- a/server/models/userdetail.js +++ b/server/models/userdetail.js @@ -11,7 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - UserDetail.belongsTo(models.User); + UserDetail.belongsTo(models.User, { foreignKey: 'userId' }); } } UserDetail.init({ @@ -39,18 +39,6 @@ module.exports = (sequelize, DataTypes) => { } } }, - dob: { - type: DataTypes.DATE, - allowNull: false, - validate: { - notEmpty: { - msg: `Date of birth is required!` - }, - notNull: { - msg: `Date of birth is required!` - } - } - }, inumber: { type: DataTypes.STRING, allowNull: false, @@ -78,6 +66,6 @@ module.exports = (sequelize, DataTypes) => { inumber += 'IPUSTAKA' userDetail.inumber = inumber; }); - + return UserDetail; }; \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index 0220fd6..c1f2244 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -14,6 +14,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.2", + "openai": "^4.17.5", "pg": "^8.11.3", "sequelize": "^6.35.0" }, @@ -1321,6 +1322,15 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -1356,6 +1366,17 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -1368,6 +1389,17 @@ "node": ">= 0.6" } }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1586,6 +1618,11 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base-64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", + "integrity": "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==" + }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -1795,6 +1832,14 @@ "node": ">=10" } }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -2040,6 +2085,14 @@ "node": ">= 8" } }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -2147,6 +2200,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/digest-fetch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz", + "integrity": "sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==", + "dependencies": { + "base-64": "^0.1.0", + "md5": "^2.3.0" + } + }, "node_modules/dotenv": { "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", @@ -2368,6 +2430,14 @@ "es5-ext": "~0.10.14" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -2595,6 +2665,31 @@ "node": ">= 6" } }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/formdata-node/node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, "node_modules/formidable": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", @@ -2872,6 +2967,14 @@ "node": ">=10.17.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2972,6 +3075,11 @@ "node": ">=8" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -4010,6 +4118,16 @@ "tmpl": "1.0.5" } }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -4170,6 +4288,43 @@ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4333,6 +4488,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openai": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.17.5.tgz", + "integrity": "sha512-SDgA933/QOjISCgWRc/JQhY1HweYZ6FOie3bWrCpj09FA5xIlaomldbyzICHNjtkh7SWEmGYFjRHIDtuwr+eTw==", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "digest-fetch": "^1.3.0", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7", + "web-streams-polyfill": "^3.2.1" + }, + "bin": { + "openai": "bin/cli" + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.9.tgz", + "integrity": "sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -5493,6 +5675,11 @@ "node": "*" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -5657,6 +5844,28 @@ "makeerror": "1.0.12" } }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/server/package.json b/server/package.json index 8014068..1d886c1 100644 --- a/server/package.json +++ b/server/package.json @@ -15,6 +15,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.2", + "openai": "^4.17.5", "pg": "^8.11.3", "sequelize": "^6.35.0" }, diff --git a/server/routes/index.js b/server/routes/index.js index c60e602..5a525e2 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -1,6 +1,9 @@ const express = require('express'); +const HistoryController = require('../controllers/HistoryController'); const router = express.Router(); +router.get('/questions', HistoryController.create); +router.put('/questions', HistoryController.update); module.exports = router; \ No newline at end of file diff --git a/server/seeders/20231114093153-user-seeder.js b/server/seeders/20231114093153-user-seeder.js new file mode 100644 index 0000000..bf90619 --- /dev/null +++ b/server/seeders/20231114093153-user-seeder.js @@ -0,0 +1,52 @@ +'use strict'; + +const { bcryptHash } = require('../helpers/bcryptjs'); + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + const password = bcryptHash('111111'); + const date = new Date(); + + await queryInterface.bulkInsert('Users', [{ + username: "admin", + email: "admin@p2.com", + password: password, + role: "admin", + accountType: "manual", + createdAt: date, + updatedAt: date + }], {}); + + await queryInterface.bulkInsert('UserDetails', [{ + userId: 1, + name: "Admin User", + inumber: "A-2023-1-IPUSTAKA", + createdAt: date, + updatedAt: date + }], {}); + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + }, + + async down (queryInterface, Sequelize) { + await queryInterface.bulkDelete('Users', null, { + truncate : true, + cascade : true, + restartIdentity : true + }); + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + } +}; From a88ee0278491d9789dfd48fd3562614e105039db Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Tue, 14 Nov 2023 21:40:34 +0700 Subject: [PATCH 10/27] Add testing scenario for auth (register and login) --- server/__tests__/auth.js | 138 ++++++ server/config/config.json | 9 +- server/controllers/UserController.js | 4 +- server/coverage/clover.xml | 268 +++++++++++ server/coverage/coverage-final.json | 14 + 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 +++++ .../controllers/HistoryController.js.html | 262 +++++++++++ .../server/controllers/UserController.js.html | 370 +++++++++++++++ .../lcov-report/server/controllers/index.html | 131 ++++++ .../server/helpers/bcryptjs.js.html | 124 +++++ .../lcov-report/server/helpers/index.html | 146 ++++++ .../lcov-report/server/helpers/jwt.js.html | 124 +++++ .../lcov-report/server/helpers/openai.js.html | 142 ++++++ server/coverage/lcov-report/server/index.html | 116 +++++ .../server/middlewares/errorHandler.js.html | 271 +++++++++++ .../lcov-report/server/middlewares/index.html | 116 +++++ .../lcov-report/server/models/book.js.html | 328 ++++++++++++++ .../lcov-report/server/models/history.js.html | 238 ++++++++++ .../lcov-report/server/models/index.html | 176 ++++++++ .../lcov-report/server/models/index.js.html | 214 +++++++++ .../lcov-report/server/models/user.js.html | 379 ++++++++++++++++ .../server/models/userdetail.js.html | 259 +++++++++++ .../lcov-report/server/routes/index.html | 116 +++++ .../lcov-report/server/routes/index.js.html | 124 +++++ .../lcov-report/sort-arrow-sprite.png | Bin 0 -> 138 bytes server/coverage/lcov-report/sorter.js | 196 ++++++++ server/coverage/lcov.info | 422 ++++++++++++++++++ server/middlewares/authentication.js | 8 +- server/middlewares/authorization.js | 4 +- server/middlewares/errorHandler.js | 109 +++-- .../20231113173218-create-user-detail.js | 3 +- server/models/userdetail.js | 22 +- server/routes/index.js | 7 +- 39 files changed, 5381 insertions(+), 88 deletions(-) create mode 100644 server/__tests__/auth.js 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/HistoryController.js.html create mode 100644 server/coverage/lcov-report/server/controllers/UserController.js.html create mode 100644 server/coverage/lcov-report/server/controllers/index.html create mode 100644 server/coverage/lcov-report/server/helpers/bcryptjs.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/helpers/openai.js.html create mode 100644 server/coverage/lcov-report/server/index.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/models/book.js.html create mode 100644 server/coverage/lcov-report/server/models/history.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/models/userdetail.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/sort-arrow-sprite.png create mode 100644 server/coverage/lcov-report/sorter.js create mode 100644 server/coverage/lcov.info diff --git a/server/__tests__/auth.js b/server/__tests__/auth.js new file mode 100644 index 0000000..5eaf4af --- /dev/null +++ b/server/__tests__/auth.js @@ -0,0 +1,138 @@ +const app = require('../app'); +const request = require('supertest'); +const { User, sequelize } = require('../models'); +const { queryInterface } = sequelize; + +const user1 = { + username: "usrOne", + email: "user1@gmail.com", + password: '11111', + name: 'User 1', +}; + +const timeOut = 20000; + +describe('/register', () => { + describe('Positive Testing', () => { + test('success register user', async () => { + let { status, body } = await request(app) + .post('/register') + .send(user1); + + expect(status).toBe(201); + expect(body).toBeInstanceOf(Object); + expect(body).toHaveProperty("email", "user1@gmail.com"); + expect(body).toHaveProperty("role", "member"); + expect(body).toHaveProperty("id"); + }, timeOut); + }); + + describe('Negative Testing', () => { + test('failed register with empty username', async () => { + let { status, body } = await request(app) + .post('/register') + .send({ email: 'test@mail.com', password: '111111' }); + + expect(status).toBe(400); + expect(body).toBeInstanceOf(Object); + expect(body).toHaveProperty("message", ["Username is required!"]); + }, timeOut); + + test('failed register with empty email', async () => { + let { status, body } = await request(app) + .post('/register') + .send({ username: 'testUsn', password: '111111' }); + + expect(status).toBe(400); + expect(body).toBeInstanceOf(Object); + expect(body).toHaveProperty("message", ["Email is required!"]); + }, timeOut); + + test('failed register with empty password', async () => { + let { status, body } = await request(app) + .post('/register') + .send({ username: 'testUsn', email: 'testing123@gmail.com' }); + + expect(status).toBe(400); + expect(body).toBeInstanceOf(Object); + expect(body).toHaveProperty("message", ["Password is required!"]); + }, timeOut); + + test('failed register with existing email', async () => { + let { status, body } = await request(app) + .post('/register') + .send({ ...user1 }); + + expect(status).toBe(400); + expect(body).toBeInstanceOf(Object); + expect(body).toHaveProperty("message", ["email must be unique"]); + }, timeOut); + }); +}); + +describe('/login', () => { + describe('Positive Testing', () => { + test('success login with registered user', async () => { + let { status, body } = await request(app) + .post('/login') + .send(user1); + + expect(status).toBe(200); + expect(body).toBeInstanceOf(Object); + expect(body).toHaveProperty("email", "user1@gmail.com"); + expect(body).toHaveProperty("role", "member"); + expect(body).toHaveProperty("access_token", expect.any(String)); + }, timeOut); + }); + + describe('Negative Testing', () => { + test('failed login with empty email', async () => { + let { status, body } = await request(app) + .post('/login') + .send({ password: '111111' }); + + expect(status).toBe(400); + expect(body).toBeInstanceOf(Object); + expect(body).toHaveProperty("message", "Email is required"); + }, timeOut); + + test('failed login with empty password', async () => { + let { status, body } = await request(app) + .post('/login') + .send({ email: 'testing123@gmail.com' }); + + expect(status).toBe(400); + expect(body).toBeInstanceOf(Object); + expect(body).toHaveProperty("message", "Password is required"); + }, timeOut); + + test('failed login with unregistered user/email invalid', async () => { + let { status, body } = await request(app) + .post('/login') + .send({ ...user1, email: 'ddsd@dasa.sadads' }); + + expect(status).toBe(401); + expect(body).toBeInstanceOf(Object); + expect(body).toHaveProperty("message", expect.any(String)); + }, timeOut); + + test('failed login with invalid/unmatched password', async () => { + let { status, body } = await request(app) + .post('/login') + .send({ ...user1, password: '22222222' }); + + expect(status).toBe(401); + expect(body).toBeInstanceOf(Object); + expect(body).toHaveProperty("message", "Invalid Email/Password!"); + }, timeOut); + }); +}); + + +afterAll(async () => { + await queryInterface.bulkDelete('Users', null, { + truncate: true, + cascade: true, + restartIdentity: true + }); +}); \ No newline at end of file diff --git a/server/config/config.json b/server/config/config.json index a706965..73fd572 100644 --- a/server/config/config.json +++ b/server/config/config.json @@ -7,11 +7,12 @@ "dialect": "postgres" }, "test": { - "username": "root", - "password": null, - "database": "database_test", + "username": "postgres", + "password": "root", + "database": "ipustaka_test", "host": "127.0.0.1", - "dialect": "mysql" + "dialect": "postgres", + "logging": false }, "production": { "username": "root", diff --git a/server/controllers/UserController.js b/server/controllers/UserController.js index 6b2f31c..05386ef 100644 --- a/server/controllers/UserController.js +++ b/server/controllers/UserController.js @@ -37,7 +37,8 @@ class UserController { const { username, email, password, role = 'member', accountType = 'manual', name, address, gender } = request.body; try { const user = await User.create({ username, email, password, role, accountType }); - await UserDetail.create({ userId: user.id, name, address, gender }); + await UserDetail.create({ userId: user.id, name, address, gender}); + response.status(201).json({ id: user.id, email: user.email, role: user.role }); } catch (error) { next(error); @@ -76,7 +77,6 @@ class UserController { static async login(request, response, next) { const { username, email, password } = request.body; try { - if (!username || username === "") throw ({ name: `EmptyUsername` }); if (!email || email === "") throw ({ name: `EmptyEmail` }); if (!password || password === "") throw ({ name: `EmptyPassword` }); diff --git a/server/coverage/clover.xml b/server/coverage/clover.xml new file mode 100644 index 0000000..e852d14 --- /dev/null +++ b/server/coverage/clover.xml @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/coverage/coverage-final.json b/server/coverage/coverage-final.json new file mode 100644 index 0000000..a596c22 --- /dev/null +++ b/server/coverage/coverage-final.json @@ -0,0 +1,14 @@ +{"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\app.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\app.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},"1":{"start":{"line":2,"column":4},"end":{"line":2,"column":31}},"2":{"start":{"line":5,"column":16},"end":{"line":5,"column":34}},"3":{"start":{"line":6,"column":13},"end":{"line":6,"column":28}},"4":{"start":{"line":7,"column":12},"end":{"line":7,"column":21}},"5":{"start":{"line":9,"column":0},"end":{"line":9,"column":16}},"6":{"start":{"line":10,"column":0},"end":{"line":10,"column":24}},"7":{"start":{"line":11,"column":0},"end":{"line":11,"column":48}},"8":{"start":{"line":12,"column":0},"end":{"line":12,"column":29}},"9":{"start":{"line":14,"column":0},"end":{"line":14,"column":21}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},"type":"if","locations":[{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},{"start":{},"end":{}}],"line":1}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1},"f":{},"b":{"0":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"bbee6a6c8c78c4c34676394bb03d083a03ff347d"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\HistoryController.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\HistoryController.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":20},"end":{"line":2,"column":40}},"2":{"start":{"line":3,"column":29},"end":{"line":3,"column":57}},"3":{"start":{"line":7,"column":8},"end":{"line":29,"column":9}},"4":{"start":{"line":8,"column":28},"end":{"line":8,"column":91}},"5":{"start":{"line":9,"column":27},"end":{"line":11,"column":14}},"6":{"start":{"line":13,"column":29},"end":{"line":14,"column":100}},"7":{"start":{"line":16,"column":32},"end":{"line":20,"column":14}},"8":{"start":{"line":22,"column":28},"end":{"line":22,"column":54}},"9":{"start":{"line":23,"column":12},"end":{"line":23,"column":52}},"10":{"start":{"line":24,"column":12},"end":{"line":24,"column":46}},"11":{"start":{"line":25,"column":12},"end":{"line":25,"column":95}},"12":{"start":{"line":27,"column":12},"end":{"line":27,"column":31}},"13":{"start":{"line":28,"column":12},"end":{"line":28,"column":24}},"14":{"start":{"line":33,"column":38},"end":{"line":33,"column":46}},"15":{"start":{"line":34,"column":8},"end":{"line":55,"column":9}},"16":{"start":{"line":35,"column":28},"end":{"line":35,"column":55}},"17":{"start":{"line":36,"column":26},"end":{"line":36,"column":68}},"18":{"start":{"line":38,"column":27},"end":{"line":40,"column":14}},"19":{"start":{"line":42,"column":32},"end":{"line":46,"column":14}},"20":{"start":{"line":48,"column":28},"end":{"line":48,"column":54}},"21":{"start":{"line":49,"column":12},"end":{"line":49,"column":50}},"22":{"start":{"line":51,"column":12},"end":{"line":51,"column":90}},"23":{"start":{"line":53,"column":12},"end":{"line":53,"column":31}},"24":{"start":{"line":54,"column":12},"end":{"line":54,"column":24}},"25":{"start":{"line":60,"column":0},"end":{"line":60,"column":35}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":5}},"loc":{"start":{"line":6,"column":40},"end":{"line":30,"column":5}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":32,"column":4},"end":{"line":32,"column":5}},"loc":{"start":{"line":32,"column":40},"end":{"line":56,"column":5}},"line":32}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":1},"f":{"0":0,"1":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ddf7844e0dab4145a7febf7f9abb17b76d52a171"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\UserController.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\UserController.js","statementMap":{"0":{"start":{"line":1,"column":26},"end":{"line":1,"column":56}},"1":{"start":{"line":2,"column":24},"end":{"line":2,"column":49}},"2":{"start":{"line":3,"column":29},"end":{"line":3,"column":49}},"3":{"start":{"line":7,"column":8},"end":{"line":17,"column":9}},"4":{"start":{"line":8,"column":26},"end":{"line":12,"column":14}},"5":{"start":{"line":14,"column":12},"end":{"line":14,"column":45}},"6":{"start":{"line":16,"column":12},"end":{"line":16,"column":24}},"7":{"start":{"line":21,"column":8},"end":{"line":33,"column":9}},"8":{"start":{"line":22,"column":25},"end":{"line":26,"column":14}},"9":{"start":{"line":28,"column":12},"end":{"line":28,"column":52}},"10":{"start":{"line":28,"column":23},"end":{"line":28,"column":52}},"11":{"start":{"line":30,"column":12},"end":{"line":30,"column":44}},"12":{"start":{"line":32,"column":12},"end":{"line":32,"column":24}},"13":{"start":{"line":37,"column":110},"end":{"line":37,"column":122}},"14":{"start":{"line":38,"column":8},"end":{"line":45,"column":9}},"15":{"start":{"line":39,"column":25},"end":{"line":39,"column":92}},"16":{"start":{"line":40,"column":12},"end":{"line":40,"column":79}},"17":{"start":{"line":42,"column":12},"end":{"line":42,"column":91}},"18":{"start":{"line":44,"column":12},"end":{"line":44,"column":24}},"19":{"start":{"line":49,"column":69},"end":{"line":49,"column":81}},"20":{"start":{"line":50,"column":8},"end":{"line":63,"column":9}},"21":{"start":{"line":51,"column":23},"end":{"line":55,"column":14}},"22":{"start":{"line":57,"column":12},"end":{"line":57,"column":61}},"23":{"start":{"line":58,"column":12},"end":{"line":58,"column":68}},"24":{"start":{"line":60,"column":12},"end":{"line":60,"column":44}},"25":{"start":{"line":62,"column":12},"end":{"line":62,"column":24}},"26":{"start":{"line":67,"column":8},"end":{"line":74,"column":9}},"27":{"start":{"line":68,"column":23},"end":{"line":68,"column":61}},"28":{"start":{"line":70,"column":12},"end":{"line":70,"column":33}},"29":{"start":{"line":71,"column":12},"end":{"line":71,"column":97}},"30":{"start":{"line":73,"column":12},"end":{"line":73,"column":24}},"31":{"start":{"line":78,"column":46},"end":{"line":78,"column":58}},"32":{"start":{"line":79,"column":8},"end":{"line":90,"column":9}},"33":{"start":{"line":80,"column":12},"end":{"line":80,"column":71}},"34":{"start":{"line":80,"column":40},"end":{"line":80,"column":71}},"35":{"start":{"line":81,"column":12},"end":{"line":81,"column":80}},"36":{"start":{"line":81,"column":46},"end":{"line":81,"column":80}},"37":{"start":{"line":83,"column":25},"end":{"line":83,"column":65}},"38":{"start":{"line":84,"column":12},"end":{"line":84,"column":97}},"39":{"start":{"line":84,"column":66},"end":{"line":84,"column":97}},"40":{"start":{"line":86,"column":26},"end":{"line":86,"column":54}},"41":{"start":{"line":87,"column":12},"end":{"line":87,"column":99}},"42":{"start":{"line":89,"column":12},"end":{"line":89,"column":24}},"43":{"start":{"line":96,"column":0},"end":{"line":96,"column":32}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":5}},"loc":{"start":{"line":6,"column":43},"end":{"line":18,"column":5}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":4},"end":{"line":20,"column":5}},"loc":{"start":{"line":20,"column":50},"end":{"line":34,"column":5}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":36,"column":4},"end":{"line":36,"column":5}},"loc":{"start":{"line":36,"column":49},"end":{"line":46,"column":5}},"line":36},"3":{"name":"(anonymous_3)","decl":{"start":{"line":48,"column":4},"end":{"line":48,"column":5}},"loc":{"start":{"line":48,"column":49},"end":{"line":64,"column":5}},"line":48},"4":{"name":"(anonymous_4)","decl":{"start":{"line":66,"column":4},"end":{"line":66,"column":5}},"loc":{"start":{"line":66,"column":49},"end":{"line":75,"column":5}},"line":66},"5":{"name":"(anonymous_5)","decl":{"start":{"line":77,"column":4},"end":{"line":77,"column":5}},"loc":{"start":{"line":77,"column":48},"end":{"line":91,"column":5}},"line":77}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":12},"end":{"line":28,"column":52}},"type":"if","locations":[{"start":{"line":28,"column":12},"end":{"line":28,"column":52}},{"start":{},"end":{}}],"line":28},"1":{"loc":{"start":{"line":37,"column":43},"end":{"line":37,"column":58}},"type":"default-arg","locations":[{"start":{"line":37,"column":50},"end":{"line":37,"column":58}}],"line":37},"2":{"loc":{"start":{"line":37,"column":60},"end":{"line":37,"column":82}},"type":"default-arg","locations":[{"start":{"line":37,"column":74},"end":{"line":37,"column":82}}],"line":37},"3":{"loc":{"start":{"line":80,"column":12},"end":{"line":80,"column":71}},"type":"if","locations":[{"start":{"line":80,"column":12},"end":{"line":80,"column":71}},{"start":{},"end":{}}],"line":80},"4":{"loc":{"start":{"line":80,"column":16},"end":{"line":80,"column":38}},"type":"binary-expr","locations":[{"start":{"line":80,"column":16},"end":{"line":80,"column":22}},{"start":{"line":80,"column":26},"end":{"line":80,"column":38}}],"line":80},"5":{"loc":{"start":{"line":81,"column":12},"end":{"line":81,"column":80}},"type":"if","locations":[{"start":{"line":81,"column":12},"end":{"line":81,"column":80}},{"start":{},"end":{}}],"line":81},"6":{"loc":{"start":{"line":81,"column":16},"end":{"line":81,"column":44}},"type":"binary-expr","locations":[{"start":{"line":81,"column":16},"end":{"line":81,"column":25}},{"start":{"line":81,"column":29},"end":{"line":81,"column":44}}],"line":81},"7":{"loc":{"start":{"line":84,"column":12},"end":{"line":84,"column":97}},"type":"if","locations":[{"start":{"line":84,"column":12},"end":{"line":84,"column":97}},{"start":{},"end":{}}],"line":84},"8":{"loc":{"start":{"line":84,"column":16},"end":{"line":84,"column":64}},"type":"binary-expr","locations":[{"start":{"line":84,"column":16},"end":{"line":84,"column":21}},{"start":{"line":84,"column":25},"end":{"line":84,"column":64}}],"line":84}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":5,"14":5,"15":5,"16":1,"17":1,"18":4,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":5,"32":5,"33":5,"34":1,"35":4,"36":1,"37":3,"38":3,"39":2,"40":1,"41":1,"42":4,"43":1},"f":{"0":0,"1":0,"2":5,"3":0,"4":0,"5":5},"b":{"0":[0,0],"1":[5],"2":[5],"3":[1,4],"4":[5,4],"5":[1,3],"6":[4,3],"7":[2,1],"8":[3,2]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"fd8a938c1a8c50d225ff0ce6d5042a16cc06cc87"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\bcryptjs.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\bcryptjs.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":36}},"1":{"start":{"line":3,"column":19},"end":{"line":7,"column":1}},"2":{"start":{"line":4,"column":17},"end":{"line":4,"column":41}},"3":{"start":{"line":5,"column":17},"end":{"line":5,"column":45}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":16}},"5":{"start":{"line":9,"column":22},"end":{"line":12,"column":1}},"6":{"start":{"line":10,"column":20},"end":{"line":10,"column":53}},"7":{"start":{"line":11,"column":4},"end":{"line":11,"column":19}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":47}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":19},"end":{"line":3,"column":20}},"loc":{"start":{"line":3,"column":28},"end":{"line":7,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":22},"end":{"line":9,"column":23}},"loc":{"start":{"line":9,"column":39},"end":{"line":12,"column":1}},"line":9}},"branchMap":{},"s":{"0":1,"1":1,"2":2,"3":2,"4":2,"5":1,"6":2,"7":2,"8":1},"f":{"0":2,"1":2},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"199dc6211967aee323fafddd10ce98bcd3d8dcfa"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\jwt.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\jwt.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":35}},"1":{"start":{"line":2,"column":18},"end":{"line":2,"column":40}},"2":{"start":{"line":4,"column":20},"end":{"line":7,"column":1}},"3":{"start":{"line":5,"column":18},"end":{"line":5,"column":42}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":17}},"5":{"start":{"line":9,"column":20},"end":{"line":12,"column":1}},"6":{"start":{"line":10,"column":20},"end":{"line":10,"column":46}},"7":{"start":{"line":11,"column":4},"end":{"line":11,"column":19}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":46}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":20},"end":{"line":4,"column":21}},"loc":{"start":{"line":4,"column":29},"end":{"line":7,"column":1}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":20},"end":{"line":9,"column":21}},"loc":{"start":{"line":9,"column":29},"end":{"line":12,"column":1}},"line":9}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":0,"8":1},"f":{"0":1,"1":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"5f76b3b819dee86a4e22818bc9c20f67f6848d08"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\openai.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\openai.js","statementMap":{"0":{"start":{"line":1,"column":25},"end":{"line":11,"column":1}},"1":{"start":{"line":2,"column":19},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":17},"end":{"line":3,"column":79}},"3":{"start":{"line":5,"column":4},"end":{"line":7,"column":5}},"4":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"5":{"start":{"line":6,"column":8},"end":{"line":6,"column":72}},"6":{"start":{"line":9,"column":4},"end":{"line":9,"column":300}},"7":{"start":{"line":10,"column":4},"end":{"line":10,"column":18}},"8":{"start":{"line":13,"column":26},"end":{"line":18,"column":1}},"9":{"start":{"line":14,"column":17},"end":{"line":14,"column":124}},"10":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"11":{"start":{"line":16,"column":4},"end":{"line":16,"column":270}},"12":{"start":{"line":17,"column":4},"end":{"line":17,"column":18}},"13":{"start":{"line":20,"column":0},"end":{"line":20,"column":57}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":25},"end":{"line":1,"column":26}},"loc":{"start":{"line":1,"column":40},"end":{"line":11,"column":1}},"line":1},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":26},"end":{"line":13,"column":27}},"loc":{"start":{"line":13,"column":36},"end":{"line":18,"column":1}},"line":13}},"branchMap":{},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":1,"9":0,"10":0,"11":0,"12":0,"13":1},"f":{"0":0,"1":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e37f093eb10c6349ef163996de60c8c620d176c0"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\middlewares\\errorHandler.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\middlewares\\errorHandler.js","statementMap":{"0":{"start":{"line":1,"column":21},"end":{"line":61,"column":1}},"1":{"start":{"line":4,"column":8},"end":{"line":56,"column":9}},"2":{"start":{"line":7,"column":16},"end":{"line":7,"column":33}},"3":{"start":{"line":8,"column":16},"end":{"line":8,"column":72}},"4":{"start":{"line":8,"column":51},"end":{"line":8,"column":68}},"5":{"start":{"line":9,"column":16},"end":{"line":9,"column":22}},"6":{"start":{"line":12,"column":16},"end":{"line":12,"column":33}},"7":{"start":{"line":13,"column":16},"end":{"line":13,"column":49}},"8":{"start":{"line":14,"column":16},"end":{"line":14,"column":22}},"9":{"start":{"line":17,"column":16},"end":{"line":17,"column":33}},"10":{"start":{"line":18,"column":16},"end":{"line":18,"column":46}},"11":{"start":{"line":19,"column":16},"end":{"line":19,"column":22}},"12":{"start":{"line":22,"column":16},"end":{"line":22,"column":33}},"13":{"start":{"line":23,"column":16},"end":{"line":23,"column":49}},"14":{"start":{"line":24,"column":16},"end":{"line":24,"column":22}},"15":{"start":{"line":27,"column":16},"end":{"line":27,"column":33}},"16":{"start":{"line":28,"column":16},"end":{"line":28,"column":55}},"17":{"start":{"line":29,"column":16},"end":{"line":29,"column":22}},"18":{"start":{"line":32,"column":16},"end":{"line":32,"column":33}},"19":{"start":{"line":33,"column":16},"end":{"line":33,"column":52}},"20":{"start":{"line":34,"column":16},"end":{"line":34,"column":22}},"21":{"start":{"line":38,"column":16},"end":{"line":38,"column":33}},"22":{"start":{"line":39,"column":16},"end":{"line":39,"column":44}},"23":{"start":{"line":40,"column":16},"end":{"line":40,"column":22}},"24":{"start":{"line":43,"column":16},"end":{"line":43,"column":33}},"25":{"start":{"line":44,"column":16},"end":{"line":44,"column":50}},"26":{"start":{"line":45,"column":16},"end":{"line":45,"column":22}},"27":{"start":{"line":48,"column":16},"end":{"line":48,"column":33}},"28":{"start":{"line":49,"column":16},"end":{"line":49,"column":38}},"29":{"start":{"line":50,"column":16},"end":{"line":50,"column":22}},"30":{"start":{"line":53,"column":16},"end":{"line":53,"column":33}},"31":{"start":{"line":54,"column":16},"end":{"line":54,"column":50}},"32":{"start":{"line":55,"column":16},"end":{"line":55,"column":22}},"33":{"start":{"line":58,"column":8},"end":{"line":58,"column":54}},"34":{"start":{"line":63,"column":0},"end":{"line":63,"column":30}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":13},"end":{"line":2,"column":14}},"loc":{"start":{"line":2,"column":49},"end":{"line":59,"column":5}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":43},"end":{"line":8,"column":44}},"loc":{"start":{"line":8,"column":49},"end":{"line":8,"column":70}},"line":8}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":8},"end":{"line":56,"column":9}},"type":"switch","locations":[{"start":{"line":5,"column":12},"end":{"line":5,"column":44}},{"start":{"line":6,"column":12},"end":{"line":9,"column":22}},{"start":{"line":11,"column":12},"end":{"line":14,"column":22}},{"start":{"line":16,"column":12},"end":{"line":19,"column":22}},{"start":{"line":21,"column":12},"end":{"line":24,"column":22}},{"start":{"line":26,"column":12},"end":{"line":29,"column":22}},{"start":{"line":31,"column":12},"end":{"line":34,"column":22}},{"start":{"line":36,"column":12},"end":{"line":36,"column":37}},{"start":{"line":37,"column":12},"end":{"line":40,"column":22}},{"start":{"line":42,"column":12},"end":{"line":45,"column":22}},{"start":{"line":47,"column":12},"end":{"line":50,"column":22}},{"start":{"line":52,"column":12},"end":{"line":55,"column":22}}],"line":4}},"s":{"0":1,"1":8,"2":4,"3":4,"4":4,"5":4,"6":0,"7":0,"8":0,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":0,"16":0,"17":0,"18":2,"19":2,"20":2,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":8,"34":1},"f":{"0":8,"1":4},"b":{"0":[3,4,0,1,1,0,2,0,0,0,0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"4dc6d2c1056fd7db757cd1714eaeea475f56ed9b"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\book.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\book.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":82,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":16,"column":9}},"3":{"start":{"line":19,"column":2},"end":{"line":80,"column":5}},"4":{"start":{"line":81,"column":2},"end":{"line":81,"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":82,"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":17,"column":5}},"line":12}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{"0":1,"1":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1f5f099b55b81754d08c6cbbc47d71094d8d75a1"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\history.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\history.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":52,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":14,"column":63}},"3":{"start":{"line":15,"column":6},"end":{"line":15,"column":63}},"4":{"start":{"line":18,"column":2},"end":{"line":50,"column":5}},"5":{"start":{"line":51,"column":2},"end":{"line":51,"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":52,"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":1,"1":1,"2":1,"3":1,"4":1,"5":1},"f":{"0":1,"1":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"98da8ad63804f7670803ee48beea4b6a624ef3bd"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\index.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\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":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":1,"11":1,"12":5,"13":4,"14":4,"15":1,"16":4,"17":4,"18":1,"19":1,"20":1},"f":{"0":5,"1":4,"2":4},"b":{"0":[1,0],"1":[0,1],"2":[5,5,4,4],"3":[4,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c5e6338cec851d2f43b0e46aff1b089bf4c057b9"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\user.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\user.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":23},"end":{"line":5,"column":53}},"2":{"start":{"line":6,"column":0},"end":{"line":99,"column":2}},"3":{"start":{"line":15,"column":6},"end":{"line":18,"column":9}},"4":{"start":{"line":19,"column":6},"end":{"line":22,"column":9}},"5":{"start":{"line":25,"column":2},"end":{"line":92,"column":5}},"6":{"start":{"line":94,"column":2},"end":{"line":96,"column":5}},"7":{"start":{"line":95,"column":4},"end":{"line":95,"column":46}},"8":{"start":{"line":98,"column":2},"end":{"line":98,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":17},"end":{"line":6,"column":18}},"loc":{"start":{"line":6,"column":43},"end":{"line":99,"column":1}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":5}},"loc":{"start":{"line":13,"column":29},"end":{"line":23,"column":5}},"line":13},"2":{"name":"(anonymous_2)","decl":{"start":{"line":94,"column":20},"end":{"line":94,"column":21}},"loc":{"start":{"line":94,"column":30},"end":{"line":96,"column":3}},"line":94}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":2,"8":1},"f":{"0":1,"1":1,"2":2},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a4d8dec31a158ef245baead8543877a0e328f497"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\userdetail.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\userdetail.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":59,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":14,"column":66}},"3":{"start":{"line":17,"column":2},"end":{"line":48,"column":5}},"4":{"start":{"line":50,"column":2},"end":{"line":57,"column":5}},"5":{"start":{"line":51,"column":18},"end":{"line":51,"column":22}},"6":{"start":{"line":52,"column":4},"end":{"line":52,"column":46}},"7":{"start":{"line":53,"column":4},"end":{"line":53,"column":29}},"8":{"start":{"line":54,"column":4},"end":{"line":54,"column":52}},"9":{"start":{"line":55,"column":4},"end":{"line":55,"column":25}},"10":{"start":{"line":56,"column":4},"end":{"line":56,"column":27}},"11":{"start":{"line":58,"column":2},"end":{"line":58,"column":20}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":59,"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},"2":{"name":"(anonymous_2)","decl":{"start":{"line":50,"column":26},"end":{"line":50,"column":27}},"loc":{"start":{"line":50,"column":36},"end":{"line":57,"column":3}},"line":50}},"branchMap":{"0":{"loc":{"start":{"line":54,"column":4},"end":{"line":54,"column":51}},"type":"cond-expr","locations":[{"start":{"line":54,"column":18},"end":{"line":54,"column":33}},{"start":{"line":54,"column":36},"end":{"line":54,"column":51}}],"line":54}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"f":{"0":1,"1":1,"2":1},"b":{"0":[0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"08f5316a90d07ba1691745ff6c2281ce0e6ea6a8"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\routes\\index.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\routes\\index.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":26},"end":{"line":2,"column":69}},"2":{"start":{"line":3,"column":23},"end":{"line":3,"column":63}},"3":{"start":{"line":4,"column":21},"end":{"line":4,"column":59}},"4":{"start":{"line":5,"column":15},"end":{"line":5,"column":31}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":48}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":44}},"7":{"start":{"line":10,"column":0},"end":{"line":10,"column":51}},"8":{"start":{"line":11,"column":0},"end":{"line":11,"column":51}},"9":{"start":{"line":12,"column":0},"end":{"line":12,"column":33}},"10":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e9476553f8bcca705c5085b79c80350e776070d5"} +} 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

+
+ +
+ 63.98% + Statements + 135/211 +
+ + +
+ 66.66% + Branches + 28/42 +
+ + +
+ 68.96% + Functions + 20/29 +
+ + +
+ 63.9% + Lines + 131/205 +
+ + +
+

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

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
server +
+
100%10/1050%1/2100%0/0100%10/10
server/controllers +
+
37.14%26/7087.5%14/1625%2/834.84%23/66
server/helpers +
+
59.37%19/32100%0/050%3/661.29%19/31
server/middlewares +
+
48.57%17/3541.66%5/12100%2/247.05%16/34
server/models +
+
98.11%52/5366.66%8/12100%13/1398.11%52/53
server/routes +
+
100%11/11100%0/0100%0/0100%11/11
+
+
+
+ + + + + + + + \ 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..0e870c1 --- /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 + 10/10 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ 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 +141x +1x +  +  +1x +1x +1x +  +1x +1x +1x +1x +  +1x
Eif (process.env.NODE_ENV !== "production") {
+    require('dotenv').config();
+}
+ 
+const express = require('express');
+const cors = require('cors');
+const app = express();
+ 
+app.use(cors());
+app.use(express.json());
+app.use(express.urlencoded({ extended: true }));
+app.use(require('./routes'));
+ 
+module.exports = app;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/controllers/HistoryController.js.html b/server/coverage/lcov-report/server/controllers/HistoryController.js.html new file mode 100644 index 0000000..5b2b882 --- /dev/null +++ b/server/coverage/lcov-report/server/controllers/HistoryController.js.html @@ -0,0 +1,262 @@ + + + + + + Code coverage report for server/controllers/HistoryController.js + + + + + + + + + +
+
+

All files / server/controllers HistoryController.js

+
+ +
+ 15.38% + Statements + 4/26 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 15.38% + Lines + 4/26 +
+ + +
+

+ 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 +601x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x
const OpenAI = require('openai');
+const { History } = require('../models');
+const { generateAnsPromt } = require('../helpers/openai');
+ 
+class HistoryController {
+    static async create(req, res, next) {
+        try {
+            const history = await History.create({ userId: req.user.id, status: 'unpaid' });
+            const openai = new OpenAI({
+                apiKey: process.env.OpenAI_KEY
+            });
+ 
+            const question = `randomize saya 5 pertanyaan yang jawabannya cukup ya atau tidak mengenai topik pemrograman khususnya materi dasar javascript, reactjs, dan express js cukup pertanyaan mudah dan singkat untuk junior programmer atau bahkan orang awam. cukup jawab tanpa deskripsi apa pun cukup dengan format seperti di bawah ini di mana 5 pertanyaan tersebut dalam 1 array! perhatikan dengan benar format di bawah ini! dan jangan berikan respons dalam bentuk list di list
+            format responsnya harus seperti ini, perhatikan! pertanyaan1;;pertanyaan 2;;pertanyaan3`;
+ 
+            const { choices } = await openai.chat.completions.create({
+                model: 'gpt-3.5-turbo',
+                messages: [{ "role": "user", "content": question }],
+                max_tokens: 210
+            });
+ 
+            let questions = choices[0].message.content;
+            history.update({ question: questions });
+            questions = questions.split(';;');
+            res.status(201).json({ messages: `Successfully create history`, data: questions });
+        } catch (error) {
+            console.log(error);
+            next(error);
+        }
+    }
+ 
+    static async update(req, res, next) {
+        const { answer, historyId } = req.body
+        try {
+            const history = History.findByPk(historyId);
+            const promt = generateAnsPromt(history.question, answer);
+ 
+            const openai = new OpenAI({
+                apiKey: process.env.OpenAI_KEY
+            });
+ 
+            const { choices } = await openai.chat.completions.create({
+                model: 'gpt-3.5-turbo',
+                messages: [{ "role": "user", "content": promt }],
+                max_tokens: 210
+            });
+ 
+            let questions = choices[0].message.content;
+            history.update({ point: +questions });
+ 
+            res.status(200).json({ messages: `Successfully get point`, data: questions });
+        } catch (error) {
+            console.log(error);
+            next(error);
+        }
+    }
+    
+}
+ 
+module.exports = HistoryController;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/controllers/UserController.js.html b/server/coverage/lcov-report/server/controllers/UserController.js.html new file mode 100644 index 0000000..1af5f65 --- /dev/null +++ b/server/coverage/lcov-report/server/controllers/UserController.js.html @@ -0,0 +1,370 @@ + + + + + + Code coverage report for server/controllers/UserController.js + + + + + + + + + +
+
+

All files / server/controllers UserController.js

+
+ +
+ 50% + Statements + 22/44 +
+ + +
+ 87.5% + Branches + 14/16 +
+ + +
+ 33.33% + Functions + 2/6 +
+ + +
+ 47.5% + Lines + 19/40 +
+ + +
+

+ 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 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +961x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +5x +5x +1x +  +1x +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +5x +5x +4x +  +3x +3x +  +1x +1x +  +4x +  +  +  +  +  +  +1x
const { bcryptCompare } = require("../helpers/bcryptjs");
+const { createToken } = require("../helpers/jwt");
+const { User, UserDetail } = require("../models");
+ 
+class UserController {
+    static async getAll(request, response) {
+        try {
+            const users = await User.findAndCountAll({
+                include: {
+                    model: UserDetail
+                }
+            });
+ 
+            response.status(200).json(users);
+        } catch (error) {
+            next(error);
+        }
+    }
+ 
+    static async getById(request, response, next) {
+        try {
+            const user = await User.findByPk(request.params.id, {
+                include: {
+                    model: UserDetail
+                }
+            });
+ 
+            if (!user) throw ({ name: "NotFound" });
+ 
+            response.status(200).json(user);
+        } catch (error) {
+            next(error);
+        }
+    }
+ 
+    static async create(request, response, next) {
+        const { username, email, password, role = 'member', accountType = 'manual', name, address, gender } = request.body;
+        try {
+            const user = await User.create({ username, email, password, role, accountType });
+            await UserDetail.create({ userId: user.id, name, address, gender});
+           
+            response.status(201).json({ id: user.id, email: user.email, role: user.role });
+        } catch (error) {
+            next(error);
+        }
+    }
+ 
+    static async update(request, response, next) {
+        const { username, email, password, name, address, gender } = request.body;
+        try {
+            let user = await User.findByPk(request.params.id, {
+                include: {
+                    model: UserDetail
+                }
+            });
+ 
+            await user.update({ username, email, password });
+            await user.UserDetail.update({ name, address, gender });
+ 
+            response.status(200).json(user);
+        } catch (error) {
+            next(error);
+        }
+    }
+ 
+    static async delete(request, response, next) {
+        try {
+            let user = await User.findByPk(request.params.id);
+ 
+            await user.destroy();
+            response.status(200).json({ message: `User with id: ${user.id} success to delete` });
+        } catch (error) {
+            next(error);
+        }
+    }
+ 
+    static async login(request, response, next) {
+        const { username, email, password } = request.body;
+        try {
+            if (!email || email === "") throw ({ name: `EmptyEmail` });
+            if (!password || password === "") throw ({ name: `EmptyPassword` });
+            
+            const user = await User.findOne({ where: { email } });
+            if (!user || !bcryptCompare(password, user.password)) throw ({ name: "NotMatched" });
+ 
+            const token = createToken({ id: user.id });
+            response.status(200).json({ access_token: token, email: user.email, role: user.role });
+        } catch (error) {
+            next(error);
+        }
+    }
+ 
+ 
+}
+ 
+module.exports = UserController;
+ +
+
+ + + + + + + + \ 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..aa7cbdc --- /dev/null +++ b/server/coverage/lcov-report/server/controllers/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for server/controllers + + + + + + + + + +
+
+

All files server/controllers

+
+ +
+ 37.14% + Statements + 26/70 +
+ + +
+ 87.5% + Branches + 14/16 +
+ + +
+ 25% + Functions + 2/8 +
+ + +
+ 34.84% + Lines + 23/66 +
+ + +
+

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

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
HistoryController.js +
+
15.38%4/26100%0/00%0/215.38%4/26
UserController.js +
+
50%22/4487.5%14/1633.33%2/647.5%19/40
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/helpers/bcryptjs.js.html b/server/coverage/lcov-report/server/helpers/bcryptjs.js.html new file mode 100644 index 0000000..2530b73 --- /dev/null +++ b/server/coverage/lcov-report/server/helpers/bcryptjs.js.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for server/helpers/bcryptjs.js + + + + + + + + + +
+
+

All files / server/helpers bcryptjs.js

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

+ 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 +141x +  +1x +2x +2x +2x +  +  +1x +2x +2x +  +  +1x
const bcryptjs = require('bcryptjs');
+ 
+const bcryptHash = (req) => {
+    const salt = bcryptjs.genSaltSync(16);
+    const hash = bcryptjs.hashSync(req, salt);
+    return hash;
+}
+ 
+const bcryptCompare = (req, hashed) => {
+    const compare = bcryptjs.compareSync(req, hashed);
+    return compare;
+}
+ 
+module.exports = { bcryptHash, bcryptCompare };
+ +
+
+ + + + + + + + \ 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..f2abe11 --- /dev/null +++ b/server/coverage/lcov-report/server/helpers/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for server/helpers + + + + + + + + + +
+
+

All files server/helpers

+
+ +
+ 59.37% + Statements + 19/32 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 3/6 +
+ + +
+ 61.29% + Lines + 19/31 +
+ + +
+

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

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
bcryptjs.js +
+
100%9/9100%0/0100%2/2100%9/9
jwt.js +
+
77.77%7/9100%0/050%1/277.77%7/9
openai.js +
+
21.42%3/14100%0/00%0/223.07%3/13
+
+
+
+ + + + + + + + \ 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..e837bd9 --- /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

+
+ +
+ 77.77% + Statements + 7/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 77.77% + Lines + 7/9 +
+ + +
+

+ 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 +141x +1x +  +1x +1x +1x +  +  +1x +  +  +  +  +1x
const jwt = require('jsonwebtoken');
+const secretKey = process.env.SECRET_KEY;
+ 
+const createToken = (req) => {
+    const token = jwt.sign(req, secretKey);
+    return token;
+}
+ 
+const verifyToken = (req) => {
+    const decoded = jwt.verify(req, secretKey);
+    return decoded;
+}
+ 
+module.exports = { createToken, verifyToken };
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/helpers/openai.js.html b/server/coverage/lcov-report/server/helpers/openai.js.html new file mode 100644 index 0000000..cf1ed25 --- /dev/null +++ b/server/coverage/lcov-report/server/helpers/openai.js.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for server/helpers/openai.js + + + + + + + + + +
+
+

All files / server/helpers openai.js

+
+ +
+ 21.42% + Statements + 3/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 23.07% + Lines + 3/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 +201x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x
const generateAnsPromt = (q, answer) => {
+    let question = q.split(';;');
+    let result = `berikan nilai terhadap jawaban atas pertanyaan di bawah ini.`;
+ 
+    for (let i = 0; i < 5; i++) {
+        result += ' ' + question[i] + ' jawabannya ' + answer[i] + '. ';
+    }
+ 
+    result += 'cukup keluarkan respons dalam bentuk integer javascript. setiap jawaban benar mendapat 20 poin. Tidak perlu mengeluarkan respons deskripsi apa pun cukup integer total poinnya dalam bentuk js. cukup jawab misal 10 atau 50, tidak perlu ada deklarasi atau console log cukup angkanya saja'
+    return result;
+}
+ 
+const generateBookPromt = (desc) => {
+    let result = `berikan saya 1 buku yang menggambarkan atau yang isinya mirip atau sesuai dengan deskripsi di bawah ini. `;
+    result += ` ${desc} `
+    result += 'cukup keluarkan respons dalam bentuk string javascript. Tidak perlu mengeluarkan respons deskripsi apa pun cukup judul bukunya saja. cukup jawab misal Laskar Pelangi atau Atomic Habbits, tidak perlu ada deklarasi atau console log cukup judul bukunya saja'
+    return result;
+}
+ 
+module.exports = { generateAnsPromt, generateBookPromt };
+ +
+
+ + + + + + + + \ 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..e89618d --- /dev/null +++ b/server/coverage/lcov-report/server/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for server + + + + + + + + + +
+
+

All files server

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

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

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
app.js +
+
100%10/1050%1/2100%0/0100%10/10
+
+
+
+ + + + + + + + \ 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..5679277 --- /dev/null +++ b/server/coverage/lcov-report/server/middlewares/errorHandler.js.html @@ -0,0 +1,271 @@ + + + + + + Code coverage report for server/middlewares/errorHandler.js + + + + + + + + + +
+
+

All files / server/middlewares errorHandler.js

+
+ +
+ 48.57% + Statements + 17/35 +
+ + +
+ 41.66% + Branches + 5/12 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 47.05% + Lines + 16/34 +
+ + +
+

+ 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 +631x +  +  +8x +  +  +4x +4x +4x +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +1x
const errorHandler = {
+    handler: (error, request, response, next) => {
+        let statusCode, message;
+        switch (error.name) {
+            case 'SequelizeValidationError':
+            case 'SequelizeUniqueConstraintError':
+                statusCode = 400;
+                message = error.errors.map(er => { return er.message });
+                break;
+ 
+            case 'EmptyUsername':
+                statusCode = 400;
+                message = `Username is required`;
+                break;
+ 
+            case 'EmptyEmail':
+                statusCode = 400;
+                message = `Email is required`;
+                break;
+ 
+            case 'EmptyPassword':
+                statusCode = 400;
+                message = `Password is required`;
+                break;
+ 
+            case 'EmptyEmailPassword':
+                statusCode = 400;
+                message = `Email/Password is required`;
+                break;
+ 
+            case 'NotMatched':
+                statusCode = 401;
+                message = `Invalid Email/Password!`;
+                break;
+ 
+            case 'JsonWebTokenError':
+            case 'Unauthenticated':
+                statusCode = 401;
+                message = `Unauthenticated`;
+                break;
+ 
+            case 'Unauthorized':
+                statusCode = 403;
+                message = `You're not authorized`;
+                break;
+ 
+            case 'NotFound':
+                statusCode = 404;
+                message = `Not Found`;
+                break;
+ 
+            default:
+                statusCode = 500;
+                message = `Internal Server Error`;
+                break;
+        }
+ 
+        response.status(statusCode).json({ message });
+    }
+ 
+}
+ 
+module.exports = errorHandler;
+ +
+
+ + + + + + + + \ 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..4db0219 --- /dev/null +++ b/server/coverage/lcov-report/server/middlewares/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for server/middlewares + + + + + + + + + +
+
+

All files server/middlewares

+
+ +
+ 48.57% + Statements + 17/35 +
+ + +
+ 41.66% + Branches + 5/12 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 47.05% + Lines + 16/34 +
+ + +
+

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

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
errorHandler.js +
+
48.57%17/3541.66%5/12100%2/247.05%16/34
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/models/book.js.html b/server/coverage/lcov-report/server/models/book.js.html new file mode 100644 index 0000000..7f513d6 --- /dev/null +++ b/server/coverage/lcov-report/server/models/book.js.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for server/models/book.js + + + + + + + + + +
+
+

All files / server/models book.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 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class Book 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
+      Book.hasMany(models.History, {
+        foreignKey: 'bookId'
+      });
+    }
+  }
+  Book.init({
+    title: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          msg: `Title is required!`
+        },
+        notNull: {
+          msg: `Title is required!`
+        }
+      }
+    },
+    isbn: DataTypes.STRING,
+    author: DataTypes.STRING,
+    synopsis: DataTypes.TEXT,
+    pageCount: DataTypes.INTEGER,
+    stock: {
+      type: DataTypes.INTEGER,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          msg: `Stock is required!`
+        },
+        notNull: {
+          msg: `Stock is required!`
+        }
+      }
+    },
+    publisher: DataTypes.STRING,
+    publishedDate: DataTypes.STRING,
+    lang: DataTypes.STRING,
+    imgUrl: DataTypes.STRING,
+    status: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          msg: `Status is required!`
+        },
+        notNull: {
+          msg: `Status is required!`
+        }
+      }
+    },
+    category: DataTypes.STRING,
+    pricePerWeek: {
+      type: DataTypes.INTEGER,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          msg: `Price per week is required!`
+        },
+        notNull: {
+          msg: `Price per week is required!`
+        }
+      }
+    }
+  }, {
+    sequelize,
+    modelName: 'Book',
+  });
+  return Book;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/models/history.js.html b/server/coverage/lcov-report/server/models/history.js.html new file mode 100644 index 0000000..eb188d1 --- /dev/null +++ b/server/coverage/lcov-report/server/models/history.js.html @@ -0,0 +1,238 @@ + + + + + + Code coverage report for server/models/history.js + + + + + + + + + +
+
+

All files / server/models history.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 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class History 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
+      History.belongsTo(models.User, { foreignKey: 'userId' });
+      History.belongsTo(models.Book, { foreignKey: 'bookId' });
+    }
+  }
+  History.init({
+    bookId: DataTypes.INTEGER,
+    userId: {
+      type: DataTypes.INTEGER,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          msg: `User is required!`
+        },
+        notNull: {
+          msg: `User is required!`
+        }
+      }
+    },
+    qna : DataTypes.TEXT,
+    question : DataTypes.TEXT,
+    point : DataTypes.TEXT,
+    status: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          msg: `Status is required!`
+        },
+        notNull: {
+          msg: `Status is required!`
+        }
+      }
+    },
+  }, {
+    sequelize,
+    modelName: 'History',
+  });
+  return History;
+};
+ +
+
+ + + + + + + + \ 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..b1cd424 --- /dev/null +++ b/server/coverage/lcov-report/server/models/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for server/models + + + + + + + + + +
+
+

All files server/models

+
+ +
+ 98.11% + Statements + 52/53 +
+ + +
+ 66.66% + Branches + 8/12 +
+ + +
+ 100% + Functions + 13/13 +
+ + +
+ 98.11% + Lines + 52/53 +
+ + +
+

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

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
book.js +
+
100%5/5100%0/0100%2/2100%5/5
history.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%9/9100%0/0100%3/3100%9/9
userdetail.js +
+
100%12/1250%1/2100%3/3100%12/12
+
+
+
+ + + + + + + + \ 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..2539837 --- /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  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +  +  +1x +  +  +1x +  +  +5x +  +  +  +  +  +  +  +4x +4x +  +  +1x +4x +4x +  +  +  +1x +1x +  +1x + 
'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..3c7f2b5 --- /dev/null +++ b/server/coverage/lcov-report/server/models/user.js.html @@ -0,0 +1,379 @@ + + + + + + Code coverage report for server/models/user.js + + + + + + + + + +
+
+

All files / server/models user.js

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ 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 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +2x +  +  +1x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+const { bcryptHash } = require('../helpers/bcryptjs');
+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.hasOne(models.UserDetail, {
+        foreignKey: 'userId',
+        onDelete: 'CASCADE'
+      });
+      User.hasMany(models.History, {
+        foreignKey: 'userId',
+        onDelete: 'CASCADE'
+      });
+    }
+  }
+  User.init({
+    username: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          msg: `Username is required!`
+        },
+        notNull: {
+          msg: `Username is required!`
+        }
+      }
+    },
+    email: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      unique : true,
+      validate : {
+        notNull : {
+          msg : `Email is required!`
+        },
+        notEmpty : {
+          msg : `Email is required!`
+        },
+        isEmail : {
+          msg : `Must be an email!`
+        }
+      }
+    },
+    password: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate : {
+        notNull : {
+          msg : `Password is required!`
+        },
+        notEmpty : {
+          msg : `Password is required!`
+        },
+        len : {
+          args: [5, Infinity],
+          msg: "Password must be at least 5 characters!"
+        }
+      }
+    },
+    role: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          msg: `Role is required!`
+        },
+        notNull: {
+          msg: `Role is required!`
+        }
+      }
+    },
+    accountType: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        isIn: [['manual', 'github']], 
+      } 
+    }
+  }, {
+    sequelize,
+    modelName: 'User',
+  });
+ 
+  User.beforeCreate((user) => {
+    user.password = bcryptHash(user.password);
+  });
+ 
+  return User;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/models/userdetail.js.html b/server/coverage/lcov-report/server/models/userdetail.js.html new file mode 100644 index 0000000..94123d7 --- /dev/null +++ b/server/coverage/lcov-report/server/models/userdetail.js.html @@ -0,0 +1,259 @@ + + + + + + Code coverage report for server/models/userdetail.js + + + + + + + + + +
+
+

All files / server/models userdetail.js

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ 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  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +1x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class UserDetail 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
+      UserDetail.belongsTo(models.User, { foreignKey: 'userId' });
+    }
+  }
+  UserDetail.init({
+    userId: {
+      type: DataTypes.INTEGER,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          msg: `User is required!`
+        },
+        notNull: {
+          msg: `User is required!`
+        }
+      }
+    },
+    name: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          msg: `Name is required!`
+        },
+        notNull: {
+          msg: `Name is required!`
+        }
+      }
+    },
+    inumber: DataTypes.STRING,
+    address: DataTypes.TEXT,
+    gender: DataTypes.STRING
+  }, {
+    sequelize,
+    modelName: 'UserDetail',
+  });
+ 
+  UserDetail.beforeCreate((user) => {
+    let inumber = 'M-';
+    inumber += new Date().getFullYear() + `-`;
+    inumber += user.id + '-';
+    user.gender ? inumber += 'F-' : inumber += 'M-';
+    inumber += 'IPUSTAKA'
+    user.inumber = inumber;
+  });
+  return UserDetail;
+};
+ +
+
+ + + + + + + + \ 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..abd172e --- /dev/null +++ b/server/coverage/lcov-report/server/routes/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for server/routes + + + + + + + + + +
+
+

All files server/routes

+
+ +
+ 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. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js +
+
100%11/11100%0/0100%0/0100%11/11
+
+
+
+ + + + + + + + \ 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..5d7f20b --- /dev/null +++ b/server/coverage/lcov-report/server/routes/index.js.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for server/routes/index.js + + + + + + + + + +
+
+

All files / server/routes index.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 +141x +1x +1x +1x +1x +  +1x +1x +  +1x +1x +1x +  +1x
const express = require('express');
+const HistoryController = require('../controllers/HistoryController');
+const UserController = require('../controllers/UserController');
+const errorHandler = require('../middlewares/errorHandler');
+const router = express.Router();
+ 
+router.post('/register', UserController.create);
+router.post('/login', UserController.login);
+ 
+router.get('/questions', HistoryController.create); 
+router.put('/questions', HistoryController.update); 
+router.use(errorHandler.handler);
+ 
+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..472945f --- /dev/null +++ b/server/coverage/lcov.info @@ -0,0 +1,422 @@ +TN: +SF:app.js +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:14,1 +LF:10 +LH:10 +BRDA:1,0,0,1 +BRDA:1,0,1,0 +BRF:2 +BRH:1 +end_of_record +TN: +SF:controllers\HistoryController.js +FN:6,(anonymous_0) +FN:32,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +DA:1,1 +DA:2,1 +DA:3,1 +DA:7,0 +DA:8,0 +DA:9,0 +DA:13,0 +DA:16,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:27,0 +DA:28,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:38,0 +DA:42,0 +DA:48,0 +DA:49,0 +DA:51,0 +DA:53,0 +DA:54,0 +DA:60,1 +LF:26 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:controllers\UserController.js +FN:6,(anonymous_0) +FN:20,(anonymous_1) +FN:36,(anonymous_2) +FN:48,(anonymous_3) +FN:66,(anonymous_4) +FN:77,(anonymous_5) +FNF:6 +FNH:2 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:5,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:5,(anonymous_5) +DA:1,1 +DA:2,1 +DA:3,1 +DA:7,0 +DA:8,0 +DA:14,0 +DA:16,0 +DA:21,0 +DA:22,0 +DA:28,0 +DA:30,0 +DA:32,0 +DA:37,5 +DA:38,5 +DA:39,5 +DA:40,1 +DA:42,1 +DA:44,4 +DA:49,0 +DA:50,0 +DA:51,0 +DA:57,0 +DA:58,0 +DA:60,0 +DA:62,0 +DA:67,0 +DA:68,0 +DA:70,0 +DA:71,0 +DA:73,0 +DA:78,5 +DA:79,5 +DA:80,5 +DA:81,4 +DA:83,3 +DA:84,3 +DA:86,1 +DA:87,1 +DA:89,4 +DA:96,1 +LF:40 +LH:19 +BRDA:28,0,0,0 +BRDA:28,0,1,0 +BRDA:37,1,0,5 +BRDA:37,2,0,5 +BRDA:80,3,0,1 +BRDA:80,3,1,4 +BRDA:80,4,0,5 +BRDA:80,4,1,4 +BRDA:81,5,0,1 +BRDA:81,5,1,3 +BRDA:81,6,0,4 +BRDA:81,6,1,3 +BRDA:84,7,0,2 +BRDA:84,7,1,1 +BRDA:84,8,0,3 +BRDA:84,8,1,2 +BRF:16 +BRH:14 +end_of_record +TN: +SF:helpers\bcryptjs.js +FN:3,(anonymous_0) +FN:9,(anonymous_1) +FNF:2 +FNH:2 +FNDA:2,(anonymous_0) +FNDA:2,(anonymous_1) +DA:1,1 +DA:3,1 +DA:4,2 +DA:5,2 +DA:6,2 +DA:9,1 +DA:10,2 +DA:11,2 +DA:14,1 +LF:9 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:helpers\jwt.js +FN:4,(anonymous_0) +FN:9,(anonymous_1) +FNF:2 +FNH:1 +FNDA:1,(anonymous_0) +FNDA:0,(anonymous_1) +DA:1,1 +DA:2,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:9,1 +DA:10,0 +DA:11,0 +DA:14,1 +LF:9 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:helpers\openai.js +FN:1,(anonymous_0) +FN:13,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +DA:1,1 +DA:2,0 +DA:3,0 +DA:5,0 +DA:6,0 +DA:9,0 +DA:10,0 +DA:13,1 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:20,1 +LF:13 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:middlewares\errorHandler.js +FN:2,(anonymous_0) +FN:8,(anonymous_1) +FNF:2 +FNH:2 +FNDA:8,(anonymous_0) +FNDA:4,(anonymous_1) +DA:1,1 +DA:4,8 +DA:7,4 +DA:8,4 +DA:9,4 +DA:12,0 +DA:13,0 +DA:14,0 +DA:17,1 +DA:18,1 +DA:19,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:27,0 +DA:28,0 +DA:29,0 +DA:32,2 +DA:33,2 +DA:34,2 +DA:38,0 +DA:39,0 +DA:40,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:58,8 +DA:63,1 +LF:34 +LH:16 +BRDA:4,0,0,3 +BRDA:4,0,1,4 +BRDA:4,0,2,0 +BRDA:4,0,3,1 +BRDA:4,0,4,1 +BRDA:4,0,5,0 +BRDA:4,0,6,2 +BRDA:4,0,7,0 +BRDA:4,0,8,0 +BRDA:4,0,9,0 +BRDA:4,0,10,0 +BRDA:4,0,11,0 +BRF:12 +BRH:5 +end_of_record +TN: +SF:models\book.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:2 +FNDA:1,(anonymous_0) +FNDA:1,(anonymous_1) +DA:4,1 +DA:5,1 +DA:14,1 +DA:19,1 +DA:81,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:models\history.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:2 +FNDA:1,(anonymous_0) +FNDA:1,(anonymous_1) +DA:4,1 +DA:5,1 +DA:14,1 +DA:15,1 +DA:18,1 +DA:51,1 +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:5,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:4,(anonymous_2) +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:13,1 +DA:14,0 +DA:16,1 +DA:19,1 +DA:22,5 +DA:30,4 +DA:31,4 +DA:34,1 +DA:35,4 +DA:36,4 +DA:40,1 +DA:41,1 +DA:43,1 +LF:21 +LH:20 +BRDA:8,0,0,1 +BRDA:8,0,1,0 +BRDA:13,1,0,0 +BRDA:13,1,1,1 +BRDA:23,2,0,5 +BRDA:23,2,1,5 +BRDA:23,2,2,4 +BRDA:23,2,3,4 +BRDA:35,3,0,4 +BRDA:35,3,1,0 +BRF:10 +BRH:7 +end_of_record +TN: +SF:models\user.js +FN:6,(anonymous_0) +FN:13,(anonymous_1) +FN:94,(anonymous_2) +FNF:3 +FNH:3 +FNDA:1,(anonymous_0) +FNDA:1,(anonymous_1) +FNDA:2,(anonymous_2) +DA:4,1 +DA:5,1 +DA:6,1 +DA:15,1 +DA:19,1 +DA:25,1 +DA:94,1 +DA:95,2 +DA:98,1 +LF:9 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:models\userdetail.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FN:50,(anonymous_2) +FNF:3 +FNH:3 +FNDA:1,(anonymous_0) +FNDA:1,(anonymous_1) +FNDA:1,(anonymous_2) +DA:4,1 +DA:5,1 +DA:14,1 +DA:17,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:58,1 +LF:12 +LH:12 +BRDA:54,0,0,0 +BRDA:54,0,1,1 +BRF:2 +BRH:1 +end_of_record +TN: +SF:routes\index.js +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:7,1 +DA:8,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:14,1 +LF:11 +LH:11 +BRF:0 +BRH:0 +end_of_record diff --git a/server/middlewares/authentication.js b/server/middlewares/authentication.js index aff4f6b..77dc2bf 100644 --- a/server/middlewares/authentication.js +++ b/server/middlewares/authentication.js @@ -2,10 +2,10 @@ const { verifyToken } = require("../helpers/jwt"); const { User } = require("../models"); -const authentication = async (request, response, next) => { +const authentication = async (req, res, next) => { try { - if (!request.headers.authorization) throw ({ name: "Unauthenticated" }); - const token = request.headers.authorization.split(' ').at(-1); + if (!req.headers.authorization) throw ({ name: "Unauthenticated" }); + const token = req.headers.authorization.split(' ').at(-1); if (!token) throw ({ name: "Unauthenticated" }); @@ -13,7 +13,7 @@ const authentication = async (request, response, next) => { const user = await User.findByPk(id); if (!user) throw ({ name: "Unauthenticated" }); - request.user = { + req.user = { id: user.id, email: user.email, role: user.role diff --git a/server/middlewares/authorization.js b/server/middlewares/authorization.js index d47fe2a..ba3e094 100644 --- a/server/middlewares/authorization.js +++ b/server/middlewares/authorization.js @@ -1,9 +1,9 @@ const { User, Book } = require("../models"); const authorization = { - AdminOnly: async (request, response, next) => { + AdminOnly: async (req, res, next) => { try { - const user = await User.findByPk(request.user.id); + const user = await User.findByPk(req.user.id); if (!user) throw ({ name: "Unauthorized" }); if (user.role !== 'admin') throw ({ name: "Unauthorized" }); diff --git a/server/middlewares/errorHandler.js b/server/middlewares/errorHandler.js index 4c04676..f4946c5 100644 --- a/server/middlewares/errorHandler.js +++ b/server/middlewares/errorHandler.js @@ -1,66 +1,63 @@ const errorHandler = { - handler : (error, request, response, next) => { + handler: (error, request, response, next) => { let statusCode, message; - switch (error.name) { - case 'SequelizeValidationError': - case 'SequelizeUniqueConstraintError': - statusCode = 400; - message = error.errors.map(er => { - return er.message; - }); - break; - - case 'EmptyUsername': - statusCode = 400; - message = `Username is required`; - break; - - case 'EmptyEmail': - statusCode = 400; - message = `Email is required`; - break; - - case 'EmptyPassword': - statusCode = 400; - message = `Password is required`; - break; - - case 'EmptyEmailPassword': - statusCode = 400; - message = `Email/Password is required`; - break; - - case 'NotMatched': - statusCode = 401; - message = `Invalid Email/Password!`; - break; - - case 'JsonWebTokenError': - case 'Unauthenticated': - statusCode = 401; - message = `Unauthenticated`; - break; - - case 'Unauthorized': - statusCode = 403; - message = `You're not authorized`; - break; - - case 'NotFound': - statusCode = 404; - message = `Not Found`; - break; - - default: - statusCode = 500; - message = `Internal Server Error`; - break; + case 'SequelizeValidationError': + case 'SequelizeUniqueConstraintError': + statusCode = 400; + message = error.errors.map(er => { return er.message }); + break; + + case 'EmptyUsername': + statusCode = 400; + message = `Username is required`; + break; + + case 'EmptyEmail': + statusCode = 400; + message = `Email is required`; + break; + + case 'EmptyPassword': + statusCode = 400; + message = `Password is required`; + break; + + case 'EmptyEmailPassword': + statusCode = 400; + message = `Email/Password is required`; + break; + + case 'NotMatched': + statusCode = 401; + message = `Invalid Email/Password!`; + break; + + case 'JsonWebTokenError': + case 'Unauthenticated': + statusCode = 401; + message = `Unauthenticated`; + break; + + case 'Unauthorized': + statusCode = 403; + message = `You're not authorized`; + break; + + case 'NotFound': + statusCode = 404; + message = `Not Found`; + break; + + default: + statusCode = 500; + message = `Internal Server Error`; + break; } response.status(statusCode).json({ message }); } - + } module.exports = errorHandler; \ No newline at end of file diff --git a/server/migrations/20231113173218-create-user-detail.js b/server/migrations/20231113173218-create-user-detail.js index fc64890..1a7912e 100644 --- a/server/migrations/20231113173218-create-user-detail.js +++ b/server/migrations/20231113173218-create-user-detail.js @@ -22,8 +22,7 @@ module.exports = { allowNull: false }, inumber: { - type: Sequelize.STRING, - allowNull: false + type: Sequelize.STRING }, address: { type: Sequelize.TEXT diff --git a/server/models/userdetail.js b/server/models/userdetail.js index fa9ee03..4b3443d 100644 --- a/server/models/userdetail.js +++ b/server/models/userdetail.js @@ -39,18 +39,7 @@ module.exports = (sequelize, DataTypes) => { } } }, - inumber: { - type: DataTypes.STRING, - allowNull: false, - validate: { - notEmpty: { - msg: `Inumber is required!` - }, - notNull: { - msg: `Inumber is required!` - } - } - }, + inumber: DataTypes.STRING, address: DataTypes.TEXT, gender: DataTypes.STRING }, { @@ -58,14 +47,13 @@ module.exports = (sequelize, DataTypes) => { modelName: 'UserDetail', }); - UserDetail.beforeCreate((userDetail) => { + UserDetail.beforeCreate((user) => { let inumber = 'M-'; inumber += new Date().getFullYear() + `-`; - inumber += userDetail.id + '-'; - userDetail.gender ? inumber += 'F-' : inumber += 'M-'; + inumber += user.id + '-'; + user.gender ? inumber += 'F-' : inumber += 'M-'; inumber += 'IPUSTAKA' - userDetail.inumber = inumber; + user.inumber = inumber; }); - return UserDetail; }; \ No newline at end of file diff --git a/server/routes/index.js b/server/routes/index.js index 5a525e2..ebdb4e7 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -1,9 +1,14 @@ const express = require('express'); const HistoryController = require('../controllers/HistoryController'); +const UserController = require('../controllers/UserController'); +const errorHandler = require('../middlewares/errorHandler'); const router = express.Router(); +router.post('/register', UserController.create); +router.post('/login', UserController.login); + router.get('/questions', HistoryController.create); router.put('/questions', HistoryController.update); - +router.use(errorHandler.handler); module.exports = router; \ No newline at end of file From 4522e2ff839fe98eeb221579215adaa43b8606bb Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Tue, 14 Nov 2023 22:53:47 +0700 Subject: [PATCH 11/27] Add CRUD feature of book entity --- server/controllers/BookController.js | 105 +++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 server/controllers/BookController.js diff --git a/server/controllers/BookController.js b/server/controllers/BookController.js new file mode 100644 index 0000000..072f684 --- /dev/null +++ b/server/controllers/BookController.js @@ -0,0 +1,105 @@ +const { Op } = require('sequelize'); +const { Book, User, sequelize } = require('../models'); +const cloudinary = require('cloudinary').v2; +const { randomUUID } = require('crypto'); +cloudinary.config({ + cloud_name: process.env.CLOUD_NAME, + api_key: process.env.API_KEY_CLOUDINARY, + api_secret: process.env.API_SECRET_CLOUDINARY +}); + +class BookController { + static async getAll(req, res, next) { + let { filter, page = 1, q, sortBy, limit } = req.query; + + let queryOptions = { + attributes: ['id', 'name', 'description', 'price', 'imageUrl', 'categoryId', 'authorId'], + limit: 12, + offset: 0, + where: {} + }; + + if (filter && filter !== '') { + if (filter.category !== '' && typeof filter.category !== 'undefined') { + const categoriesId = filter.category + .split(',') + .map((i) => ({ + [Op.eq]: i + })); + + if (queryOptions.where) queryOptions.where.categoryId = { [Op.or]: categoriesId }; + } + } + + page = +page ?? 1; + if (q !== '' && typeof q !== 'undefined') queryOptions.where.name = { [Op.iLike]: `%${q}%` }; + if (limit !== '' && typeof limit !== 'undefined') queryOptions.limit = limit; + if (sortBy !== '' && typeof sortBy !== 'undefined') queryOptions.order = [['createdAt', sortBy]]; + + queryOptions.offset = (page - 1) * queryOptions.limit; + + try { + const books = await Book.findAndCountAll(queryOptions); + const datas = { + books: books.rows, + totalPages: Math.ceil(books.count / queryOptions.limit), + totalDatas: books.count, + totalDataThisPage: books.rows.length, + currentPage: page + } + res.status(200).json(datas); + } catch (error) { + console.log(error); + next(error); + } + } + + static async getById(req, res, next) { + try { + const book = await Book.findByPk(req.params.id); + if (!book) throw ({ name: "NotFound" }); + res.status(200).json(book); + } catch (error) { + next(error); + } + } + + static async create(req, res, next) { + const { title, isbn, author, synopsis, pageCount, stock, publisher, publishedDate, lang, imgUrl, status, category, pricePerWeek } = req.body; + try { + const book = await Book.create({ title, isbn, author, synopsis, pageCount, stock, publisher, publishedDate, lang, imgUrl, status, category, pricePerWeek }); + res.status(201).json(book); + } catch (error) { + next(error); + } + } + + static async update(req, res, next) { + const { title, isbn, author, synopsis, pageCount, stock, publisher, publishedDate, lang, imgUrl, status, category, pricePerWeek } = req.body; + try { + let book = await Book.findByPk(req.params.id); + if (!book) throw ({ name: "NotFound" }); + + await book.update({ title, isbn, author, synopsis, pageCount, stock, publisher, publishedDate, lang, imgUrl, status, category, pricePerWeek }); + res.status(200).json(book); + } catch (error) { + next(error); + } + } + + static async delete(req, res, next) { + try { + let book = await Book.findByPk(req.params.id); + + if (!book) throw ({ name: "NotFound" }); + + await book.destroy(); + res.status(200).json({ message: `Book with id: ${book.id} success to delete` }); + } catch (error) { + next(error); + } + } + +} + +module.exports = BookController; \ No newline at end of file From 160826f24dbf19813ae6d9a990ee59061cd4ffff Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Wed, 15 Nov 2023 00:53:50 +0700 Subject: [PATCH 12/27] Add find book function that integrated with Google Books api --- server/controllers/BookController.js | 35 ++++++++++--- server/controllers/HistoryController.js | 51 ++++++++----------- server/helpers/googlebooks.js | 36 +++++++++++++ server/helpers/openai.js | 18 ++++++- server/jsons/fetchDatas.js | 50 ++++-------------- .../20231113173602-create-history.js | 2 +- server/models/history.js | 2 +- 7 files changed, 113 insertions(+), 81 deletions(-) create mode 100644 server/helpers/googlebooks.js diff --git a/server/controllers/BookController.js b/server/controllers/BookController.js index 072f684..ecc6339 100644 --- a/server/controllers/BookController.js +++ b/server/controllers/BookController.js @@ -1,12 +1,7 @@ const { Op } = require('sequelize'); const { Book, User, sequelize } = require('../models'); -const cloudinary = require('cloudinary').v2; -const { randomUUID } = require('crypto'); -cloudinary.config({ - cloud_name: process.env.CLOUD_NAME, - api_key: process.env.API_KEY_CLOUDINARY, - api_secret: process.env.API_SECRET_CLOUDINARY -}); +const { generateBookPromt, chatAI } = require('../helpers/openai'); +const { fetchGBooks } = require('../helpers/googlebooks'); class BookController { static async getAll(req, res, next) { @@ -100,6 +95,32 @@ class BookController { } } + static async findBook(req, res, next) { + const { desc } = req.body; + try { + const promt = generateBookPromt(desc); + const bookTitle = chatAI(promt); + const books = await fetchGBooks(bookTitle, 1); + let book = books[0]; + + const existingBook = await Book.findOne({ + where: { + [Op.and]: [ + { title: book.title }, + { isbn: book.isbn } + ] + } + }); + + !existingBook ? await Book.create(book) : book = existingBook; + let code = existingBook ? 200 : 201; + + res.status(code).json({ message: 'Successfully find book', data: book }); + } catch (error) { + next(error); + } + } + } module.exports = BookController; \ No newline at end of file diff --git a/server/controllers/HistoryController.js b/server/controllers/HistoryController.js index 9b3dfc1..a5a1d02 100644 --- a/server/controllers/HistoryController.js +++ b/server/controllers/HistoryController.js @@ -1,60 +1,49 @@ const OpenAI = require('openai'); const { History } = require('../models'); -const { generateAnsPromt } = require('../helpers/openai'); +const { generateAnsPromt, chatAI } = require('../helpers/openai'); class HistoryController { static async create(req, res, next) { try { const history = await History.create({ userId: req.user.id, status: 'unpaid' }); - const openai = new OpenAI({ - apiKey: process.env.OpenAI_KEY - }); - const question = `randomize saya 5 pertanyaan yang jawabannya cukup ya atau tidak mengenai topik pemrograman khususnya materi dasar javascript, reactjs, dan express js cukup pertanyaan mudah dan singkat untuk junior programmer atau bahkan orang awam. cukup jawab tanpa deskripsi apa pun cukup dengan format seperti di bawah ini di mana 5 pertanyaan tersebut dalam 1 array! perhatikan dengan benar format di bawah ini! dan jangan berikan respons dalam bentuk list di list format responsnya harus seperti ini, perhatikan! pertanyaan1;;pertanyaan 2;;pertanyaan3`; - - const { choices } = await openai.chat.completions.create({ - model: 'gpt-3.5-turbo', - messages: [{ "role": "user", "content": question }], - max_tokens: 210 - }); - - let questions = choices[0].message.content; + let questions = chatAI(question); history.update({ question: questions }); questions = questions.split(';;'); - res.status(201).json({ messages: `Successfully create history`, data: questions }); + res.status(201).json({ messages: `Successfully create history`, data: { questions, historyId: history.id } }); } catch (error) { console.log(error); next(error); } } - static async update(req, res, next) { - const { answer, historyId } = req.body + static async updatePoin(req, res, next) { + const { answer } = req.body; + const historyId = req.params.historyId; try { const history = History.findByPk(historyId); const promt = generateAnsPromt(history.question, answer); + let point = chatAI(promt); + history.update({ point: +point, answer: answer.join(";;") }); + res.status(200).json({ messages: `Successfully get point`, data: +point }); + } catch (error) { + console.log(error); + next(error); + } + } - const openai = new OpenAI({ - apiKey: process.env.OpenAI_KEY - }); - - const { choices } = await openai.chat.completions.create({ - model: 'gpt-3.5-turbo', - messages: [{ "role": "user", "content": promt }], - max_tokens: 210 - }); - - let questions = choices[0].message.content; - history.update({ point: +questions }); - - res.status(200).json({ messages: `Successfully get point`, data: questions }); + static async updateBookId(req, res, next) { + const { historyId, bookId } = req.params.historyId; + try { + const history = History.findByPk(historyId); + history.update({ bookId }); + res.status(200).json({ messages: `Successfully update book` }); } catch (error) { console.log(error); next(error); } } - } module.exports = HistoryController; \ No newline at end of file diff --git a/server/helpers/googlebooks.js b/server/helpers/googlebooks.js new file mode 100644 index 0000000..2f0f1a3 --- /dev/null +++ b/server/helpers/googlebooks.js @@ -0,0 +1,36 @@ +const axios = require('axios'); + +const fetchGBooks = async (query, maxResults) => { + const response = await axios.get('https://www.googleapis.com/books/v1/volumes', { + params: { + key: process.env.GOOGLE_BOOKS_API_KEY, + q: query, + country: 'ID', + maxResults, + printType: 'books', + }, + }); + + const items = response.data.items || []; + + return items.map(item => { + const { title, authors, publisher, publishedDate, description, industryIdentifiers, pageCount, categories, imageLinks, language } = item.volumeInfo; + return { + title, + isbn: industryIdentifiers ? industryIdentifiers[0].identifier : '-', + author: authors ? authors.join(', ') : '-', + synopsis: description, + pageCount, + stock: Math.ceil(Math.random() * 5), + publisher, + publishedDate, + lang: language, + imgUrl: imageLinks.thumbnail, + status: 'available', + category: categories ? categories.join(', ') : '-', + pricePerWeek: Math.ceil(Math.random() * 1000 * 5) + }; + }); +}; + +module.exports = { fetchGBooks }; \ No newline at end of file diff --git a/server/helpers/openai.js b/server/helpers/openai.js index 0ce6cfb..04d4abb 100644 --- a/server/helpers/openai.js +++ b/server/helpers/openai.js @@ -1,3 +1,19 @@ +const OpenAI = require('openai'); + +const chatAI = async (req) => { + const openai = new OpenAI({ + apiKey: process.env.OpenAI_KEY + }); + + const { choices } = await openai.chat.completions.create({ + model: 'gpt-3.5-turbo', + messages: [{ "role": "user", "content": req }], + max_tokens: 100 + }); + + return choices[0].message.content; +} + const generateAnsPromt = (q, answer) => { let question = q.split(';;'); let result = `berikan nilai terhadap jawaban atas pertanyaan di bawah ini.`; @@ -17,4 +33,4 @@ const generateBookPromt = (desc) => { return result; } -module.exports = { generateAnsPromt, generateBookPromt }; \ No newline at end of file +module.exports = { chatAI, generateAnsPromt, generateBookPromt }; \ No newline at end of file diff --git a/server/jsons/fetchDatas.js b/server/jsons/fetchDatas.js index fc484c3..8c62c8f 100644 --- a/server/jsons/fetchDatas.js +++ b/server/jsons/fetchDatas.js @@ -1,57 +1,27 @@ // require('dotenv').config(); const axios = require('axios'); const fs = require('fs'); +const { fetchGBooks } = require('../helpers/googlebooks'); async function fetchGoogleBooks() { try { - const fetchData = async (query, maxResults) => { - const response = await axios.get('https://www.googleapis.com/books/v1/volumes', { - params: { - key: process.env.GOOGLE_BOOKS_API_KEY, - q: query, - country: 'ID', - maxResults, - printType: 'books', - }, - }); - - const items = response.data.items || []; - - return items.map(item => { - const { title, authors, publisher, publishedDate, description, industryIdentifiers, pageCount, categories, imageLinks, language } = item.volumeInfo; - return { - title, - isbn: industryIdentifiers ? industryIdentifiers[0].identifier : '-', - author: authors ? authors.join(', ') : '-', - synopsis: description, - pageCount, - stock: Math.ceil(Math.random() * 5), - publisher, - publishedDate, - lang: language, - imgUrl: imageLinks.thumbnail, - status: 'available', - category: categories ? categories.join(', ') : '-', - pricePerWeek: Math.ceil(Math.random() * 1000 * 5) - }; - }); - }; - - const jsBooks = await fetchData('javascript', 20); - const reactBooks = await fetchData('react', 20); - const randomBooks = await fetchData('bio', 40); - + const jsBooks = await fetchGBooks('javascript', 20); + const reactBooks = await fetchGBooks('react', 20); + const randomBooks = await fetchGBooks('bio', 40); const books = [...jsBooks, ...reactBooks, ...randomBooks]; - const allBooks = JSON.stringify(books, null, 2); fs.writeFileSync('./jsons/books.json', allBooks); - console.log('Data berhasil disimpan ke books.json'); } catch (error) { console.error(error); } } - +const test = async () => { + const a = await fetchGBooks('mantappu jiwa', 1); + console.log(a) + return a; +}; +test(); // fetchGoogleBooks(); // module.exports = fetchGoogleBooks; \ No newline at end of file diff --git a/server/migrations/20231113173602-create-history.js b/server/migrations/20231113173602-create-history.js index f443e8d..5bd85fa 100644 --- a/server/migrations/20231113173602-create-history.js +++ b/server/migrations/20231113173602-create-history.js @@ -24,7 +24,7 @@ module.exports = { key: 'id' } }, - qna: { + answer: { type: Sequelize.TEXT, }, question: { diff --git a/server/models/history.js b/server/models/history.js index 1a401a4..7859ccf 100644 --- a/server/models/history.js +++ b/server/models/history.js @@ -29,7 +29,7 @@ module.exports = (sequelize, DataTypes) => { } } }, - qna : DataTypes.TEXT, + answer : DataTypes.TEXT, question : DataTypes.TEXT, point : DataTypes.TEXT, status: { From 690d47feb59f0081e089d66238a75aa80eee5536 Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Wed, 15 Nov 2023 02:13:34 +0700 Subject: [PATCH 13/27] Add routing for books, auth, users, and histories --- server/controllers/BookController.js | 9 ++++--- server/controllers/HistoryController.js | 11 +++++--- server/controllers/UserController.js | 35 +++++++++++++++++-------- server/routes/index.js | 11 ++++++-- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/server/controllers/BookController.js b/server/controllers/BookController.js index ecc6339..6635f7f 100644 --- a/server/controllers/BookController.js +++ b/server/controllers/BookController.js @@ -6,14 +6,16 @@ const { fetchGBooks } = require('../helpers/googlebooks'); class BookController { static async getAll(req, res, next) { let { filter, page = 1, q, sortBy, limit } = req.query; - + const { userId } = req.params; let queryOptions = { - attributes: ['id', 'name', 'description', 'price', 'imageUrl', 'categoryId', 'authorId'], + attributes: ['title', 'isbn', 'author', 'synopsis', 'pageCount', 'stock', 'publisher', 'publishedDate', 'lang', 'imgUrl', 'status', 'category', 'pricePerWeek'], limit: 12, offset: 0, where: {} }; + if (userId) queryOptions.where.userId = userId; + if (filter && filter !== '') { if (filter.category !== '' && typeof filter.category !== 'undefined') { const categoriesId = filter.category @@ -83,8 +85,9 @@ class BookController { } static async delete(req, res, next) { + const { bookId } = req.params; try { - let book = await Book.findByPk(req.params.id); + let book = await Book.findByPk(bookId); if (!book) throw ({ name: "NotFound" }); diff --git a/server/controllers/HistoryController.js b/server/controllers/HistoryController.js index a5a1d02..ecd151c 100644 --- a/server/controllers/HistoryController.js +++ b/server/controllers/HistoryController.js @@ -4,14 +4,17 @@ const { generateAnsPromt, chatAI } = require('../helpers/openai'); class HistoryController { static async create(req, res, next) { + const { bookId } = req.params try { - const history = await History.create({ userId: req.user.id, status: 'unpaid' }); + const history = await History.create({ userId: req.user.id, status: 'unpaid', bookId }); const question = `randomize saya 5 pertanyaan yang jawabannya cukup ya atau tidak mengenai topik pemrograman khususnya materi dasar javascript, reactjs, dan express js cukup pertanyaan mudah dan singkat untuk junior programmer atau bahkan orang awam. cukup jawab tanpa deskripsi apa pun cukup dengan format seperti di bawah ini di mana 5 pertanyaan tersebut dalam 1 array! perhatikan dengan benar format di bawah ini! dan jangan berikan respons dalam bentuk list di list format responsnya harus seperti ini, perhatikan! pertanyaan1;;pertanyaan 2;;pertanyaan3`; let questions = chatAI(question); history.update({ question: questions }); questions = questions.split(';;'); - res.status(201).json({ messages: `Successfully create history`, data: { questions, historyId: history.id } }); + res.status(201).json({ + messages: `Successfully create history`, data: { questions, historyId: history.id } + }); } catch (error) { console.log(error); next(error); @@ -20,7 +23,7 @@ class HistoryController { static async updatePoin(req, res, next) { const { answer } = req.body; - const historyId = req.params.historyId; + const { historyId } = req.params; try { const history = History.findByPk(historyId); const promt = generateAnsPromt(history.question, answer); @@ -34,7 +37,7 @@ class HistoryController { } static async updateBookId(req, res, next) { - const { historyId, bookId } = req.params.historyId; + const { historyId, bookId } = req.params; try { const history = History.findByPk(historyId); history.update({ bookId }); diff --git a/server/controllers/UserController.js b/server/controllers/UserController.js index 05386ef..91cb1d0 100644 --- a/server/controllers/UserController.js +++ b/server/controllers/UserController.js @@ -1,14 +1,25 @@ const { bcryptCompare } = require("../helpers/bcryptjs"); const { createToken } = require("../helpers/jwt"); -const { User, UserDetail } = require("../models"); +const { User, UserDetail, History } = require("../models"); class UserController { - static async getAll(request, response) { + static async getTopThree(request, response) { try { const users = await User.findAndCountAll({ - include: { - model: UserDetail - } + include: [ + { model: UserDetail }, + { + model: History, + attributes: [ + [sequelize.fn('SUM', sequelize.col('point')), 'totalPoints'] + ], + group: ['userId'], + }, + ], + order: [ + [sequelize.literal('totalPoints DESC')], + ], + limit: 3, }); response.status(200).json(users); @@ -20,9 +31,11 @@ class UserController { static async getById(request, response, next) { try { const user = await User.findByPk(request.params.id, { - include: { - model: UserDetail - } + include: [ + { model: UserDetail }, + { model: History }, + ] + }); if (!user) throw ({ name: "NotFound" }); @@ -37,8 +50,8 @@ class UserController { const { username, email, password, role = 'member', accountType = 'manual', name, address, gender } = request.body; try { const user = await User.create({ username, email, password, role, accountType }); - await UserDetail.create({ userId: user.id, name, address, gender}); - + await UserDetail.create({ userId: user.id, name, address, gender }); + response.status(201).json({ id: user.id, email: user.email, role: user.role }); } catch (error) { next(error); @@ -79,7 +92,7 @@ class UserController { try { if (!email || email === "") throw ({ name: `EmptyEmail` }); if (!password || password === "") throw ({ name: `EmptyPassword` }); - + const user = await User.findOne({ where: { email } }); if (!user || !bcryptCompare(password, user.password)) throw ({ name: "NotMatched" }); diff --git a/server/routes/index.js b/server/routes/index.js index ebdb4e7..e8d981d 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -2,13 +2,20 @@ const express = require('express'); const HistoryController = require('../controllers/HistoryController'); const UserController = require('../controllers/UserController'); const errorHandler = require('../middlewares/errorHandler'); +const authentication = require('../middlewares/authentication'); +const authorization = require('../middlewares/authorization'); +const BookController = require('../controllers/BookController'); const router = express.Router(); router.post('/register', UserController.create); router.post('/login', UserController.login); -router.get('/questions', HistoryController.create); -router.put('/questions', HistoryController.update); +router.get('/users/leaderboards', authentication, UserController.getTopThree); +router.post('/histories', authentication, HistoryController.create); //Klik tombol main game +router.post('/histories/:bookId', authentication, HistoryController.create); //Klik card +router.put('/histories/:historyId', authentication, HistoryController.updatePoin); +router.patch('/histories/:historyId/books/:bookId', authentication, HistoryController.updatePoin); +router.delete('/books/:bookId', authentication, authorization.AdminOnly, BookController.delete) router.use(errorHandler.handler); module.exports = router; \ No newline at end of file From 348d34a7ecf1495bdb0bb0b67a01fba6978b9ff2 Mon Sep 17 00:00:00 2001 From: arvinaufal Date: Wed, 15 Nov 2023 10:54:23 +0700 Subject: [PATCH 14/27] add google auth method in user controller --- server/__tests__/auth.js | 14 + server/controllers/UserController.js | 31 +- server/coverage/clover.xml | 309 +++++++--- server/coverage/coverage-final.json | 18 +- server/coverage/lcov-report/index.html | 84 +-- .../coverage/lcov-report/server/app.js.html | 2 +- .../server/controllers/BookController.js.html | 490 ++++++++++++++++ .../controllers/HistoryController.js.html | 115 ++-- .../server/controllers/UserController.js.html | 200 ++++++- .../lcov-report/server/controllers/index.html | 69 ++- .../server/helpers/bcryptjs.js.html | 12 +- .../server/helpers/googlebooks.js.html | 190 +++++++ .../lcov-report/server/helpers/index.html | 47 +- .../lcov-report/server/helpers/jwt.js.html | 2 +- .../lcov-report/server/helpers/openai.js.html | 66 ++- server/coverage/lcov-report/server/index.html | 2 +- .../server/middlewares/authentication.js.html | 166 ++++++ .../server/middlewares/authorization.js.html | 136 +++++ .../server/middlewares/errorHandler.js.html | 47 +- .../lcov-report/server/middlewares/index.html | 66 ++- .../lcov-report/server/models/book.js.html | 2 +- .../lcov-report/server/models/history.js.html | 4 +- .../lcov-report/server/models/index.html | 2 +- .../lcov-report/server/models/index.js.html | 2 +- .../lcov-report/server/models/user.js.html | 11 +- .../server/models/userdetail.js.html | 2 +- .../lcov-report/server/routes/index.html | 10 +- .../lcov-report/server/routes/index.js.html | 33 +- server/coverage/lcov.info | 529 ++++++++++++++---- server/middlewares/errorHandler.js | 5 + server/models/user.js | 3 +- server/package-lock.json | 199 ++++++- server/package.json | 1 + 33 files changed, 2402 insertions(+), 467 deletions(-) create mode 100644 server/coverage/lcov-report/server/controllers/BookController.js.html create mode 100644 server/coverage/lcov-report/server/helpers/googlebooks.js.html create mode 100644 server/coverage/lcov-report/server/middlewares/authentication.js.html create mode 100644 server/coverage/lcov-report/server/middlewares/authorization.js.html diff --git a/server/__tests__/auth.js b/server/__tests__/auth.js index 5eaf4af..69c93ea 100644 --- a/server/__tests__/auth.js +++ b/server/__tests__/auth.js @@ -11,6 +11,9 @@ const user1 = { }; const timeOut = 20000; +beforeAll(async () => { + await User.create({...user1, email: 'user2@gmail.com', accountType: 'google'}); +}, timeOut); describe('/register', () => { describe('Positive Testing', () => { @@ -106,6 +109,16 @@ describe('/login', () => { expect(body).toHaveProperty("message", "Password is required"); }, timeOut); + test('failed manual login with google account', async () => { + let { status, body } = await request(app) + .post('/login') + .send({...user1, email: 'user2@gmail.com'}); + + expect(status).toBe(401); + expect(body).toBeInstanceOf(Object); + expect(body).toHaveProperty("message", "Use your Google account to login"); + }, timeOut); + test('failed login with unregistered user/email invalid', async () => { let { status, body } = await request(app) .post('/login') @@ -125,6 +138,7 @@ describe('/login', () => { expect(body).toBeInstanceOf(Object); expect(body).toHaveProperty("message", "Invalid Email/Password!"); }, timeOut); + }); }); diff --git a/server/controllers/UserController.js b/server/controllers/UserController.js index 91cb1d0..a54bdda 100644 --- a/server/controllers/UserController.js +++ b/server/controllers/UserController.js @@ -1,6 +1,8 @@ const { bcryptCompare } = require("../helpers/bcryptjs"); const { createToken } = require("../helpers/jwt"); const { User, UserDetail, History } = require("../models"); +const { OAuth2Client } = require('google-auth-library'); +const client = new OAuth2Client(); class UserController { static async getTopThree(request, response) { @@ -8,7 +10,7 @@ class UserController { const users = await User.findAndCountAll({ include: [ { model: UserDetail }, - { + { model: History, attributes: [ [sequelize.fn('SUM', sequelize.col('point')), 'totalPoints'] @@ -88,13 +90,14 @@ class UserController { } static async login(request, response, next) { - const { username, email, password } = request.body; + const { email, password } = request.body; try { if (!email || email === "") throw ({ name: `EmptyEmail` }); if (!password || password === "") throw ({ name: `EmptyPassword` }); const user = await User.findOne({ where: { email } }); if (!user || !bcryptCompare(password, user.password)) throw ({ name: "NotMatched" }); + if(user.accountType === 'google') throw ({name: 'googleAcc'}); const token = createToken({ id: user.id }); response.status(200).json({ access_token: token, email: user.email, role: user.role }); @@ -103,7 +106,29 @@ class UserController { } } - + static async loginGoogle(req, res, next) { + try { + const ticket = await client.verifyIdToken({ + idToken: req.headers.g_token, + audience: process.env.G_CLIENT, + }); + const payload = ticket.getPayload(); + const [user, newUser] = await User.findOrCreate({ + where: { + email: payload.email + }, + defaults: { + username: payload.name, + password: String(Math.random()), + accountType: 'google' + } + }); + if (newUser) await UserDetail.create({ userId: user.id, name: user.username }); + res.status(newUser ? 201 : 200).json({ access_token: createToken({ id: user.id }) }); + } catch (error) { + next(error); + } + } } module.exports = UserController; \ No newline at end of file diff --git a/server/coverage/clover.xml b/server/coverage/clover.xml index e852d14..d22299d 100644 --- a/server/coverage/clover.xml +++ b/server/coverage/clover.xml @@ -1,7 +1,7 @@ - - - + + + @@ -19,94 +19,187 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + - - - - + + + + + - + + + + - - + + - - - - - - + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + - - + + + + + + + + + + + + + @@ -120,28 +213,62 @@ - + - - - - - - - + + + - - - - + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -160,9 +287,9 @@ - - - + + + @@ -172,8 +299,11 @@ - - + + + + + @@ -227,9 +357,9 @@ - - - + + + @@ -248,20 +378,27 @@ - + - + + - + + + + + + + diff --git a/server/coverage/coverage-final.json b/server/coverage/coverage-final.json index a596c22..16c3a8b 100644 --- a/server/coverage/coverage-final.json +++ b/server/coverage/coverage-final.json @@ -1,14 +1,18 @@ {"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\app.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\app.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},"1":{"start":{"line":2,"column":4},"end":{"line":2,"column":31}},"2":{"start":{"line":5,"column":16},"end":{"line":5,"column":34}},"3":{"start":{"line":6,"column":13},"end":{"line":6,"column":28}},"4":{"start":{"line":7,"column":12},"end":{"line":7,"column":21}},"5":{"start":{"line":9,"column":0},"end":{"line":9,"column":16}},"6":{"start":{"line":10,"column":0},"end":{"line":10,"column":24}},"7":{"start":{"line":11,"column":0},"end":{"line":11,"column":48}},"8":{"start":{"line":12,"column":0},"end":{"line":12,"column":29}},"9":{"start":{"line":14,"column":0},"end":{"line":14,"column":21}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},"type":"if","locations":[{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},{"start":{},"end":{}}],"line":1}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1},"f":{},"b":{"0":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"bbee6a6c8c78c4c34676394bb03d083a03ff347d"} -,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\HistoryController.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\HistoryController.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":20},"end":{"line":2,"column":40}},"2":{"start":{"line":3,"column":29},"end":{"line":3,"column":57}},"3":{"start":{"line":7,"column":8},"end":{"line":29,"column":9}},"4":{"start":{"line":8,"column":28},"end":{"line":8,"column":91}},"5":{"start":{"line":9,"column":27},"end":{"line":11,"column":14}},"6":{"start":{"line":13,"column":29},"end":{"line":14,"column":100}},"7":{"start":{"line":16,"column":32},"end":{"line":20,"column":14}},"8":{"start":{"line":22,"column":28},"end":{"line":22,"column":54}},"9":{"start":{"line":23,"column":12},"end":{"line":23,"column":52}},"10":{"start":{"line":24,"column":12},"end":{"line":24,"column":46}},"11":{"start":{"line":25,"column":12},"end":{"line":25,"column":95}},"12":{"start":{"line":27,"column":12},"end":{"line":27,"column":31}},"13":{"start":{"line":28,"column":12},"end":{"line":28,"column":24}},"14":{"start":{"line":33,"column":38},"end":{"line":33,"column":46}},"15":{"start":{"line":34,"column":8},"end":{"line":55,"column":9}},"16":{"start":{"line":35,"column":28},"end":{"line":35,"column":55}},"17":{"start":{"line":36,"column":26},"end":{"line":36,"column":68}},"18":{"start":{"line":38,"column":27},"end":{"line":40,"column":14}},"19":{"start":{"line":42,"column":32},"end":{"line":46,"column":14}},"20":{"start":{"line":48,"column":28},"end":{"line":48,"column":54}},"21":{"start":{"line":49,"column":12},"end":{"line":49,"column":50}},"22":{"start":{"line":51,"column":12},"end":{"line":51,"column":90}},"23":{"start":{"line":53,"column":12},"end":{"line":53,"column":31}},"24":{"start":{"line":54,"column":12},"end":{"line":54,"column":24}},"25":{"start":{"line":60,"column":0},"end":{"line":60,"column":35}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":5}},"loc":{"start":{"line":6,"column":40},"end":{"line":30,"column":5}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":32,"column":4},"end":{"line":32,"column":5}},"loc":{"start":{"line":32,"column":40},"end":{"line":56,"column":5}},"line":32}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":1},"f":{"0":0,"1":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ddf7844e0dab4145a7febf7f9abb17b76d52a171"} -,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\UserController.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\UserController.js","statementMap":{"0":{"start":{"line":1,"column":26},"end":{"line":1,"column":56}},"1":{"start":{"line":2,"column":24},"end":{"line":2,"column":49}},"2":{"start":{"line":3,"column":29},"end":{"line":3,"column":49}},"3":{"start":{"line":7,"column":8},"end":{"line":17,"column":9}},"4":{"start":{"line":8,"column":26},"end":{"line":12,"column":14}},"5":{"start":{"line":14,"column":12},"end":{"line":14,"column":45}},"6":{"start":{"line":16,"column":12},"end":{"line":16,"column":24}},"7":{"start":{"line":21,"column":8},"end":{"line":33,"column":9}},"8":{"start":{"line":22,"column":25},"end":{"line":26,"column":14}},"9":{"start":{"line":28,"column":12},"end":{"line":28,"column":52}},"10":{"start":{"line":28,"column":23},"end":{"line":28,"column":52}},"11":{"start":{"line":30,"column":12},"end":{"line":30,"column":44}},"12":{"start":{"line":32,"column":12},"end":{"line":32,"column":24}},"13":{"start":{"line":37,"column":110},"end":{"line":37,"column":122}},"14":{"start":{"line":38,"column":8},"end":{"line":45,"column":9}},"15":{"start":{"line":39,"column":25},"end":{"line":39,"column":92}},"16":{"start":{"line":40,"column":12},"end":{"line":40,"column":79}},"17":{"start":{"line":42,"column":12},"end":{"line":42,"column":91}},"18":{"start":{"line":44,"column":12},"end":{"line":44,"column":24}},"19":{"start":{"line":49,"column":69},"end":{"line":49,"column":81}},"20":{"start":{"line":50,"column":8},"end":{"line":63,"column":9}},"21":{"start":{"line":51,"column":23},"end":{"line":55,"column":14}},"22":{"start":{"line":57,"column":12},"end":{"line":57,"column":61}},"23":{"start":{"line":58,"column":12},"end":{"line":58,"column":68}},"24":{"start":{"line":60,"column":12},"end":{"line":60,"column":44}},"25":{"start":{"line":62,"column":12},"end":{"line":62,"column":24}},"26":{"start":{"line":67,"column":8},"end":{"line":74,"column":9}},"27":{"start":{"line":68,"column":23},"end":{"line":68,"column":61}},"28":{"start":{"line":70,"column":12},"end":{"line":70,"column":33}},"29":{"start":{"line":71,"column":12},"end":{"line":71,"column":97}},"30":{"start":{"line":73,"column":12},"end":{"line":73,"column":24}},"31":{"start":{"line":78,"column":46},"end":{"line":78,"column":58}},"32":{"start":{"line":79,"column":8},"end":{"line":90,"column":9}},"33":{"start":{"line":80,"column":12},"end":{"line":80,"column":71}},"34":{"start":{"line":80,"column":40},"end":{"line":80,"column":71}},"35":{"start":{"line":81,"column":12},"end":{"line":81,"column":80}},"36":{"start":{"line":81,"column":46},"end":{"line":81,"column":80}},"37":{"start":{"line":83,"column":25},"end":{"line":83,"column":65}},"38":{"start":{"line":84,"column":12},"end":{"line":84,"column":97}},"39":{"start":{"line":84,"column":66},"end":{"line":84,"column":97}},"40":{"start":{"line":86,"column":26},"end":{"line":86,"column":54}},"41":{"start":{"line":87,"column":12},"end":{"line":87,"column":99}},"42":{"start":{"line":89,"column":12},"end":{"line":89,"column":24}},"43":{"start":{"line":96,"column":0},"end":{"line":96,"column":32}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":5}},"loc":{"start":{"line":6,"column":43},"end":{"line":18,"column":5}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":4},"end":{"line":20,"column":5}},"loc":{"start":{"line":20,"column":50},"end":{"line":34,"column":5}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":36,"column":4},"end":{"line":36,"column":5}},"loc":{"start":{"line":36,"column":49},"end":{"line":46,"column":5}},"line":36},"3":{"name":"(anonymous_3)","decl":{"start":{"line":48,"column":4},"end":{"line":48,"column":5}},"loc":{"start":{"line":48,"column":49},"end":{"line":64,"column":5}},"line":48},"4":{"name":"(anonymous_4)","decl":{"start":{"line":66,"column":4},"end":{"line":66,"column":5}},"loc":{"start":{"line":66,"column":49},"end":{"line":75,"column":5}},"line":66},"5":{"name":"(anonymous_5)","decl":{"start":{"line":77,"column":4},"end":{"line":77,"column":5}},"loc":{"start":{"line":77,"column":48},"end":{"line":91,"column":5}},"line":77}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":12},"end":{"line":28,"column":52}},"type":"if","locations":[{"start":{"line":28,"column":12},"end":{"line":28,"column":52}},{"start":{},"end":{}}],"line":28},"1":{"loc":{"start":{"line":37,"column":43},"end":{"line":37,"column":58}},"type":"default-arg","locations":[{"start":{"line":37,"column":50},"end":{"line":37,"column":58}}],"line":37},"2":{"loc":{"start":{"line":37,"column":60},"end":{"line":37,"column":82}},"type":"default-arg","locations":[{"start":{"line":37,"column":74},"end":{"line":37,"column":82}}],"line":37},"3":{"loc":{"start":{"line":80,"column":12},"end":{"line":80,"column":71}},"type":"if","locations":[{"start":{"line":80,"column":12},"end":{"line":80,"column":71}},{"start":{},"end":{}}],"line":80},"4":{"loc":{"start":{"line":80,"column":16},"end":{"line":80,"column":38}},"type":"binary-expr","locations":[{"start":{"line":80,"column":16},"end":{"line":80,"column":22}},{"start":{"line":80,"column":26},"end":{"line":80,"column":38}}],"line":80},"5":{"loc":{"start":{"line":81,"column":12},"end":{"line":81,"column":80}},"type":"if","locations":[{"start":{"line":81,"column":12},"end":{"line":81,"column":80}},{"start":{},"end":{}}],"line":81},"6":{"loc":{"start":{"line":81,"column":16},"end":{"line":81,"column":44}},"type":"binary-expr","locations":[{"start":{"line":81,"column":16},"end":{"line":81,"column":25}},{"start":{"line":81,"column":29},"end":{"line":81,"column":44}}],"line":81},"7":{"loc":{"start":{"line":84,"column":12},"end":{"line":84,"column":97}},"type":"if","locations":[{"start":{"line":84,"column":12},"end":{"line":84,"column":97}},{"start":{},"end":{}}],"line":84},"8":{"loc":{"start":{"line":84,"column":16},"end":{"line":84,"column":64}},"type":"binary-expr","locations":[{"start":{"line":84,"column":16},"end":{"line":84,"column":21}},{"start":{"line":84,"column":25},"end":{"line":84,"column":64}}],"line":84}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":5,"14":5,"15":5,"16":1,"17":1,"18":4,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":5,"32":5,"33":5,"34":1,"35":4,"36":1,"37":3,"38":3,"39":2,"40":1,"41":1,"42":4,"43":1},"f":{"0":0,"1":0,"2":5,"3":0,"4":0,"5":5},"b":{"0":[0,0],"1":[5],"2":[5],"3":[1,4],"4":[5,4],"5":[1,3],"6":[4,3],"7":[2,1],"8":[3,2]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"fd8a938c1a8c50d225ff0ce6d5042a16cc06cc87"} -,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\bcryptjs.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\bcryptjs.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":36}},"1":{"start":{"line":3,"column":19},"end":{"line":7,"column":1}},"2":{"start":{"line":4,"column":17},"end":{"line":4,"column":41}},"3":{"start":{"line":5,"column":17},"end":{"line":5,"column":45}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":16}},"5":{"start":{"line":9,"column":22},"end":{"line":12,"column":1}},"6":{"start":{"line":10,"column":20},"end":{"line":10,"column":53}},"7":{"start":{"line":11,"column":4},"end":{"line":11,"column":19}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":47}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":19},"end":{"line":3,"column":20}},"loc":{"start":{"line":3,"column":28},"end":{"line":7,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":22},"end":{"line":9,"column":23}},"loc":{"start":{"line":9,"column":39},"end":{"line":12,"column":1}},"line":9}},"branchMap":{},"s":{"0":1,"1":1,"2":2,"3":2,"4":2,"5":1,"6":2,"7":2,"8":1},"f":{"0":2,"1":2},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"199dc6211967aee323fafddd10ce98bcd3d8dcfa"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\BookController.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\BookController.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":35}},"1":{"start":{"line":2,"column":34},"end":{"line":2,"column":54}},"2":{"start":{"line":3,"column":38},"end":{"line":3,"column":66}},"3":{"start":{"line":4,"column":24},"end":{"line":4,"column":57}},"4":{"start":{"line":8,"column":53},"end":{"line":8,"column":62}},"5":{"start":{"line":9,"column":27},"end":{"line":9,"column":37}},"6":{"start":{"line":10,"column":27},"end":{"line":15,"column":9}},"7":{"start":{"line":17,"column":8},"end":{"line":17,"column":55}},"8":{"start":{"line":17,"column":20},"end":{"line":17,"column":55}},"9":{"start":{"line":19,"column":8},"end":{"line":29,"column":9}},"10":{"start":{"line":20,"column":12},"end":{"line":28,"column":13}},"11":{"start":{"line":21,"column":37},"end":{"line":25,"column":23}},"12":{"start":{"line":23,"column":33},"end":{"line":25,"column":21}},"13":{"start":{"line":27,"column":16},"end":{"line":27,"column":98}},"14":{"start":{"line":27,"column":40},"end":{"line":27,"column":98}},"15":{"start":{"line":31,"column":8},"end":{"line":31,"column":26}},"16":{"start":{"line":32,"column":8},"end":{"line":32,"column":101}},"17":{"start":{"line":32,"column":50},"end":{"line":32,"column":101}},"18":{"start":{"line":33,"column":8},"end":{"line":33,"column":85}},"19":{"start":{"line":33,"column":58},"end":{"line":33,"column":85}},"20":{"start":{"line":34,"column":8},"end":{"line":34,"column":105}},"21":{"start":{"line":34,"column":60},"end":{"line":34,"column":105}},"22":{"start":{"line":36,"column":8},"end":{"line":36,"column":62}},"23":{"start":{"line":38,"column":8},"end":{"line":51,"column":9}},"24":{"start":{"line":39,"column":26},"end":{"line":39,"column":66}},"25":{"start":{"line":40,"column":26},"end":{"line":46,"column":13}},"26":{"start":{"line":47,"column":12},"end":{"line":47,"column":40}},"27":{"start":{"line":49,"column":32},"end":{"line":49,"column":88}},"28":{"start":{"line":50,"column":12},"end":{"line":50,"column":24}},"29":{"start":{"line":55,"column":8},"end":{"line":61,"column":9}},"30":{"start":{"line":56,"column":25},"end":{"line":56,"column":59}},"31":{"start":{"line":57,"column":12},"end":{"line":57,"column":52}},"32":{"start":{"line":57,"column":23},"end":{"line":57,"column":52}},"33":{"start":{"line":58,"column":12},"end":{"line":58,"column":39}},"34":{"start":{"line":60,"column":12},"end":{"line":60,"column":24}},"35":{"start":{"line":65,"column":140},"end":{"line":65,"column":148}},"36":{"start":{"line":66,"column":8},"end":{"line":71,"column":9}},"37":{"start":{"line":67,"column":25},"end":{"line":67,"column":167}},"38":{"start":{"line":68,"column":12},"end":{"line":68,"column":39}},"39":{"start":{"line":70,"column":12},"end":{"line":70,"column":24}},"40":{"start":{"line":75,"column":140},"end":{"line":75,"column":148}},"41":{"start":{"line":76,"column":8},"end":{"line":84,"column":9}},"42":{"start":{"line":77,"column":23},"end":{"line":77,"column":57}},"43":{"start":{"line":78,"column":12},"end":{"line":78,"column":52}},"44":{"start":{"line":78,"column":23},"end":{"line":78,"column":52}},"45":{"start":{"line":80,"column":12},"end":{"line":80,"column":155}},"46":{"start":{"line":81,"column":12},"end":{"line":81,"column":39}},"47":{"start":{"line":83,"column":12},"end":{"line":83,"column":24}},"48":{"start":{"line":88,"column":27},"end":{"line":88,"column":37}},"49":{"start":{"line":89,"column":8},"end":{"line":98,"column":9}},"50":{"start":{"line":90,"column":23},"end":{"line":90,"column":50}},"51":{"start":{"line":92,"column":12},"end":{"line":92,"column":52}},"52":{"start":{"line":92,"column":23},"end":{"line":92,"column":52}},"53":{"start":{"line":94,"column":12},"end":{"line":94,"column":33}},"54":{"start":{"line":95,"column":12},"end":{"line":95,"column":92}},"55":{"start":{"line":97,"column":12},"end":{"line":97,"column":24}},"56":{"start":{"line":102,"column":25},"end":{"line":102,"column":33}},"57":{"start":{"line":103,"column":8},"end":{"line":124,"column":9}},"58":{"start":{"line":104,"column":26},"end":{"line":104,"column":49}},"59":{"start":{"line":105,"column":30},"end":{"line":105,"column":43}},"60":{"start":{"line":106,"column":26},"end":{"line":106,"column":57}},"61":{"start":{"line":107,"column":23},"end":{"line":107,"column":31}},"62":{"start":{"line":109,"column":33},"end":{"line":116,"column":14}},"63":{"start":{"line":118,"column":12},"end":{"line":118,"column":74}},"64":{"start":{"line":119,"column":23},"end":{"line":119,"column":47}},"65":{"start":{"line":121,"column":12},"end":{"line":121,"column":85}},"66":{"start":{"line":123,"column":12},"end":{"line":123,"column":24}},"67":{"start":{"line":129,"column":0},"end":{"line":129,"column":32}},"68":{"start":{"line":136,"column":38},"end":{"line":136,"column":37706}},"69":{"start":{"line":136,"column":42},"end":{"line":136,"column":37695}},"70":{"start":{"line":136,"column":37731},"end":{"line":136,"column":37771}},"71":{"start":{"line":136,"column":37735},"end":{"line":136,"column":37760}},"72":{"start":{"line":136,"column":37772},"end":{"line":136,"column":37780}},"73":{"start":{"line":136,"column":37805},"end":{"line":136,"column":37847}},"74":{"start":{"line":136,"column":37809},"end":{"line":136,"column":37836}},"75":{"start":{"line":136,"column":37848},"end":{"line":136,"column":37856}},"76":{"start":{"line":136,"column":37875},"end":{"line":136,"column":37912}},"77":{"start":{"line":136,"column":37879},"end":{"line":136,"column":37901}},"78":{"start":{"line":136,"column":37931},"end":{"line":136,"column":37971}},"79":{"start":{"line":136,"column":37935},"end":{"line":136,"column":37960}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":4},"end":{"line":7,"column":5}},"loc":{"start":{"line":7,"column":40},"end":{"line":52,"column":5}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":25},"end":{"line":23,"column":26}},"loc":{"start":{"line":23,"column":33},"end":{"line":25,"column":21}},"line":23},"2":{"name":"(anonymous_2)","decl":{"start":{"line":54,"column":4},"end":{"line":54,"column":5}},"loc":{"start":{"line":54,"column":41},"end":{"line":62,"column":5}},"line":54},"3":{"name":"(anonymous_3)","decl":{"start":{"line":64,"column":4},"end":{"line":64,"column":5}},"loc":{"start":{"line":64,"column":40},"end":{"line":72,"column":5}},"line":64},"4":{"name":"(anonymous_4)","decl":{"start":{"line":74,"column":4},"end":{"line":74,"column":5}},"loc":{"start":{"line":74,"column":40},"end":{"line":85,"column":5}},"line":74},"5":{"name":"(anonymous_5)","decl":{"start":{"line":87,"column":4},"end":{"line":87,"column":5}},"loc":{"start":{"line":87,"column":40},"end":{"line":99,"column":5}},"line":87},"6":{"name":"(anonymous_6)","decl":{"start":{"line":101,"column":4},"end":{"line":101,"column":5}},"loc":{"start":{"line":101,"column":42},"end":{"line":125,"column":5}},"line":101},"7":{"name":"oo_cm","decl":{"start":{"line":136,"column":30},"end":{"line":136,"column":35}},"loc":{"start":{"line":136,"column":37},"end":{"line":136,"column":37707}},"line":136},"8":{"name":"oo_oo","decl":{"start":{"line":136,"column":37717},"end":{"line":136,"column":37722}},"loc":{"start":{"line":136,"column":37730},"end":{"line":136,"column":37781}},"line":136},"9":{"name":"oo_tr","decl":{"start":{"line":136,"column":37791},"end":{"line":136,"column":37796}},"loc":{"start":{"line":136,"column":37804},"end":{"line":136,"column":37857}},"line":136},"10":{"name":"oo_ts","decl":{"start":{"line":136,"column":37867},"end":{"line":136,"column":37872}},"loc":{"start":{"line":136,"column":37874},"end":{"line":136,"column":37913}},"line":136},"11":{"name":"oo_te","decl":{"start":{"line":136,"column":37923},"end":{"line":136,"column":37928}},"loc":{"start":{"line":136,"column":37930},"end":{"line":136,"column":37972}},"line":136}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":22},"end":{"line":8,"column":30}},"type":"default-arg","locations":[{"start":{"line":8,"column":29},"end":{"line":8,"column":30}}],"line":8},"1":{"loc":{"start":{"line":17,"column":8},"end":{"line":17,"column":55}},"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":55}},{"start":{},"end":{}}],"line":17},"2":{"loc":{"start":{"line":19,"column":8},"end":{"line":29,"column":9}},"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":29,"column":9}},{"start":{},"end":{}}],"line":19},"3":{"loc":{"start":{"line":19,"column":12},"end":{"line":19,"column":35}},"type":"binary-expr","locations":[{"start":{"line":19,"column":12},"end":{"line":19,"column":18}},{"start":{"line":19,"column":22},"end":{"line":19,"column":35}}],"line":19},"4":{"loc":{"start":{"line":20,"column":12},"end":{"line":28,"column":13}},"type":"if","locations":[{"start":{"line":20,"column":12},"end":{"line":28,"column":13}},{"start":{},"end":{}}],"line":20},"5":{"loc":{"start":{"line":20,"column":16},"end":{"line":20,"column":80}},"type":"binary-expr","locations":[{"start":{"line":20,"column":16},"end":{"line":20,"column":38}},{"start":{"line":20,"column":42},"end":{"line":20,"column":80}}],"line":20},"6":{"loc":{"start":{"line":27,"column":16},"end":{"line":27,"column":98}},"type":"if","locations":[{"start":{"line":27,"column":16},"end":{"line":27,"column":98}},{"start":{},"end":{}}],"line":27},"7":{"loc":{"start":{"line":31,"column":15},"end":{"line":31,"column":25}},"type":"binary-expr","locations":[{"start":{"line":31,"column":15},"end":{"line":31,"column":20}},{"start":{"line":31,"column":24},"end":{"line":31,"column":25}}],"line":31},"8":{"loc":{"start":{"line":32,"column":8},"end":{"line":32,"column":101}},"type":"if","locations":[{"start":{"line":32,"column":8},"end":{"line":32,"column":101}},{"start":{},"end":{}}],"line":32},"9":{"loc":{"start":{"line":32,"column":12},"end":{"line":32,"column":48}},"type":"binary-expr","locations":[{"start":{"line":32,"column":12},"end":{"line":32,"column":20}},{"start":{"line":32,"column":24},"end":{"line":32,"column":48}}],"line":32},"10":{"loc":{"start":{"line":33,"column":8},"end":{"line":33,"column":85}},"type":"if","locations":[{"start":{"line":33,"column":8},"end":{"line":33,"column":85}},{"start":{},"end":{}}],"line":33},"11":{"loc":{"start":{"line":33,"column":12},"end":{"line":33,"column":56}},"type":"binary-expr","locations":[{"start":{"line":33,"column":12},"end":{"line":33,"column":24}},{"start":{"line":33,"column":28},"end":{"line":33,"column":56}}],"line":33},"12":{"loc":{"start":{"line":34,"column":8},"end":{"line":34,"column":105}},"type":"if","locations":[{"start":{"line":34,"column":8},"end":{"line":34,"column":105}},{"start":{},"end":{}}],"line":34},"13":{"loc":{"start":{"line":34,"column":12},"end":{"line":34,"column":58}},"type":"binary-expr","locations":[{"start":{"line":34,"column":12},"end":{"line":34,"column":25}},{"start":{"line":34,"column":29},"end":{"line":34,"column":58}}],"line":34},"14":{"loc":{"start":{"line":57,"column":12},"end":{"line":57,"column":52}},"type":"if","locations":[{"start":{"line":57,"column":12},"end":{"line":57,"column":52}},{"start":{},"end":{}}],"line":57},"15":{"loc":{"start":{"line":78,"column":12},"end":{"line":78,"column":52}},"type":"if","locations":[{"start":{"line":78,"column":12},"end":{"line":78,"column":52}},{"start":{},"end":{}}],"line":78},"16":{"loc":{"start":{"line":92,"column":12},"end":{"line":92,"column":52}},"type":"if","locations":[{"start":{"line":92,"column":12},"end":{"line":92,"column":52}},{"start":{},"end":{}}],"line":92},"17":{"loc":{"start":{"line":118,"column":12},"end":{"line":118,"column":73}},"type":"cond-expr","locations":[{"start":{"line":118,"column":28},"end":{"line":118,"column":51}},{"start":{"line":118,"column":54},"end":{"line":118,"column":73}}],"line":118},"18":{"loc":{"start":{"line":119,"column":23},"end":{"line":119,"column":47}},"type":"cond-expr","locations":[{"start":{"line":119,"column":38},"end":{"line":119,"column":41}},{"start":{"line":119,"column":44},"end":{"line":119,"column":47}}],"line":119},"19":{"loc":{"start":{"line":136,"column":49},"end":{"line":136,"column":37694}},"type":"binary-expr","locations":[{"start":{"line":136,"column":49},"end":{"line":136,"column":86}},{"start":{"line":136,"column":90},"end":{"line":136,"column":37694}}],"line":136}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":1,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"820ba8efa2a4b9d01f36abbdea322a0cdbff1b0d"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\HistoryController.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\HistoryController.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":20},"end":{"line":2,"column":40}},"2":{"start":{"line":3,"column":37},"end":{"line":3,"column":65}},"3":{"start":{"line":7,"column":27},"end":{"line":7,"column":37}},"4":{"start":{"line":8,"column":8},"end":{"line":21,"column":9}},"5":{"start":{"line":9,"column":28},"end":{"line":9,"column":99}},"6":{"start":{"line":10,"column":29},"end":{"line":11,"column":100}},"7":{"start":{"line":12,"column":28},"end":{"line":12,"column":44}},"8":{"start":{"line":13,"column":12},"end":{"line":13,"column":52}},"9":{"start":{"line":14,"column":12},"end":{"line":14,"column":46}},"10":{"start":{"line":15,"column":12},"end":{"line":17,"column":15}},"11":{"start":{"line":19,"column":32},"end":{"line":19,"column":88}},"12":{"start":{"line":20,"column":12},"end":{"line":20,"column":24}},"13":{"start":{"line":25,"column":27},"end":{"line":25,"column":35}},"14":{"start":{"line":26,"column":30},"end":{"line":26,"column":40}},"15":{"start":{"line":27,"column":8},"end":{"line":36,"column":9}},"16":{"start":{"line":28,"column":28},"end":{"line":28,"column":55}},"17":{"start":{"line":29,"column":26},"end":{"line":29,"column":68}},"18":{"start":{"line":30,"column":24},"end":{"line":30,"column":37}},"19":{"start":{"line":31,"column":12},"end":{"line":31,"column":73}},"20":{"start":{"line":32,"column":12},"end":{"line":32,"column":87}},"21":{"start":{"line":34,"column":32},"end":{"line":34,"column":88}},"22":{"start":{"line":35,"column":12},"end":{"line":35,"column":24}},"23":{"start":{"line":40,"column":38},"end":{"line":40,"column":48}},"24":{"start":{"line":41,"column":8},"end":{"line":48,"column":9}},"25":{"start":{"line":42,"column":28},"end":{"line":42,"column":55}},"26":{"start":{"line":43,"column":12},"end":{"line":43,"column":39}},"27":{"start":{"line":44,"column":12},"end":{"line":44,"column":75}},"28":{"start":{"line":46,"column":32},"end":{"line":46,"column":88}},"29":{"start":{"line":47,"column":12},"end":{"line":47,"column":24}},"30":{"start":{"line":52,"column":0},"end":{"line":52,"column":35}},"31":{"start":{"line":59,"column":38},"end":{"line":59,"column":37706}},"32":{"start":{"line":59,"column":42},"end":{"line":59,"column":37695}},"33":{"start":{"line":59,"column":37731},"end":{"line":59,"column":37771}},"34":{"start":{"line":59,"column":37735},"end":{"line":59,"column":37760}},"35":{"start":{"line":59,"column":37772},"end":{"line":59,"column":37780}},"36":{"start":{"line":59,"column":37805},"end":{"line":59,"column":37847}},"37":{"start":{"line":59,"column":37809},"end":{"line":59,"column":37836}},"38":{"start":{"line":59,"column":37848},"end":{"line":59,"column":37856}},"39":{"start":{"line":59,"column":37875},"end":{"line":59,"column":37912}},"40":{"start":{"line":59,"column":37879},"end":{"line":59,"column":37901}},"41":{"start":{"line":59,"column":37931},"end":{"line":59,"column":37971}},"42":{"start":{"line":59,"column":37935},"end":{"line":59,"column":37960}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":5}},"loc":{"start":{"line":6,"column":40},"end":{"line":22,"column":5}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":24,"column":4},"end":{"line":24,"column":5}},"loc":{"start":{"line":24,"column":44},"end":{"line":37,"column":5}},"line":24},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":4},"end":{"line":39,"column":5}},"loc":{"start":{"line":39,"column":46},"end":{"line":49,"column":5}},"line":39},"3":{"name":"oo_cm","decl":{"start":{"line":59,"column":30},"end":{"line":59,"column":35}},"loc":{"start":{"line":59,"column":37},"end":{"line":59,"column":37707}},"line":59},"4":{"name":"oo_oo","decl":{"start":{"line":59,"column":37717},"end":{"line":59,"column":37722}},"loc":{"start":{"line":59,"column":37730},"end":{"line":59,"column":37781}},"line":59},"5":{"name":"oo_tr","decl":{"start":{"line":59,"column":37791},"end":{"line":59,"column":37796}},"loc":{"start":{"line":59,"column":37804},"end":{"line":59,"column":37857}},"line":59},"6":{"name":"oo_ts","decl":{"start":{"line":59,"column":37867},"end":{"line":59,"column":37872}},"loc":{"start":{"line":59,"column":37874},"end":{"line":59,"column":37913}},"line":59},"7":{"name":"oo_te","decl":{"start":{"line":59,"column":37923},"end":{"line":59,"column":37928}},"loc":{"start":{"line":59,"column":37930},"end":{"line":59,"column":37972}},"line":59}},"branchMap":{"0":{"loc":{"start":{"line":59,"column":49},"end":{"line":59,"column":37694}},"type":"binary-expr","locations":[{"start":{"line":59,"column":49},"end":{"line":59,"column":86}},{"start":{"line":59,"column":90},"end":{"line":59,"column":37694}}],"line":59}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":1,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"81d5aca73b870832d19f10d4dc40baefb738dad1"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\UserController.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\controllers\\UserController.js","statementMap":{"0":{"start":{"line":1,"column":26},"end":{"line":1,"column":56}},"1":{"start":{"line":2,"column":24},"end":{"line":2,"column":49}},"2":{"start":{"line":3,"column":38},"end":{"line":3,"column":58}},"3":{"start":{"line":4,"column":25},"end":{"line":4,"column":55}},"4":{"start":{"line":5,"column":15},"end":{"line":5,"column":33}},"5":{"start":{"line":9,"column":8},"end":{"line":30,"column":9}},"6":{"start":{"line":10,"column":26},"end":{"line":25,"column":14}},"7":{"start":{"line":27,"column":12},"end":{"line":27,"column":45}},"8":{"start":{"line":29,"column":12},"end":{"line":29,"column":24}},"9":{"start":{"line":34,"column":8},"end":{"line":48,"column":9}},"10":{"start":{"line":35,"column":25},"end":{"line":41,"column":14}},"11":{"start":{"line":43,"column":12},"end":{"line":43,"column":52}},"12":{"start":{"line":43,"column":23},"end":{"line":43,"column":52}},"13":{"start":{"line":45,"column":12},"end":{"line":45,"column":44}},"14":{"start":{"line":47,"column":12},"end":{"line":47,"column":24}},"15":{"start":{"line":52,"column":110},"end":{"line":52,"column":122}},"16":{"start":{"line":53,"column":8},"end":{"line":61,"column":9}},"17":{"start":{"line":54,"column":32},"end":{"line":54,"column":131}},"18":{"start":{"line":55,"column":25},"end":{"line":55,"column":92}},"19":{"start":{"line":56,"column":12},"end":{"line":56,"column":80}},"20":{"start":{"line":58,"column":12},"end":{"line":58,"column":91}},"21":{"start":{"line":60,"column":12},"end":{"line":60,"column":24}},"22":{"start":{"line":65,"column":69},"end":{"line":65,"column":81}},"23":{"start":{"line":66,"column":8},"end":{"line":79,"column":9}},"24":{"start":{"line":67,"column":23},"end":{"line":71,"column":14}},"25":{"start":{"line":73,"column":12},"end":{"line":73,"column":61}},"26":{"start":{"line":74,"column":12},"end":{"line":74,"column":68}},"27":{"start":{"line":76,"column":12},"end":{"line":76,"column":44}},"28":{"start":{"line":78,"column":12},"end":{"line":78,"column":24}},"29":{"start":{"line":83,"column":8},"end":{"line":90,"column":9}},"30":{"start":{"line":84,"column":23},"end":{"line":84,"column":61}},"31":{"start":{"line":86,"column":12},"end":{"line":86,"column":33}},"32":{"start":{"line":87,"column":12},"end":{"line":87,"column":97}},"33":{"start":{"line":89,"column":12},"end":{"line":89,"column":24}},"34":{"start":{"line":94,"column":36},"end":{"line":94,"column":48}},"35":{"start":{"line":95,"column":8},"end":{"line":107,"column":9}},"36":{"start":{"line":96,"column":12},"end":{"line":96,"column":71}},"37":{"start":{"line":96,"column":40},"end":{"line":96,"column":71}},"38":{"start":{"line":97,"column":12},"end":{"line":97,"column":80}},"39":{"start":{"line":97,"column":46},"end":{"line":97,"column":80}},"40":{"start":{"line":99,"column":25},"end":{"line":99,"column":65}},"41":{"start":{"line":100,"column":12},"end":{"line":100,"column":97}},"42":{"start":{"line":100,"column":66},"end":{"line":100,"column":97}},"43":{"start":{"line":101,"column":12},"end":{"line":101,"column":74}},"44":{"start":{"line":101,"column":46},"end":{"line":101,"column":74}},"45":{"start":{"line":103,"column":26},"end":{"line":103,"column":54}},"46":{"start":{"line":104,"column":12},"end":{"line":104,"column":99}},"47":{"start":{"line":106,"column":12},"end":{"line":106,"column":24}},"48":{"start":{"line":111,"column":8},"end":{"line":131,"column":9}},"49":{"start":{"line":112,"column":27},"end":{"line":115,"column":14}},"50":{"start":{"line":116,"column":28},"end":{"line":116,"column":47}},"51":{"start":{"line":117,"column":36},"end":{"line":126,"column":14}},"52":{"start":{"line":127,"column":12},"end":{"line":127,"column":91}},"53":{"start":{"line":127,"column":25},"end":{"line":127,"column":91}},"54":{"start":{"line":128,"column":12},"end":{"line":128,"column":97}},"55":{"start":{"line":130,"column":12},"end":{"line":130,"column":24}},"56":{"start":{"line":135,"column":0},"end":{"line":135,"column":32}},"57":{"start":{"line":142,"column":38},"end":{"line":142,"column":37706}},"58":{"start":{"line":142,"column":42},"end":{"line":142,"column":37695}},"59":{"start":{"line":142,"column":37731},"end":{"line":142,"column":37771}},"60":{"start":{"line":142,"column":37735},"end":{"line":142,"column":37760}},"61":{"start":{"line":142,"column":37772},"end":{"line":142,"column":37780}},"62":{"start":{"line":142,"column":37805},"end":{"line":142,"column":37847}},"63":{"start":{"line":142,"column":37809},"end":{"line":142,"column":37836}},"64":{"start":{"line":142,"column":37848},"end":{"line":142,"column":37856}},"65":{"start":{"line":142,"column":37875},"end":{"line":142,"column":37912}},"66":{"start":{"line":142,"column":37879},"end":{"line":142,"column":37901}},"67":{"start":{"line":142,"column":37931},"end":{"line":142,"column":37971}},"68":{"start":{"line":142,"column":37935},"end":{"line":142,"column":37960}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":5}},"loc":{"start":{"line":8,"column":48},"end":{"line":31,"column":5}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":33,"column":4},"end":{"line":33,"column":5}},"loc":{"start":{"line":33,"column":50},"end":{"line":49,"column":5}},"line":33},"2":{"name":"(anonymous_2)","decl":{"start":{"line":51,"column":4},"end":{"line":51,"column":5}},"loc":{"start":{"line":51,"column":49},"end":{"line":62,"column":5}},"line":51},"3":{"name":"(anonymous_3)","decl":{"start":{"line":64,"column":4},"end":{"line":64,"column":5}},"loc":{"start":{"line":64,"column":49},"end":{"line":80,"column":5}},"line":64},"4":{"name":"(anonymous_4)","decl":{"start":{"line":82,"column":4},"end":{"line":82,"column":5}},"loc":{"start":{"line":82,"column":49},"end":{"line":91,"column":5}},"line":82},"5":{"name":"(anonymous_5)","decl":{"start":{"line":93,"column":4},"end":{"line":93,"column":5}},"loc":{"start":{"line":93,"column":48},"end":{"line":108,"column":5}},"line":93},"6":{"name":"(anonymous_6)","decl":{"start":{"line":110,"column":4},"end":{"line":110,"column":5}},"loc":{"start":{"line":110,"column":45},"end":{"line":132,"column":5}},"line":110},"7":{"name":"oo_cm","decl":{"start":{"line":142,"column":30},"end":{"line":142,"column":35}},"loc":{"start":{"line":142,"column":37},"end":{"line":142,"column":37707}},"line":142},"8":{"name":"oo_oo","decl":{"start":{"line":142,"column":37717},"end":{"line":142,"column":37722}},"loc":{"start":{"line":142,"column":37730},"end":{"line":142,"column":37781}},"line":142},"9":{"name":"oo_tr","decl":{"start":{"line":142,"column":37791},"end":{"line":142,"column":37796}},"loc":{"start":{"line":142,"column":37804},"end":{"line":142,"column":37857}},"line":142},"10":{"name":"oo_ts","decl":{"start":{"line":142,"column":37867},"end":{"line":142,"column":37872}},"loc":{"start":{"line":142,"column":37874},"end":{"line":142,"column":37913}},"line":142},"11":{"name":"oo_te","decl":{"start":{"line":142,"column":37923},"end":{"line":142,"column":37928}},"loc":{"start":{"line":142,"column":37930},"end":{"line":142,"column":37972}},"line":142}},"branchMap":{"0":{"loc":{"start":{"line":43,"column":12},"end":{"line":43,"column":52}},"type":"if","locations":[{"start":{"line":43,"column":12},"end":{"line":43,"column":52}},{"start":{},"end":{}}],"line":43},"1":{"loc":{"start":{"line":52,"column":43},"end":{"line":52,"column":58}},"type":"default-arg","locations":[{"start":{"line":52,"column":50},"end":{"line":52,"column":58}}],"line":52},"2":{"loc":{"start":{"line":52,"column":60},"end":{"line":52,"column":82}},"type":"default-arg","locations":[{"start":{"line":52,"column":74},"end":{"line":52,"column":82}}],"line":52},"3":{"loc":{"start":{"line":96,"column":12},"end":{"line":96,"column":71}},"type":"if","locations":[{"start":{"line":96,"column":12},"end":{"line":96,"column":71}},{"start":{},"end":{}}],"line":96},"4":{"loc":{"start":{"line":96,"column":16},"end":{"line":96,"column":38}},"type":"binary-expr","locations":[{"start":{"line":96,"column":16},"end":{"line":96,"column":22}},{"start":{"line":96,"column":26},"end":{"line":96,"column":38}}],"line":96},"5":{"loc":{"start":{"line":97,"column":12},"end":{"line":97,"column":80}},"type":"if","locations":[{"start":{"line":97,"column":12},"end":{"line":97,"column":80}},{"start":{},"end":{}}],"line":97},"6":{"loc":{"start":{"line":97,"column":16},"end":{"line":97,"column":44}},"type":"binary-expr","locations":[{"start":{"line":97,"column":16},"end":{"line":97,"column":25}},{"start":{"line":97,"column":29},"end":{"line":97,"column":44}}],"line":97},"7":{"loc":{"start":{"line":100,"column":12},"end":{"line":100,"column":97}},"type":"if","locations":[{"start":{"line":100,"column":12},"end":{"line":100,"column":97}},{"start":{},"end":{}}],"line":100},"8":{"loc":{"start":{"line":100,"column":16},"end":{"line":100,"column":64}},"type":"binary-expr","locations":[{"start":{"line":100,"column":16},"end":{"line":100,"column":21}},{"start":{"line":100,"column":25},"end":{"line":100,"column":64}}],"line":100},"9":{"loc":{"start":{"line":101,"column":12},"end":{"line":101,"column":74}},"type":"if","locations":[{"start":{"line":101,"column":12},"end":{"line":101,"column":74}},{"start":{},"end":{}}],"line":101},"10":{"loc":{"start":{"line":127,"column":12},"end":{"line":127,"column":91}},"type":"if","locations":[{"start":{"line":127,"column":12},"end":{"line":127,"column":91}},{"start":{},"end":{}}],"line":127},"11":{"loc":{"start":{"line":128,"column":23},"end":{"line":128,"column":42}},"type":"cond-expr","locations":[{"start":{"line":128,"column":33},"end":{"line":128,"column":36}},{"start":{"line":128,"column":39},"end":{"line":128,"column":42}}],"line":128},"12":{"loc":{"start":{"line":142,"column":49},"end":{"line":142,"column":37694}},"type":"binary-expr","locations":[{"start":{"line":142,"column":49},"end":{"line":142,"column":86}},{"start":{"line":142,"column":90},"end":{"line":142,"column":37694}}],"line":142}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":5,"16":5,"17":5,"18":5,"19":1,"20":1,"21":4,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":6,"35":6,"36":6,"37":1,"38":5,"39":1,"40":4,"41":4,"42":2,"43":2,"44":1,"45":1,"46":1,"47":5,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":1,"57":5,"58":5,"59":5,"60":5,"61":5,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0},"f":{"0":0,"1":0,"2":5,"3":0,"4":0,"5":6,"6":0,"7":5,"8":5,"9":0,"10":0,"11":0},"b":{"0":[0,0],"1":[5],"2":[5],"3":[1,5],"4":[6,5],"5":[1,4],"6":[5,4],"7":[2,2],"8":[4,3],"9":[1,1],"10":[0,0],"11":[0,0],"12":[5,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"56a5abdcbbdbc202cbe922fe827de8927f28c0dc"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\bcryptjs.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\bcryptjs.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":36}},"1":{"start":{"line":3,"column":19},"end":{"line":7,"column":1}},"2":{"start":{"line":4,"column":17},"end":{"line":4,"column":41}},"3":{"start":{"line":5,"column":17},"end":{"line":5,"column":45}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":16}},"5":{"start":{"line":9,"column":22},"end":{"line":12,"column":1}},"6":{"start":{"line":10,"column":20},"end":{"line":10,"column":53}},"7":{"start":{"line":11,"column":4},"end":{"line":11,"column":19}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":47}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":19},"end":{"line":3,"column":20}},"loc":{"start":{"line":3,"column":28},"end":{"line":7,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":22},"end":{"line":9,"column":23}},"loc":{"start":{"line":9,"column":39},"end":{"line":12,"column":1}},"line":9}},"branchMap":{},"s":{"0":1,"1":1,"2":3,"3":3,"4":3,"5":1,"6":3,"7":3,"8":1},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"199dc6211967aee323fafddd10ce98bcd3d8dcfa"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\googlebooks.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\googlebooks.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":30}},"1":{"start":{"line":3,"column":20},"end":{"line":34,"column":1}},"2":{"start":{"line":4,"column":21},"end":{"line":12,"column":6}},"3":{"start":{"line":14,"column":18},"end":{"line":14,"column":43}},"4":{"start":{"line":16,"column":4},"end":{"line":33,"column":7}},"5":{"start":{"line":17,"column":140},"end":{"line":17,"column":155}},"6":{"start":{"line":18,"column":8},"end":{"line":32,"column":10}},"7":{"start":{"line":36,"column":0},"end":{"line":36,"column":33}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":20},"end":{"line":3,"column":21}},"loc":{"start":{"line":3,"column":49},"end":{"line":34,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":21},"end":{"line":16,"column":22}},"loc":{"start":{"line":16,"column":29},"end":{"line":33,"column":5}},"line":16}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":18},"end":{"line":14,"column":43}},"type":"binary-expr","locations":[{"start":{"line":14,"column":18},"end":{"line":14,"column":37}},{"start":{"line":14,"column":41},"end":{"line":14,"column":43}}],"line":14},"1":{"loc":{"start":{"line":20,"column":18},"end":{"line":20,"column":79}},"type":"cond-expr","locations":[{"start":{"line":20,"column":40},"end":{"line":20,"column":73}},{"start":{"line":20,"column":76},"end":{"line":20,"column":79}}],"line":20},"2":{"loc":{"start":{"line":21,"column":20},"end":{"line":21,"column":54}},"type":"cond-expr","locations":[{"start":{"line":21,"column":30},"end":{"line":21,"column":48}},{"start":{"line":21,"column":51},"end":{"line":21,"column":54}}],"line":21},"3":{"loc":{"start":{"line":30,"column":22},"end":{"line":30,"column":62}},"type":"cond-expr","locations":[{"start":{"line":30,"column":35},"end":{"line":30,"column":56}},{"start":{"line":30,"column":59},"end":{"line":30,"column":62}}],"line":30}},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":0,"6":0,"7":1},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"96f44175f619d92719ec9f101f7f082a98f8295f"} ,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\jwt.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\jwt.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":35}},"1":{"start":{"line":2,"column":18},"end":{"line":2,"column":40}},"2":{"start":{"line":4,"column":20},"end":{"line":7,"column":1}},"3":{"start":{"line":5,"column":18},"end":{"line":5,"column":42}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":17}},"5":{"start":{"line":9,"column":20},"end":{"line":12,"column":1}},"6":{"start":{"line":10,"column":20},"end":{"line":10,"column":46}},"7":{"start":{"line":11,"column":4},"end":{"line":11,"column":19}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":46}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":20},"end":{"line":4,"column":21}},"loc":{"start":{"line":4,"column":29},"end":{"line":7,"column":1}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":20},"end":{"line":9,"column":21}},"loc":{"start":{"line":9,"column":29},"end":{"line":12,"column":1}},"line":9}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":0,"8":1},"f":{"0":1,"1":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"5f76b3b819dee86a4e22818bc9c20f67f6848d08"} -,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\openai.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\openai.js","statementMap":{"0":{"start":{"line":1,"column":25},"end":{"line":11,"column":1}},"1":{"start":{"line":2,"column":19},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":17},"end":{"line":3,"column":79}},"3":{"start":{"line":5,"column":4},"end":{"line":7,"column":5}},"4":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"5":{"start":{"line":6,"column":8},"end":{"line":6,"column":72}},"6":{"start":{"line":9,"column":4},"end":{"line":9,"column":300}},"7":{"start":{"line":10,"column":4},"end":{"line":10,"column":18}},"8":{"start":{"line":13,"column":26},"end":{"line":18,"column":1}},"9":{"start":{"line":14,"column":17},"end":{"line":14,"column":124}},"10":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"11":{"start":{"line":16,"column":4},"end":{"line":16,"column":270}},"12":{"start":{"line":17,"column":4},"end":{"line":17,"column":18}},"13":{"start":{"line":20,"column":0},"end":{"line":20,"column":57}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":25},"end":{"line":1,"column":26}},"loc":{"start":{"line":1,"column":40},"end":{"line":11,"column":1}},"line":1},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":26},"end":{"line":13,"column":27}},"loc":{"start":{"line":13,"column":36},"end":{"line":18,"column":1}},"line":13}},"branchMap":{},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":1,"9":0,"10":0,"11":0,"12":0,"13":1},"f":{"0":0,"1":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e37f093eb10c6349ef163996de60c8c620d176c0"} -,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\middlewares\\errorHandler.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\middlewares\\errorHandler.js","statementMap":{"0":{"start":{"line":1,"column":21},"end":{"line":61,"column":1}},"1":{"start":{"line":4,"column":8},"end":{"line":56,"column":9}},"2":{"start":{"line":7,"column":16},"end":{"line":7,"column":33}},"3":{"start":{"line":8,"column":16},"end":{"line":8,"column":72}},"4":{"start":{"line":8,"column":51},"end":{"line":8,"column":68}},"5":{"start":{"line":9,"column":16},"end":{"line":9,"column":22}},"6":{"start":{"line":12,"column":16},"end":{"line":12,"column":33}},"7":{"start":{"line":13,"column":16},"end":{"line":13,"column":49}},"8":{"start":{"line":14,"column":16},"end":{"line":14,"column":22}},"9":{"start":{"line":17,"column":16},"end":{"line":17,"column":33}},"10":{"start":{"line":18,"column":16},"end":{"line":18,"column":46}},"11":{"start":{"line":19,"column":16},"end":{"line":19,"column":22}},"12":{"start":{"line":22,"column":16},"end":{"line":22,"column":33}},"13":{"start":{"line":23,"column":16},"end":{"line":23,"column":49}},"14":{"start":{"line":24,"column":16},"end":{"line":24,"column":22}},"15":{"start":{"line":27,"column":16},"end":{"line":27,"column":33}},"16":{"start":{"line":28,"column":16},"end":{"line":28,"column":55}},"17":{"start":{"line":29,"column":16},"end":{"line":29,"column":22}},"18":{"start":{"line":32,"column":16},"end":{"line":32,"column":33}},"19":{"start":{"line":33,"column":16},"end":{"line":33,"column":52}},"20":{"start":{"line":34,"column":16},"end":{"line":34,"column":22}},"21":{"start":{"line":38,"column":16},"end":{"line":38,"column":33}},"22":{"start":{"line":39,"column":16},"end":{"line":39,"column":44}},"23":{"start":{"line":40,"column":16},"end":{"line":40,"column":22}},"24":{"start":{"line":43,"column":16},"end":{"line":43,"column":33}},"25":{"start":{"line":44,"column":16},"end":{"line":44,"column":50}},"26":{"start":{"line":45,"column":16},"end":{"line":45,"column":22}},"27":{"start":{"line":48,"column":16},"end":{"line":48,"column":33}},"28":{"start":{"line":49,"column":16},"end":{"line":49,"column":38}},"29":{"start":{"line":50,"column":16},"end":{"line":50,"column":22}},"30":{"start":{"line":53,"column":16},"end":{"line":53,"column":33}},"31":{"start":{"line":54,"column":16},"end":{"line":54,"column":50}},"32":{"start":{"line":55,"column":16},"end":{"line":55,"column":22}},"33":{"start":{"line":58,"column":8},"end":{"line":58,"column":54}},"34":{"start":{"line":63,"column":0},"end":{"line":63,"column":30}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":13},"end":{"line":2,"column":14}},"loc":{"start":{"line":2,"column":49},"end":{"line":59,"column":5}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":43},"end":{"line":8,"column":44}},"loc":{"start":{"line":8,"column":49},"end":{"line":8,"column":70}},"line":8}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":8},"end":{"line":56,"column":9}},"type":"switch","locations":[{"start":{"line":5,"column":12},"end":{"line":5,"column":44}},{"start":{"line":6,"column":12},"end":{"line":9,"column":22}},{"start":{"line":11,"column":12},"end":{"line":14,"column":22}},{"start":{"line":16,"column":12},"end":{"line":19,"column":22}},{"start":{"line":21,"column":12},"end":{"line":24,"column":22}},{"start":{"line":26,"column":12},"end":{"line":29,"column":22}},{"start":{"line":31,"column":12},"end":{"line":34,"column":22}},{"start":{"line":36,"column":12},"end":{"line":36,"column":37}},{"start":{"line":37,"column":12},"end":{"line":40,"column":22}},{"start":{"line":42,"column":12},"end":{"line":45,"column":22}},{"start":{"line":47,"column":12},"end":{"line":50,"column":22}},{"start":{"line":52,"column":12},"end":{"line":55,"column":22}}],"line":4}},"s":{"0":1,"1":8,"2":4,"3":4,"4":4,"5":4,"6":0,"7":0,"8":0,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":0,"16":0,"17":0,"18":2,"19":2,"20":2,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":8,"34":1},"f":{"0":8,"1":4},"b":{"0":[3,4,0,1,1,0,2,0,0,0,0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"4dc6d2c1056fd7db757cd1714eaeea475f56ed9b"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\openai.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\helpers\\openai.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":32}},"1":{"start":{"line":3,"column":15},"end":{"line":15,"column":1}},"2":{"start":{"line":4,"column":19},"end":{"line":6,"column":6}},"3":{"start":{"line":8,"column":24},"end":{"line":12,"column":6}},"4":{"start":{"line":14,"column":4},"end":{"line":14,"column":38}},"5":{"start":{"line":17,"column":25},"end":{"line":27,"column":1}},"6":{"start":{"line":18,"column":19},"end":{"line":18,"column":32}},"7":{"start":{"line":19,"column":17},"end":{"line":19,"column":79}},"8":{"start":{"line":21,"column":4},"end":{"line":23,"column":5}},"9":{"start":{"line":21,"column":17},"end":{"line":21,"column":18}},"10":{"start":{"line":22,"column":8},"end":{"line":22,"column":72}},"11":{"start":{"line":25,"column":4},"end":{"line":25,"column":300}},"12":{"start":{"line":26,"column":4},"end":{"line":26,"column":18}},"13":{"start":{"line":29,"column":26},"end":{"line":34,"column":1}},"14":{"start":{"line":30,"column":17},"end":{"line":30,"column":124}},"15":{"start":{"line":31,"column":4},"end":{"line":31,"column":25}},"16":{"start":{"line":32,"column":4},"end":{"line":32,"column":270}},"17":{"start":{"line":33,"column":4},"end":{"line":33,"column":18}},"18":{"start":{"line":36,"column":0},"end":{"line":36,"column":65}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":15},"end":{"line":3,"column":16}},"loc":{"start":{"line":3,"column":30},"end":{"line":15,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":25},"end":{"line":17,"column":26}},"loc":{"start":{"line":17,"column":40},"end":{"line":27,"column":1}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":26},"end":{"line":29,"column":27}},"loc":{"start":{"line":29,"column":36},"end":{"line":34,"column":1}},"line":29}},"branchMap":{},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":1,"14":0,"15":0,"16":0,"17":0,"18":1},"f":{"0":0,"1":0,"2":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ac3ccb417a2258c82ed20e927b88af0cf78d2f87"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\middlewares\\authentication.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\middlewares\\authentication.js","statementMap":{"0":{"start":{"line":2,"column":24},"end":{"line":2,"column":49}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":37}},"2":{"start":{"line":5,"column":23},"end":{"line":26,"column":1}},"3":{"start":{"line":6,"column":4},"end":{"line":25,"column":5}},"4":{"start":{"line":7,"column":8},"end":{"line":7,"column":76}},"5":{"start":{"line":7,"column":40},"end":{"line":7,"column":76}},"6":{"start":{"line":8,"column":22},"end":{"line":8,"column":65}},"7":{"start":{"line":10,"column":8},"end":{"line":10,"column":56}},"8":{"start":{"line":10,"column":20},"end":{"line":10,"column":56}},"9":{"start":{"line":12,"column":23},"end":{"line":12,"column":41}},"10":{"start":{"line":13,"column":21},"end":{"line":13,"column":44}},"11":{"start":{"line":15,"column":8},"end":{"line":15,"column":55}},"12":{"start":{"line":15,"column":19},"end":{"line":15,"column":55}},"13":{"start":{"line":16,"column":8},"end":{"line":20,"column":10}},"14":{"start":{"line":22,"column":8},"end":{"line":22,"column":15}},"15":{"start":{"line":24,"column":8},"end":{"line":24,"column":20}},"16":{"start":{"line":28,"column":0},"end":{"line":28,"column":32}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":23},"end":{"line":5,"column":24}},"loc":{"start":{"line":5,"column":49},"end":{"line":26,"column":1}},"line":5}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":8},"end":{"line":7,"column":76}},"type":"if","locations":[{"start":{"line":7,"column":8},"end":{"line":7,"column":76}},{"start":{},"end":{}}],"line":7},"1":{"loc":{"start":{"line":10,"column":8},"end":{"line":10,"column":56}},"type":"if","locations":[{"start":{"line":10,"column":8},"end":{"line":10,"column":56}},{"start":{},"end":{}}],"line":10},"2":{"loc":{"start":{"line":15,"column":8},"end":{"line":15,"column":55}},"type":"if","locations":[{"start":{"line":15,"column":8},"end":{"line":15,"column":55}},{"start":{},"end":{}}],"line":15}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":1},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"285c615d1bae8083ed87dc37ba1bdbc07d17c7ce"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\middlewares\\authorization.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\middlewares\\authorization.js","statementMap":{"0":{"start":{"line":1,"column":23},"end":{"line":1,"column":43}},"1":{"start":{"line":3,"column":22},"end":{"line":16,"column":1}},"2":{"start":{"line":5,"column":8},"end":{"line":13,"column":9}},"3":{"start":{"line":6,"column":25},"end":{"line":6,"column":57}},"4":{"start":{"line":7,"column":12},"end":{"line":7,"column":56}},"5":{"start":{"line":7,"column":23},"end":{"line":7,"column":56}},"6":{"start":{"line":8,"column":12},"end":{"line":8,"column":72}},"7":{"start":{"line":8,"column":39},"end":{"line":8,"column":72}},"8":{"start":{"line":10,"column":12},"end":{"line":10,"column":19}},"9":{"start":{"line":12,"column":12},"end":{"line":12,"column":24}},"10":{"start":{"line":18,"column":0},"end":{"line":18,"column":31}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":15},"end":{"line":4,"column":16}},"loc":{"start":{"line":4,"column":41},"end":{"line":14,"column":5}},"line":4}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":12},"end":{"line":7,"column":56}},"type":"if","locations":[{"start":{"line":7,"column":12},"end":{"line":7,"column":56}},{"start":{},"end":{}}],"line":7},"1":{"loc":{"start":{"line":8,"column":12},"end":{"line":8,"column":72}},"type":"if","locations":[{"start":{"line":8,"column":12},"end":{"line":8,"column":72}},{"start":{},"end":{}}],"line":8}},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":1},"f":{"0":0},"b":{"0":[0,0],"1":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"2cc6940e27afac058ae9e244f954f77a80e28cf2"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\middlewares\\errorHandler.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\middlewares\\errorHandler.js","statementMap":{"0":{"start":{"line":1,"column":21},"end":{"line":66,"column":1}},"1":{"start":{"line":4,"column":8},"end":{"line":61,"column":9}},"2":{"start":{"line":7,"column":16},"end":{"line":7,"column":33}},"3":{"start":{"line":8,"column":16},"end":{"line":8,"column":72}},"4":{"start":{"line":8,"column":51},"end":{"line":8,"column":68}},"5":{"start":{"line":9,"column":16},"end":{"line":9,"column":22}},"6":{"start":{"line":12,"column":16},"end":{"line":12,"column":33}},"7":{"start":{"line":13,"column":16},"end":{"line":13,"column":49}},"8":{"start":{"line":14,"column":16},"end":{"line":14,"column":22}},"9":{"start":{"line":17,"column":16},"end":{"line":17,"column":33}},"10":{"start":{"line":18,"column":16},"end":{"line":18,"column":46}},"11":{"start":{"line":19,"column":16},"end":{"line":19,"column":22}},"12":{"start":{"line":22,"column":16},"end":{"line":22,"column":33}},"13":{"start":{"line":23,"column":16},"end":{"line":23,"column":49}},"14":{"start":{"line":24,"column":16},"end":{"line":24,"column":22}},"15":{"start":{"line":27,"column":16},"end":{"line":27,"column":33}},"16":{"start":{"line":28,"column":16},"end":{"line":28,"column":55}},"17":{"start":{"line":29,"column":16},"end":{"line":29,"column":22}},"18":{"start":{"line":32,"column":16},"end":{"line":32,"column":33}},"19":{"start":{"line":33,"column":16},"end":{"line":33,"column":52}},"20":{"start":{"line":34,"column":16},"end":{"line":34,"column":22}},"21":{"start":{"line":37,"column":16},"end":{"line":37,"column":33}},"22":{"start":{"line":38,"column":16},"end":{"line":38,"column":61}},"23":{"start":{"line":39,"column":16},"end":{"line":39,"column":22}},"24":{"start":{"line":43,"column":16},"end":{"line":43,"column":33}},"25":{"start":{"line":44,"column":16},"end":{"line":44,"column":44}},"26":{"start":{"line":45,"column":16},"end":{"line":45,"column":22}},"27":{"start":{"line":48,"column":16},"end":{"line":48,"column":33}},"28":{"start":{"line":49,"column":16},"end":{"line":49,"column":50}},"29":{"start":{"line":50,"column":16},"end":{"line":50,"column":22}},"30":{"start":{"line":53,"column":16},"end":{"line":53,"column":33}},"31":{"start":{"line":54,"column":16},"end":{"line":54,"column":38}},"32":{"start":{"line":55,"column":16},"end":{"line":55,"column":22}},"33":{"start":{"line":58,"column":16},"end":{"line":58,"column":33}},"34":{"start":{"line":59,"column":16},"end":{"line":59,"column":50}},"35":{"start":{"line":60,"column":16},"end":{"line":60,"column":22}},"36":{"start":{"line":63,"column":8},"end":{"line":63,"column":54}},"37":{"start":{"line":68,"column":0},"end":{"line":68,"column":30}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":13},"end":{"line":2,"column":14}},"loc":{"start":{"line":2,"column":49},"end":{"line":64,"column":5}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":43},"end":{"line":8,"column":44}},"loc":{"start":{"line":8,"column":49},"end":{"line":8,"column":70}},"line":8}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":8},"end":{"line":61,"column":9}},"type":"switch","locations":[{"start":{"line":5,"column":12},"end":{"line":5,"column":44}},{"start":{"line":6,"column":12},"end":{"line":9,"column":22}},{"start":{"line":11,"column":12},"end":{"line":14,"column":22}},{"start":{"line":16,"column":12},"end":{"line":19,"column":22}},{"start":{"line":21,"column":12},"end":{"line":24,"column":22}},{"start":{"line":26,"column":12},"end":{"line":29,"column":22}},{"start":{"line":31,"column":12},"end":{"line":34,"column":22}},{"start":{"line":36,"column":12},"end":{"line":39,"column":22}},{"start":{"line":41,"column":12},"end":{"line":41,"column":37}},{"start":{"line":42,"column":12},"end":{"line":45,"column":22}},{"start":{"line":47,"column":12},"end":{"line":50,"column":22}},{"start":{"line":52,"column":12},"end":{"line":55,"column":22}},{"start":{"line":57,"column":12},"end":{"line":60,"column":22}}],"line":4}},"s":{"0":1,"1":9,"2":4,"3":4,"4":4,"5":4,"6":0,"7":0,"8":0,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":0,"16":0,"17":0,"18":2,"19":2,"20":2,"21":1,"22":1,"23":1,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":9,"37":1},"f":{"0":9,"1":4},"b":{"0":[3,4,0,1,1,0,2,1,0,0,0,0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f6d1a1d17555ef71bb55639a16fed1e45d86b68b"} ,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\book.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\book.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":82,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":16,"column":9}},"3":{"start":{"line":19,"column":2},"end":{"line":80,"column":5}},"4":{"start":{"line":81,"column":2},"end":{"line":81,"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":82,"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":17,"column":5}},"line":12}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{"0":1,"1":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1f5f099b55b81754d08c6cbbc47d71094d8d75a1"} ,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\history.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\history.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":52,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":14,"column":63}},"3":{"start":{"line":15,"column":6},"end":{"line":15,"column":63}},"4":{"start":{"line":18,"column":2},"end":{"line":50,"column":5}},"5":{"start":{"line":51,"column":2},"end":{"line":51,"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":52,"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":1,"1":1,"2":1,"3":1,"4":1,"5":1},"f":{"0":1,"1":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"98da8ad63804f7670803ee48beea4b6a624ef3bd"} ,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\index.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\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":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":1,"11":1,"12":5,"13":4,"14":4,"15":1,"16":4,"17":4,"18":1,"19":1,"20":1},"f":{"0":5,"1":4,"2":4},"b":{"0":[1,0],"1":[0,1],"2":[5,5,4,4],"3":[4,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c5e6338cec851d2f43b0e46aff1b089bf4c057b9"} -,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\user.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\user.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":23},"end":{"line":5,"column":53}},"2":{"start":{"line":6,"column":0},"end":{"line":99,"column":2}},"3":{"start":{"line":15,"column":6},"end":{"line":18,"column":9}},"4":{"start":{"line":19,"column":6},"end":{"line":22,"column":9}},"5":{"start":{"line":25,"column":2},"end":{"line":92,"column":5}},"6":{"start":{"line":94,"column":2},"end":{"line":96,"column":5}},"7":{"start":{"line":95,"column":4},"end":{"line":95,"column":46}},"8":{"start":{"line":98,"column":2},"end":{"line":98,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":17},"end":{"line":6,"column":18}},"loc":{"start":{"line":6,"column":43},"end":{"line":99,"column":1}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":5}},"loc":{"start":{"line":13,"column":29},"end":{"line":23,"column":5}},"line":13},"2":{"name":"(anonymous_2)","decl":{"start":{"line":94,"column":20},"end":{"line":94,"column":21}},"loc":{"start":{"line":94,"column":30},"end":{"line":96,"column":3}},"line":94}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":2,"8":1},"f":{"0":1,"1":1,"2":2},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a4d8dec31a158ef245baead8543877a0e328f497"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\user.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\user.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":23},"end":{"line":5,"column":53}},"2":{"start":{"line":6,"column":0},"end":{"line":100,"column":2}},"3":{"start":{"line":15,"column":6},"end":{"line":18,"column":9}},"4":{"start":{"line":19,"column":6},"end":{"line":22,"column":9}},"5":{"start":{"line":25,"column":2},"end":{"line":93,"column":5}},"6":{"start":{"line":95,"column":2},"end":{"line":97,"column":5}},"7":{"start":{"line":96,"column":4},"end":{"line":96,"column":46}},"8":{"start":{"line":99,"column":2},"end":{"line":99,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":17},"end":{"line":6,"column":18}},"loc":{"start":{"line":6,"column":43},"end":{"line":100,"column":1}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":5}},"loc":{"start":{"line":13,"column":29},"end":{"line":23,"column":5}},"line":13},"2":{"name":"(anonymous_2)","decl":{"start":{"line":95,"column":20},"end":{"line":95,"column":21}},"loc":{"start":{"line":95,"column":30},"end":{"line":97,"column":3}},"line":95}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":3,"8":1},"f":{"0":1,"1":1,"2":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"4eb46f7805e93fa2bc75ff0ab184371781dc824b"} ,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\userdetail.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\models\\userdetail.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":59,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":14,"column":66}},"3":{"start":{"line":17,"column":2},"end":{"line":48,"column":5}},"4":{"start":{"line":50,"column":2},"end":{"line":57,"column":5}},"5":{"start":{"line":51,"column":18},"end":{"line":51,"column":22}},"6":{"start":{"line":52,"column":4},"end":{"line":52,"column":46}},"7":{"start":{"line":53,"column":4},"end":{"line":53,"column":29}},"8":{"start":{"line":54,"column":4},"end":{"line":54,"column":52}},"9":{"start":{"line":55,"column":4},"end":{"line":55,"column":25}},"10":{"start":{"line":56,"column":4},"end":{"line":56,"column":27}},"11":{"start":{"line":58,"column":2},"end":{"line":58,"column":20}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":59,"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},"2":{"name":"(anonymous_2)","decl":{"start":{"line":50,"column":26},"end":{"line":50,"column":27}},"loc":{"start":{"line":50,"column":36},"end":{"line":57,"column":3}},"line":50}},"branchMap":{"0":{"loc":{"start":{"line":54,"column":4},"end":{"line":54,"column":51}},"type":"cond-expr","locations":[{"start":{"line":54,"column":18},"end":{"line":54,"column":33}},{"start":{"line":54,"column":36},"end":{"line":54,"column":51}}],"line":54}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"f":{"0":1,"1":1,"2":1},"b":{"0":[0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"08f5316a90d07ba1691745ff6c2281ce0e6ea6a8"} -,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\routes\\index.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\routes\\index.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":26},"end":{"line":2,"column":69}},"2":{"start":{"line":3,"column":23},"end":{"line":3,"column":63}},"3":{"start":{"line":4,"column":21},"end":{"line":4,"column":59}},"4":{"start":{"line":5,"column":15},"end":{"line":5,"column":31}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":48}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":44}},"7":{"start":{"line":10,"column":0},"end":{"line":10,"column":51}},"8":{"start":{"line":11,"column":0},"end":{"line":11,"column":51}},"9":{"start":{"line":12,"column":0},"end":{"line":12,"column":33}},"10":{"start":{"line":14,"column":0},"end":{"line":14,"column":24}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e9476553f8bcca705c5085b79c80350e776070d5"} +,"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\routes\\index.js": {"path":"D:\\Hacktiv8XZakatloop\\Phase-2\\projects\\IP-arvinaufal-RMT42\\server\\routes\\index.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":26},"end":{"line":2,"column":69}},"2":{"start":{"line":3,"column":23},"end":{"line":3,"column":63}},"3":{"start":{"line":4,"column":21},"end":{"line":4,"column":59}},"4":{"start":{"line":5,"column":23},"end":{"line":5,"column":63}},"5":{"start":{"line":6,"column":22},"end":{"line":6,"column":61}},"6":{"start":{"line":7,"column":23},"end":{"line":7,"column":63}},"7":{"start":{"line":8,"column":15},"end":{"line":8,"column":31}},"8":{"start":{"line":10,"column":0},"end":{"line":10,"column":48}},"9":{"start":{"line":11,"column":0},"end":{"line":11,"column":44}},"10":{"start":{"line":13,"column":0},"end":{"line":13,"column":78}},"11":{"start":{"line":14,"column":0},"end":{"line":14,"column":68}},"12":{"start":{"line":15,"column":0},"end":{"line":15,"column":76}},"13":{"start":{"line":16,"column":0},"end":{"line":16,"column":82}},"14":{"start":{"line":17,"column":0},"end":{"line":17,"column":98}},"15":{"start":{"line":18,"column":0},"end":{"line":18,"column":95}},"16":{"start":{"line":19,"column":0},"end":{"line":19,"column":33}},"17":{"start":{"line":21,"column":0},"end":{"line":21,"column":24}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0f016e8223fbbb015452b41330579e31dafe264d"} } diff --git a/server/coverage/lcov-report/index.html b/server/coverage/lcov-report/index.html index e807c11..3108a3b 100644 --- a/server/coverage/lcov-report/index.html +++ b/server/coverage/lcov-report/index.html @@ -23,30 +23,30 @@

All files

- 63.98% + 44.79% Statements - 135/211 + 172/384
- 66.66% + 30% Branches - 28/42 + 33/110
- 68.96% + 37.93% Functions - 20/29 + 22/58
- 63.9% + 49.39% Lines - 131/205 + 163/330
@@ -61,7 +61,7 @@

All files

-
+
@@ -95,47 +95,47 @@

All files

- - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + @@ -159,13 +159,13 @@

All files

- + - + @@ -176,7 +176,7 @@

All files

+ + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/controllers/HistoryController.js.html b/server/coverage/lcov-report/server/controllers/HistoryController.js.html index 5b2b882..124a066 100644 --- a/server/coverage/lcov-report/server/controllers/HistoryController.js.html +++ b/server/coverage/lcov-report/server/controllers/HistoryController.js.html @@ -23,30 +23,30 @@

All files / server/contr

server/controllers -
+
+
37.14%26/7087.5%14/1625%2/834.84%23/6621.35%41/19227.69%18/6512.5%4/3222.75%33/145
server/helpers -
+
+
59.37%19/32100%0/050%3/661.29%19/3153.33%24/450%0/833.33%3/954.54%24/44
server/middlewares -
+
+
48.57%17/3541.66%5/12100%2/247.05%16/3440.9%27/6626.08%6/2350%2/443.33%26/60
100%11/1118/18 100% 0/0 100% 0/0 100%11/1118/18
1x +591x 1x 1x   @@ -131,14 +130,17 @@

All files / server/contr       +    -  -  +  +  +        -    +  +        @@ -147,6 +149,10 @@

All files / server/contr       +  +  +  +        @@ -158,96 +164,87 @@

All files / server/contr       -      -  -  +            +1x   -  -  -  -  -  -  -            -1x

const OpenAI = require('openai');
+ 
const OpenAI = require('openai');
 const { History } = require('../models');
-const { generateAnsPromt } = require('../helpers/openai');
+const { generateAnsPromt, chatAI } = require('../helpers/openai');
  
 class HistoryController {
     static async create(req, res, next) {
+        const { bookId } = req.params
         try {
-            const history = await History.create({ userId: req.user.id, status: 'unpaid' });
-            const openai = new OpenAI({
-                apiKey: process.env.OpenAI_KEY
-            });
- 
+            const history = await History.create({ userId: req.user.id, status: 'unpaid', bookId });
             const question = `randomize saya 5 pertanyaan yang jawabannya cukup ya atau tidak mengenai topik pemrograman khususnya materi dasar javascript, reactjs, dan express js cukup pertanyaan mudah dan singkat untuk junior programmer atau bahkan orang awam. cukup jawab tanpa deskripsi apa pun cukup dengan format seperti di bawah ini di mana 5 pertanyaan tersebut dalam 1 array! perhatikan dengan benar format di bawah ini! dan jangan berikan respons dalam bentuk list di list
             format responsnya harus seperti ini, perhatikan! pertanyaan1;;pertanyaan 2;;pertanyaan3`;
- 
-            const { choices } = await openai.chat.completions.create({
-                model: 'gpt-3.5-turbo',
-                messages: [{ "role": "user", "content": question }],
-                max_tokens: 210
-            });
- 
-            let questions = choices[0].message.content;
+            let questions = chatAI(question);
             history.update({ question: questions });
             questions = questions.split(';;');
-            res.status(201).json({ messages: `Successfully create history`, data: questions });
+            res.status(201).json({
+                messages: `Successfully create history`, data: { questions, historyId: history.id }
+            });
         } catch (error) {
-            console.log(error);
+            /* eslint-disable */console.log(...oo_oo(`1304250826_19_12_19_30_4`,error));
             next(error);
         }
     }
  
-    static async update(req, res, next) {
-        const { answer, historyId } = req.body
+    static async updatePoin(req, res, next) {
+        const { answer } = req.body;
+        const { historyId } = req.params;
         try {
             const history = History.findByPk(historyId);
             const promt = generateAnsPromt(history.question, answer);
+            let point = chatAI(promt);
+            history.update({ point: +point, answer: answer.join(";;") });
+            res.status(200).json({ messages: `Successfully get point`, data: +point });
+        } catch (error) {
+            /* eslint-disable */console.log(...oo_oo(`1304250826_34_12_34_30_4`,error));
+            next(error);
+        }
+    }
  
-            const openai = new OpenAI({
-                apiKey: process.env.OpenAI_KEY
-            });
- 
-            const { choices } = await openai.chat.completions.create({
-                model: 'gpt-3.5-turbo',
-                messages: [{ "role": "user", "content": promt }],
-                max_tokens: 210
-            });
- 
-            let questions = choices[0].message.content;
-            history.update({ point: +questions });
- 
-            res.status(200).json({ messages: `Successfully get point`, data: questions });
+    static async updateBookId(req, res, next) {
+        const { historyId, bookId } = req.params;
+        try {
+            const history = History.findByPk(historyId);
+            history.update({ bookId });
+            res.status(200).json({ messages: `Successfully update book` });
         } catch (error) {
-            console.log(error);
+            /* eslint-disable */console.log(...oo_oo(`1304250826_46_12_46_30_4`,error));
             next(error);
         }
     }
-    
 }
  
-module.exports = HistoryController;
+module.exports = HistoryController; +  +  +  +  +  +  +/* eslint-disable */;function oo_cm(){try{return (0,eval)("globalThis._console_ninja") || (0,eval)("/* https://github.com/wallabyjs/console-ninja#how-does-it-work */'use strict';var _0xa27832=_0x1dc1;(function(_0x123f3d,_0x3fd92b){var _0x5b61d8=_0x1dc1,_0x37f531=_0x123f3d();while(!![]){try{var _0x55c835=-parseInt(_0x5b61d8(0x130))/0x1*(-parseInt(_0x5b61d8(0x1a4))/0x2)+parseInt(_0x5b61d8(0x1b7))/0x3+parseInt(_0x5b61d8(0x15d))/0x4+-parseInt(_0x5b61d8(0x1d8))/0x5+parseInt(_0x5b61d8(0x1aa))/0x6+parseInt(_0x5b61d8(0x196))/0x7+-parseInt(_0x5b61d8(0x1a1))/0x8*(parseInt(_0x5b61d8(0x146))/0x9);if(_0x55c835===_0x3fd92b)break;else _0x37f531['push'](_0x37f531['shift']());}catch(_0x3ac464){_0x37f531['push'](_0x37f531['shift']());}}}(_0x5c86,0x393e1));var j=Object['create'],H=Object[_0xa27832(0x18d)],G=Object[_0xa27832(0x193)],ee=Object[_0xa27832(0x180)],te=Object[_0xa27832(0x1d0)],ne=Object['prototype'][_0xa27832(0x15f)],re=(_0x2eba41,_0x3f2a81,_0x5f0a64,_0x5d0598)=>{var _0x437b46=_0xa27832;if(_0x3f2a81&&typeof _0x3f2a81==_0x437b46(0x128)||typeof _0x3f2a81==_0x437b46(0x11f)){for(let _0x4f77a4 of ee(_0x3f2a81))!ne['call'](_0x2eba41,_0x4f77a4)&&_0x4f77a4!==_0x5f0a64&&H(_0x2eba41,_0x4f77a4,{'get':()=>_0x3f2a81[_0x4f77a4],'enumerable':!(_0x5d0598=G(_0x3f2a81,_0x4f77a4))||_0x5d0598['enumerable']});}return _0x2eba41;},x=(_0x333438,_0x83d8d0,_0x5bfa7b)=>(_0x5bfa7b=_0x333438!=null?j(te(_0x333438)):{},re(_0x83d8d0||!_0x333438||!_0x333438['__es'+'Module']?H(_0x5bfa7b,_0xa27832(0x1c9),{'value':_0x333438,'enumerable':!0x0}):_0x5bfa7b,_0x333438)),X=class{constructor(_0x3dfd41,_0x49132f,_0x2ec422,_0x30de33,_0x2f297c){var _0x124f0a=_0xa27832;this[_0x124f0a(0x174)]=_0x3dfd41,this[_0x124f0a(0x138)]=_0x49132f,this[_0x124f0a(0x1b0)]=_0x2ec422,this[_0x124f0a(0x171)]=_0x30de33,this[_0x124f0a(0x1bb)]=_0x2f297c,this['_allowedToSend']=!0x0,this[_0x124f0a(0x1a7)]=!0x0,this['_connected']=!0x1,this[_0x124f0a(0x1f1)]=!0x1,this[_0x124f0a(0x14a)]=_0x3dfd41[_0x124f0a(0x127)]?.['env']?.[_0x124f0a(0x18c)]==='edge',this['_inBrowser']=!this[_0x124f0a(0x174)][_0x124f0a(0x127)]?.[_0x124f0a(0x1b4)]?.[_0x124f0a(0x11e)]&&!this[_0x124f0a(0x14a)],this[_0x124f0a(0x176)]=null,this[_0x124f0a(0x132)]=0x0,this['_maxConnectAttemptCount']=0x14,this[_0x124f0a(0x19c)]=_0x124f0a(0x1dc),this[_0x124f0a(0x1f9)]=(this[_0x124f0a(0x13a)]?_0x124f0a(0x1e8):'Console\\x20Ninja\\x20failed\\x20to\\x20send\\x20logs,\\x20restarting\\x20the\\x20process\\x20may\\x20help;\\x20also\\x20see\\x20')+this['_webSocketErrorDocsLink'];}async['getWebSocketClass'](){var _0x42eb74=_0xa27832;if(this[_0x42eb74(0x176)])return this['_WebSocketClass'];let _0x14458c;if(this[_0x42eb74(0x13a)]||this[_0x42eb74(0x14a)])_0x14458c=this[_0x42eb74(0x174)]['WebSocket'];else{if(this['global'][_0x42eb74(0x127)]?.[_0x42eb74(0x1c4)])_0x14458c=this[_0x42eb74(0x174)][_0x42eb74(0x127)]?.[_0x42eb74(0x1c4)];else try{let _0x5d5ce4=await import(_0x42eb74(0x1d5));_0x14458c=(await import((await import(_0x42eb74(0x153)))[_0x42eb74(0x186)](_0x5d5ce4[_0x42eb74(0x122)](this['nodeModules'],'ws/index.js'))[_0x42eb74(0x158)]()))[_0x42eb74(0x1c9)];}catch{try{_0x14458c=require(require('path')[_0x42eb74(0x122)](this[_0x42eb74(0x171)],'ws'));}catch{throw new Error('failed\\x20to\\x20find\\x20and\\x20load\\x20WebSocket');}}}return this['_WebSocketClass']=_0x14458c,_0x14458c;}['_connectToHostNow'](){var _0x58b8e3=_0xa27832;this['_connecting']||this[_0x58b8e3(0x207)]||this[_0x58b8e3(0x132)]>=this[_0x58b8e3(0x1f7)]||(this['_allowedToConnectOnSend']=!0x1,this[_0x58b8e3(0x1f1)]=!0x0,this[_0x58b8e3(0x132)]++,this[_0x58b8e3(0x17d)]=new Promise((_0x288218,_0xb5afd8)=>{var _0x47a67c=_0x58b8e3;this[_0x47a67c(0x14c)]()['then'](_0x33ea52=>{var _0x35c260=_0x47a67c;let _0x3a9296=new _0x33ea52(_0x35c260(0x1f8)+(!this['_inBrowser']&&this['dockerizedApp']?_0x35c260(0x19a):this['host'])+':'+this[_0x35c260(0x1b0)]);_0x3a9296[_0x35c260(0x12c)]=()=>{var _0x315e8b=_0x35c260;this[_0x315e8b(0x1ec)]=!0x1,this[_0x315e8b(0x16a)](_0x3a9296),this[_0x315e8b(0x1ed)](),_0xb5afd8(new Error('logger\\x20websocket\\x20error'));},_0x3a9296[_0x35c260(0x192)]=()=>{var _0x1f659e=_0x35c260;this[_0x1f659e(0x13a)]||_0x3a9296[_0x1f659e(0x1f3)]&&_0x3a9296[_0x1f659e(0x1f3)][_0x1f659e(0x1dd)]&&_0x3a9296[_0x1f659e(0x1f3)][_0x1f659e(0x1dd)](),_0x288218(_0x3a9296);},_0x3a9296[_0x35c260(0x19e)]=()=>{var _0x491117=_0x35c260;this['_allowedToConnectOnSend']=!0x0,this[_0x491117(0x16a)](_0x3a9296),this['_attemptToReconnectShortly']();},_0x3a9296[_0x35c260(0x149)]=_0x30282c=>{var _0x47b39d=_0x35c260;try{_0x30282c&&_0x30282c[_0x47b39d(0x167)]&&this[_0x47b39d(0x13a)]&&JSON[_0x47b39d(0x17a)](_0x30282c[_0x47b39d(0x167)])[_0x47b39d(0x1ca)]===_0x47b39d(0x191)&&this['global'][_0x47b39d(0x13b)]['reload']();}catch{}};})['then'](_0x483e89=>(this['_connected']=!0x0,this[_0x47a67c(0x1f1)]=!0x1,this[_0x47a67c(0x1a7)]=!0x1,this[_0x47a67c(0x1ec)]=!0x0,this[_0x47a67c(0x132)]=0x0,_0x483e89))[_0x47a67c(0x1e3)](_0x27ef53=>(this[_0x47a67c(0x207)]=!0x1,this['_connecting']=!0x1,console[_0x47a67c(0x201)](_0x47a67c(0x1bc)+this[_0x47a67c(0x19c)]),_0xb5afd8(new Error(_0x47a67c(0x1e1)+(_0x27ef53&&_0x27ef53[_0x47a67c(0x200)])))));}));}[_0xa27832(0x16a)](_0x20069b){var _0x3e0e5d=_0xa27832;this[_0x3e0e5d(0x207)]=!0x1,this[_0x3e0e5d(0x1f1)]=!0x1;try{_0x20069b[_0x3e0e5d(0x19e)]=null,_0x20069b['onerror']=null,_0x20069b[_0x3e0e5d(0x192)]=null;}catch{}try{_0x20069b['readyState']<0x2&&_0x20069b[_0x3e0e5d(0x135)]();}catch{}}[_0xa27832(0x1ed)](){var _0x421ca7=_0xa27832;clearTimeout(this[_0x421ca7(0x1fb)]),!(this[_0x421ca7(0x132)]>=this[_0x421ca7(0x1f7)])&&(this[_0x421ca7(0x1fb)]=setTimeout(()=>{var _0x5b1a67=_0x421ca7;this[_0x5b1a67(0x207)]||this['_connecting']||(this[_0x5b1a67(0x190)](),this[_0x5b1a67(0x17d)]?.[_0x5b1a67(0x1e3)](()=>this[_0x5b1a67(0x1ed)]()));},0x1f4),this['_reconnectTimeout'][_0x421ca7(0x1dd)]&&this['_reconnectTimeout'][_0x421ca7(0x1dd)]());}async[_0xa27832(0x14b)](_0x32c23a){var _0x49c046=_0xa27832;try{if(!this['_allowedToSend'])return;this['_allowedToConnectOnSend']&&this[_0x49c046(0x190)](),(await this[_0x49c046(0x17d)])[_0x49c046(0x14b)](JSON[_0x49c046(0x165)](_0x32c23a));}catch(_0x4995c5){console[_0x49c046(0x201)](this['_sendErrorMessage']+':\\x20'+(_0x4995c5&&_0x4995c5[_0x49c046(0x200)])),this[_0x49c046(0x1ec)]=!0x1,this[_0x49c046(0x1ed)]();}}};function b(_0xfb0a85,_0x35bff4,_0x3027d1,_0x4ea110,_0x21c6ac,_0x49af7a){var _0x2a1cad=_0xa27832;let _0x1323c1=_0x3027d1[_0x2a1cad(0x126)](',')[_0x2a1cad(0x1cc)](_0x1d92f8=>{var _0x10eed2=_0x2a1cad;try{_0xfb0a85[_0x10eed2(0x1ad)]||((_0x21c6ac==='next.js'||_0x21c6ac===_0x10eed2(0x1c3)||_0x21c6ac===_0x10eed2(0x1df))&&(_0x21c6ac+=!_0xfb0a85[_0x10eed2(0x127)]?.[_0x10eed2(0x1b4)]?.[_0x10eed2(0x11e)]&&_0xfb0a85[_0x10eed2(0x127)]?.[_0x10eed2(0x1bf)]?.['NEXT_RUNTIME']!==_0x10eed2(0x147)?_0x10eed2(0x17c):_0x10eed2(0x18b)),_0xfb0a85[_0x10eed2(0x1ad)]={'id':+new Date(),'tool':_0x21c6ac});let _0x5505f4=new X(_0xfb0a85,_0x35bff4,_0x1d92f8,_0x4ea110,_0x49af7a);return _0x5505f4[_0x10eed2(0x14b)][_0x10eed2(0x1a0)](_0x5505f4);}catch(_0x2454dc){return console['warn'](_0x10eed2(0x144),_0x2454dc&&_0x2454dc[_0x10eed2(0x200)]),()=>{};}});return _0x399fb5=>_0x1323c1[_0x2a1cad(0x159)](_0x4c0693=>_0x4c0693(_0x399fb5));}function _0x1dc1(_0x474f12,_0x5a5cc4){var _0x5c86ff=_0x5c86();return _0x1dc1=function(_0x1dc1af,_0x4b319a){_0x1dc1af=_0x1dc1af-0x11d;var _0x2c38d3=_0x5c86ff[_0x1dc1af];return _0x2c38d3;},_0x1dc1(_0x474f12,_0x5a5cc4);}function W(_0x3c919c){var _0xa38964=_0xa27832;let _0x5d8fa7=function(_0x111626,_0x48d78f){return _0x48d78f-_0x111626;},_0x47e274;if(_0x3c919c[_0xa38964(0x137)])_0x47e274=function(){var _0x139704=_0xa38964;return _0x3c919c[_0x139704(0x137)][_0x139704(0x183)]();};else{if(_0x3c919c[_0xa38964(0x127)]&&_0x3c919c['process']['hrtime']&&_0x3c919c[_0xa38964(0x127)]?.[_0xa38964(0x1bf)]?.[_0xa38964(0x18c)]!==_0xa38964(0x147))_0x47e274=function(){var _0x4f6eb7=_0xa38964;return _0x3c919c[_0x4f6eb7(0x127)]['hrtime']();},_0x5d8fa7=function(_0x5cc8cc,_0x179280){return 0x3e8*(_0x179280[0x0]-_0x5cc8cc[0x0])+(_0x179280[0x1]-_0x5cc8cc[0x1])/0xf4240;};else try{let {performance:_0x2f3b23}=require(_0xa38964(0x1e4));_0x47e274=function(){var _0xb531e7=_0xa38964;return _0x2f3b23[_0xb531e7(0x183)]();};}catch{_0x47e274=function(){return+new Date();};}}return{'elapsed':_0x5d8fa7,'timeStamp':_0x47e274,'now':()=>Date[_0xa38964(0x183)]()};}function J(_0x2858d9,_0x5c5aa8,_0x4a30fd){var _0x57f067=_0xa27832;if(_0x2858d9[_0x57f067(0x1fa)]!==void 0x0)return _0x2858d9[_0x57f067(0x1fa)];let _0x36458e=_0x2858d9[_0x57f067(0x127)]?.[_0x57f067(0x1b4)]?.[_0x57f067(0x11e)]||_0x2858d9[_0x57f067(0x127)]?.[_0x57f067(0x1bf)]?.[_0x57f067(0x18c)]===_0x57f067(0x147);return _0x36458e&&_0x4a30fd===_0x57f067(0x189)?_0x2858d9[_0x57f067(0x1fa)]=!0x1:_0x2858d9['_consoleNinjaAllowedToStart']=_0x36458e||!_0x5c5aa8||_0x2858d9['location']?.['hostname']&&_0x5c5aa8['includes'](_0x2858d9[_0x57f067(0x13b)][_0x57f067(0x177)]),_0x2858d9['_consoleNinjaAllowedToStart'];}function _0x5c86(){var _0x75ddb6=['prototype','_disposeWebsocket','[object\\x20Map]','_getOwnPropertyNames','sortProps','negativeZero','POSITIVE_INFINITY','timeEnd','nodeModules','hits','elements','global','isExpressionToEvaluate','_WebSocketClass','hostname','indexOf','setter','parse',':logPointId:','\\x20browser','_ws','_sortProps','symbol','getOwnPropertyNames','[object\\x20Date]','_setNodeLabel','now','expId','_numberRegExp','pathToFileURL','127.0.0.1','_setNodeExpressionPath','nuxt','test','\\x20server','NEXT_RUNTIME','defineProperty','autoExpandMaxDepth','call','_connectToHostNow','reload','onopen','getOwnPropertyDescriptor','RegExp','1700020351463','413875qodzFn','undefined','allStrLength','_setNodePermissions','gateway.docker.internal','_regExpToString','_webSocketErrorDocsLink','NEGATIVE_INFINITY','onclose','replace','bind','8dmCqVI','_type','log','4XvINbh','capped',[\"localhost\",\"127.0.0.1\",\"example.cypress.io\",\"MSI\",\"192.168.1.7\"],'_allowedToConnectOnSend','_isPrimitiveWrapperType','resolveGetters','339150jhDzde','_p_length','constructor','_console_ninja_session','props','stack','port','date','_additionalMetadata','_undefined','versions','_property','isArray','565251kIdZbe','valueOf','current','coverage','dockerizedApp','logger\\x20failed\\x20to\\x20connect\\x20to\\x20host,\\x20see\\x20','_setNodeQueryPath','array','env','autoExpandLimit','get','_HTMLAllCollection','remix','_WebSocket','Buffer','_hasSymbolPropertyOnItsPath','cappedProps','count','default','method','_getOwnPropertySymbols','map','match','pop','cappedElements','getPrototypeOf','_quotedRegExp','_isUndefined','index','_Symbol','path','...','parent','2054665DwkuDl','Map','bigint','_addProperty','https://tinyurl.com/37x8b79t','unref','Number','astro','depth','failed\\x20to\\x20connect\\x20to\\x20host:\\x20','[object\\x20BigInt]','catch','perf_hooks','HTMLAllCollection','reduceLimits','_addFunctionsNode','Console\\x20Ninja\\x20failed\\x20to\\x20send\\x20logs,\\x20refreshing\\x20the\\x20page\\x20may\\x20help;\\x20also\\x20see\\x20','time','level','_keyStrRegExp','_allowedToSend','_attemptToReconnectShortly','console','_blacklistedProperty','_isPrimitiveType','_connecting','_hasSetOnItsPath','_socket','string','number','disabledTrace','_maxConnectAttemptCount','ws://','_sendErrorMessage','_consoleNinjaAllowedToStart','_reconnectTimeout','_hasMapOnItsPath','_addLoadNode','unknown','error','message','warn','[object\\x20Set]','_treeNodePropertiesAfterFullValue','concat','_setNodeExpandableState','','_connected','_treeNodePropertiesBeforeFullValue','node','function','push','serialize','join','_capIfString','rootExpression','stackTraceLimit','split','process','object','_propertyName','null','49856','onerror','totalStrLength','getter','_isArray','79466sPwRds','_isNegativeZero','_connectAttemptCount','substr','_dateToString','close','Set','performance','host','[object\\x20Array]','_inBrowser','location','_isMap','noFunctions','_p_','toLowerCase','_getOwnPropertyDescriptor','_processTreeNodeResult','elapsed','name','logger\\x20failed\\x20to\\x20connect\\x20to\\x20host','String','1089486nBWcUz','edge','value','onmessage','_inNextEdge','send','getWebSocketClass','trace','funcName','autoExpandPreviousObjects','type','_objectToString','_setNodeId','url','jest','_isSet','strLength','length','toString','forEach','disabledLog','_p_name','autoExpandPropertyCount','1213812NrVOup','expressionsToEvaluate','hasOwnProperty','_console_ninja','sort','1.0.0','_addObjectProperty','root_exp','stringify','autoExpand','data','_cleanNode'];_0x5c86=function(){return _0x75ddb6;};return _0x5c86();}function Y(_0x1f0003,_0x1a15fa,_0x246933,_0x544019){var _0x433aca=_0xa27832;_0x1f0003=_0x1f0003,_0x1a15fa=_0x1a15fa,_0x246933=_0x246933,_0x544019=_0x544019;let _0x34fb9c=W(_0x1f0003),_0x269c14=_0x34fb9c[_0x433aca(0x142)],_0x49a237=_0x34fb9c['timeStamp'];class _0x4a3f4d{constructor(){var _0xbc3582=_0x433aca;this[_0xbc3582(0x1eb)]=/^(?!(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$)[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/,this[_0xbc3582(0x185)]=/^(0|[1-9][0-9]*)$/,this[_0xbc3582(0x1d1)]=/'([^\\\\']|\\\\')*'/,this[_0xbc3582(0x1b3)]=_0x1f0003['undefined'],this[_0xbc3582(0x1c2)]=_0x1f0003[_0xbc3582(0x1e5)],this[_0xbc3582(0x140)]=Object['getOwnPropertyDescriptor'],this['_getOwnPropertyNames']=Object[_0xbc3582(0x180)],this[_0xbc3582(0x1d4)]=_0x1f0003['Symbol'],this[_0xbc3582(0x19b)]=RegExp[_0xbc3582(0x169)][_0xbc3582(0x158)],this[_0xbc3582(0x134)]=Date[_0xbc3582(0x169)]['toString'];}[_0x433aca(0x121)](_0x40b3c7,_0x4b83d7,_0x4dde75,_0x472b77){var _0x73b905=_0x433aca,_0x5ad6e2=this,_0x51ab87=_0x4dde75['autoExpand'];function _0x289839(_0x3dd614,_0x349623,_0x591c87){var _0x5684ae=_0x1dc1;_0x349623[_0x5684ae(0x150)]=_0x5684ae(0x1fe),_0x349623[_0x5684ae(0x1ff)]=_0x3dd614[_0x5684ae(0x200)],_0x3dbeda=_0x591c87[_0x5684ae(0x11e)][_0x5684ae(0x1b9)],_0x591c87['node'][_0x5684ae(0x1b9)]=_0x349623,_0x5ad6e2['_treeNodePropertiesBeforeFullValue'](_0x349623,_0x591c87);}try{_0x4dde75['level']++,_0x4dde75['autoExpand']&&_0x4dde75[_0x73b905(0x14f)]['push'](_0x4b83d7);var _0x3c9ba1,_0x58d18e,_0x1e1cd8,_0xe9f856,_0xfe2a5f=[],_0x195f85=[],_0x5db02f,_0xb02fbd=this[_0x73b905(0x1a2)](_0x4b83d7),_0x46b41b=_0xb02fbd===_0x73b905(0x1be),_0x349be1=!0x1,_0x3e0a55=_0xb02fbd==='function',_0x1c4902=this[_0x73b905(0x1f0)](_0xb02fbd),_0x5e8205=this['_isPrimitiveWrapperType'](_0xb02fbd),_0x274fe9=_0x1c4902||_0x5e8205,_0x558702={},_0x2557b0=0x0,_0x3f0483=!0x1,_0x3dbeda,_0x58c826=/^(([1-9]{1}[0-9]*)|0)$/;if(_0x4dde75['depth']){if(_0x46b41b){if(_0x58d18e=_0x4b83d7[_0x73b905(0x157)],_0x58d18e>_0x4dde75[_0x73b905(0x173)]){for(_0x1e1cd8=0x0,_0xe9f856=_0x4dde75[_0x73b905(0x173)],_0x3c9ba1=_0x1e1cd8;_0x3c9ba1<_0xe9f856;_0x3c9ba1++)_0x195f85[_0x73b905(0x120)](_0x5ad6e2[_0x73b905(0x1db)](_0xfe2a5f,_0x4b83d7,_0xb02fbd,_0x3c9ba1,_0x4dde75));_0x40b3c7[_0x73b905(0x1cf)]=!0x0;}else{for(_0x1e1cd8=0x0,_0xe9f856=_0x58d18e,_0x3c9ba1=_0x1e1cd8;_0x3c9ba1<_0xe9f856;_0x3c9ba1++)_0x195f85[_0x73b905(0x120)](_0x5ad6e2[_0x73b905(0x1db)](_0xfe2a5f,_0x4b83d7,_0xb02fbd,_0x3c9ba1,_0x4dde75));}_0x4dde75['autoExpandPropertyCount']+=_0x195f85[_0x73b905(0x157)];}if(!(_0xb02fbd===_0x73b905(0x12a)||_0xb02fbd==='undefined')&&!_0x1c4902&&_0xb02fbd!==_0x73b905(0x145)&&_0xb02fbd!==_0x73b905(0x1c5)&&_0xb02fbd!==_0x73b905(0x1da)){var _0x1375d8=_0x472b77[_0x73b905(0x1ae)]||_0x4dde75[_0x73b905(0x1ae)];if(this[_0x73b905(0x155)](_0x4b83d7)?(_0x3c9ba1=0x0,_0x4b83d7['forEach'](function(_0x4ba7af){var _0x337181=_0x73b905;if(_0x2557b0++,_0x4dde75['autoExpandPropertyCount']++,_0x2557b0>_0x1375d8){_0x3f0483=!0x0;return;}if(!_0x4dde75[_0x337181(0x175)]&&_0x4dde75[_0x337181(0x166)]&&_0x4dde75[_0x337181(0x15c)]>_0x4dde75[_0x337181(0x1c0)]){_0x3f0483=!0x0;return;}_0x195f85[_0x337181(0x120)](_0x5ad6e2['_addProperty'](_0xfe2a5f,_0x4b83d7,_0x337181(0x136),_0x3c9ba1++,_0x4dde75,function(_0x28250){return function(){return _0x28250;};}(_0x4ba7af)));})):this['_isMap'](_0x4b83d7)&&_0x4b83d7[_0x73b905(0x159)](function(_0x5d9228,_0xca50d3){var _0x12665d=_0x73b905;if(_0x2557b0++,_0x4dde75[_0x12665d(0x15c)]++,_0x2557b0>_0x1375d8){_0x3f0483=!0x0;return;}if(!_0x4dde75[_0x12665d(0x175)]&&_0x4dde75[_0x12665d(0x166)]&&_0x4dde75[_0x12665d(0x15c)]>_0x4dde75[_0x12665d(0x1c0)]){_0x3f0483=!0x0;return;}var _0x39915e=_0xca50d3['toString']();_0x39915e[_0x12665d(0x157)]>0x64&&(_0x39915e=_0x39915e['slice'](0x0,0x64)+_0x12665d(0x1d6)),_0x195f85['push'](_0x5ad6e2['_addProperty'](_0xfe2a5f,_0x4b83d7,_0x12665d(0x1d9),_0x39915e,_0x4dde75,function(_0x2957ad){return function(){return _0x2957ad;};}(_0x5d9228)));}),!_0x349be1){try{for(_0x5db02f in _0x4b83d7)if(!(_0x46b41b&&_0x58c826[_0x73b905(0x18a)](_0x5db02f))&&!this[_0x73b905(0x1ef)](_0x4b83d7,_0x5db02f,_0x4dde75)){if(_0x2557b0++,_0x4dde75[_0x73b905(0x15c)]++,_0x2557b0>_0x1375d8){_0x3f0483=!0x0;break;}if(!_0x4dde75[_0x73b905(0x175)]&&_0x4dde75['autoExpand']&&_0x4dde75['autoExpandPropertyCount']>_0x4dde75['autoExpandLimit']){_0x3f0483=!0x0;break;}_0x195f85[_0x73b905(0x120)](_0x5ad6e2[_0x73b905(0x163)](_0xfe2a5f,_0x558702,_0x4b83d7,_0xb02fbd,_0x5db02f,_0x4dde75));}}catch{}if(_0x558702[_0x73b905(0x1ab)]=!0x0,_0x3e0a55&&(_0x558702[_0x73b905(0x15b)]=!0x0),!_0x3f0483){var _0x1fb0c0=[][_0x73b905(0x204)](this[_0x73b905(0x16c)](_0x4b83d7))[_0x73b905(0x204)](this[_0x73b905(0x1cb)](_0x4b83d7));for(_0x3c9ba1=0x0,_0x58d18e=_0x1fb0c0[_0x73b905(0x157)];_0x3c9ba1<_0x58d18e;_0x3c9ba1++)if(_0x5db02f=_0x1fb0c0[_0x3c9ba1],!(_0x46b41b&&_0x58c826[_0x73b905(0x18a)](_0x5db02f[_0x73b905(0x158)]()))&&!this[_0x73b905(0x1ef)](_0x4b83d7,_0x5db02f,_0x4dde75)&&!_0x558702[_0x73b905(0x13e)+_0x5db02f[_0x73b905(0x158)]()]){if(_0x2557b0++,_0x4dde75['autoExpandPropertyCount']++,_0x2557b0>_0x1375d8){_0x3f0483=!0x0;break;}if(!_0x4dde75[_0x73b905(0x175)]&&_0x4dde75[_0x73b905(0x166)]&&_0x4dde75[_0x73b905(0x15c)]>_0x4dde75['autoExpandLimit']){_0x3f0483=!0x0;break;}_0x195f85[_0x73b905(0x120)](_0x5ad6e2[_0x73b905(0x163)](_0xfe2a5f,_0x558702,_0x4b83d7,_0xb02fbd,_0x5db02f,_0x4dde75));}}}}}if(_0x40b3c7[_0x73b905(0x150)]=_0xb02fbd,_0x274fe9?(_0x40b3c7[_0x73b905(0x148)]=_0x4b83d7[_0x73b905(0x1b8)](),this[_0x73b905(0x123)](_0xb02fbd,_0x40b3c7,_0x4dde75,_0x472b77)):_0xb02fbd===_0x73b905(0x1b1)?_0x40b3c7[_0x73b905(0x148)]=this[_0x73b905(0x134)]['call'](_0x4b83d7):_0xb02fbd===_0x73b905(0x1da)?_0x40b3c7[_0x73b905(0x148)]=_0x4b83d7[_0x73b905(0x158)]():_0xb02fbd===_0x73b905(0x194)?_0x40b3c7['value']=this[_0x73b905(0x19b)]['call'](_0x4b83d7):_0xb02fbd==='symbol'&&this[_0x73b905(0x1d4)]?_0x40b3c7[_0x73b905(0x148)]=this['_Symbol'][_0x73b905(0x169)][_0x73b905(0x158)]['call'](_0x4b83d7):!_0x4dde75[_0x73b905(0x1e0)]&&!(_0xb02fbd===_0x73b905(0x12a)||_0xb02fbd===_0x73b905(0x197))&&(delete _0x40b3c7['value'],_0x40b3c7[_0x73b905(0x1a5)]=!0x0),_0x3f0483&&(_0x40b3c7[_0x73b905(0x1c7)]=!0x0),_0x3dbeda=_0x4dde75[_0x73b905(0x11e)][_0x73b905(0x1b9)],_0x4dde75[_0x73b905(0x11e)][_0x73b905(0x1b9)]=_0x40b3c7,this[_0x73b905(0x11d)](_0x40b3c7,_0x4dde75),_0x195f85[_0x73b905(0x157)]){for(_0x3c9ba1=0x0,_0x58d18e=_0x195f85[_0x73b905(0x157)];_0x3c9ba1<_0x58d18e;_0x3c9ba1++)_0x195f85[_0x3c9ba1](_0x3c9ba1);}_0xfe2a5f[_0x73b905(0x157)]&&(_0x40b3c7['props']=_0xfe2a5f);}catch(_0x46dba5){_0x289839(_0x46dba5,_0x40b3c7,_0x4dde75);}return this[_0x73b905(0x1b2)](_0x4b83d7,_0x40b3c7),this[_0x73b905(0x203)](_0x40b3c7,_0x4dde75),_0x4dde75[_0x73b905(0x11e)][_0x73b905(0x1b9)]=_0x3dbeda,_0x4dde75['level']--,_0x4dde75[_0x73b905(0x166)]=_0x51ab87,_0x4dde75[_0x73b905(0x166)]&&_0x4dde75['autoExpandPreviousObjects'][_0x73b905(0x1ce)](),_0x40b3c7;}[_0x433aca(0x1cb)](_0x19ddb5){return Object['getOwnPropertySymbols']?Object['getOwnPropertySymbols'](_0x19ddb5):[];}['_isSet'](_0x133a4c){var _0x27c7e8=_0x433aca;return!!(_0x133a4c&&_0x1f0003['Set']&&this[_0x27c7e8(0x151)](_0x133a4c)===_0x27c7e8(0x202)&&_0x133a4c[_0x27c7e8(0x159)]);}['_blacklistedProperty'](_0x41af7a,_0xb1c5cb,_0x5da846){var _0x16d762=_0x433aca;return _0x5da846[_0x16d762(0x13d)]?typeof _0x41af7a[_0xb1c5cb]==_0x16d762(0x11f):!0x1;}['_type'](_0x493c83){var _0xccaefd=_0x433aca,_0x2db71c='';return _0x2db71c=typeof _0x493c83,_0x2db71c==='object'?this[_0xccaefd(0x151)](_0x493c83)===_0xccaefd(0x139)?_0x2db71c=_0xccaefd(0x1be):this['_objectToString'](_0x493c83)===_0xccaefd(0x181)?_0x2db71c=_0xccaefd(0x1b1):this[_0xccaefd(0x151)](_0x493c83)===_0xccaefd(0x1e2)?_0x2db71c=_0xccaefd(0x1da):_0x493c83===null?_0x2db71c=_0xccaefd(0x12a):_0x493c83[_0xccaefd(0x1ac)]&&(_0x2db71c=_0x493c83[_0xccaefd(0x1ac)][_0xccaefd(0x143)]||_0x2db71c):_0x2db71c===_0xccaefd(0x197)&&this[_0xccaefd(0x1c2)]&&_0x493c83 instanceof this[_0xccaefd(0x1c2)]&&(_0x2db71c=_0xccaefd(0x1e5)),_0x2db71c;}['_objectToString'](_0x156ddc){var _0x2163b1=_0x433aca;return Object[_0x2163b1(0x169)]['toString'][_0x2163b1(0x18f)](_0x156ddc);}['_isPrimitiveType'](_0x29392d){var _0x4df8b6=_0x433aca;return _0x29392d==='boolean'||_0x29392d===_0x4df8b6(0x1f4)||_0x29392d===_0x4df8b6(0x1f5);}[_0x433aca(0x1a8)](_0x565656){var _0x5ec67e=_0x433aca;return _0x565656==='Boolean'||_0x565656===_0x5ec67e(0x145)||_0x565656===_0x5ec67e(0x1de);}[_0x433aca(0x1db)](_0x31768e,_0x3d78d7,_0x2b1ad1,_0x1486ca,_0x2a72bc,_0x36ad5b){var _0x3209a1=this;return function(_0x51f598){var _0x27127b=_0x1dc1,_0x5691d9=_0x2a72bc[_0x27127b(0x11e)][_0x27127b(0x1b9)],_0x4d8359=_0x2a72bc[_0x27127b(0x11e)]['index'],_0x56e7e1=_0x2a72bc['node'][_0x27127b(0x1d7)];_0x2a72bc[_0x27127b(0x11e)][_0x27127b(0x1d7)]=_0x5691d9,_0x2a72bc['node'][_0x27127b(0x1d3)]=typeof _0x1486ca==_0x27127b(0x1f5)?_0x1486ca:_0x51f598,_0x31768e[_0x27127b(0x120)](_0x3209a1[_0x27127b(0x1b5)](_0x3d78d7,_0x2b1ad1,_0x1486ca,_0x2a72bc,_0x36ad5b)),_0x2a72bc[_0x27127b(0x11e)]['parent']=_0x56e7e1,_0x2a72bc[_0x27127b(0x11e)][_0x27127b(0x1d3)]=_0x4d8359;};}[_0x433aca(0x163)](_0x47b3ca,_0x10da83,_0x6b8161,_0x10e267,_0xf6eae5,_0x4ca7ce,_0x588785){var _0x5439d9=_0x433aca,_0x39c71b=this;return _0x10da83[_0x5439d9(0x13e)+_0xf6eae5[_0x5439d9(0x158)]()]=!0x0,function(_0x39b27c){var _0x1e9883=_0x5439d9,_0xbe10cf=_0x4ca7ce[_0x1e9883(0x11e)]['current'],_0x1352b7=_0x4ca7ce[_0x1e9883(0x11e)]['index'],_0x30cdaa=_0x4ca7ce[_0x1e9883(0x11e)]['parent'];_0x4ca7ce[_0x1e9883(0x11e)][_0x1e9883(0x1d7)]=_0xbe10cf,_0x4ca7ce[_0x1e9883(0x11e)]['index']=_0x39b27c,_0x47b3ca['push'](_0x39c71b[_0x1e9883(0x1b5)](_0x6b8161,_0x10e267,_0xf6eae5,_0x4ca7ce,_0x588785)),_0x4ca7ce['node']['parent']=_0x30cdaa,_0x4ca7ce[_0x1e9883(0x11e)][_0x1e9883(0x1d3)]=_0x1352b7;};}['_property'](_0x62856a,_0x3ac22f,_0x4a3629,_0x116d07,_0x1b091f){var _0x48fe52=_0x433aca,_0x3a83f7=this;_0x1b091f||(_0x1b091f=function(_0x26618b,_0x15aa5c){return _0x26618b[_0x15aa5c];});var _0x32e768=_0x4a3629['toString'](),_0x224be3=_0x116d07['expressionsToEvaluate']||{},_0x1dd963=_0x116d07[_0x48fe52(0x1e0)],_0x51d041=_0x116d07[_0x48fe52(0x175)];try{var _0x3c74fe=this[_0x48fe52(0x13c)](_0x62856a),_0x753ac9=_0x32e768;_0x3c74fe&&_0x753ac9[0x0]==='\\x27'&&(_0x753ac9=_0x753ac9[_0x48fe52(0x133)](0x1,_0x753ac9[_0x48fe52(0x157)]-0x2));var _0x97eb76=_0x116d07[_0x48fe52(0x15e)]=_0x224be3[_0x48fe52(0x13e)+_0x753ac9];_0x97eb76&&(_0x116d07[_0x48fe52(0x1e0)]=_0x116d07['depth']+0x1),_0x116d07['isExpressionToEvaluate']=!!_0x97eb76;var _0x5b0fde=typeof _0x4a3629==_0x48fe52(0x17f),_0x250794={'name':_0x5b0fde||_0x3c74fe?_0x32e768:this[_0x48fe52(0x129)](_0x32e768)};if(_0x5b0fde&&(_0x250794[_0x48fe52(0x17f)]=!0x0),!(_0x3ac22f===_0x48fe52(0x1be)||_0x3ac22f==='Error')){var _0xd341a2=this[_0x48fe52(0x140)](_0x62856a,_0x4a3629);if(_0xd341a2&&(_0xd341a2['set']&&(_0x250794[_0x48fe52(0x179)]=!0x0),_0xd341a2[_0x48fe52(0x1c1)]&&!_0x97eb76&&!_0x116d07[_0x48fe52(0x1a9)]))return _0x250794[_0x48fe52(0x12e)]=!0x0,this['_processTreeNodeResult'](_0x250794,_0x116d07),_0x250794;}var _0x31ea3e;try{_0x31ea3e=_0x1b091f(_0x62856a,_0x4a3629);}catch(_0x46a010){return _0x250794={'name':_0x32e768,'type':_0x48fe52(0x1fe),'error':_0x46a010[_0x48fe52(0x200)]},this[_0x48fe52(0x141)](_0x250794,_0x116d07),_0x250794;}var _0x175a4c=this[_0x48fe52(0x1a2)](_0x31ea3e),_0x1ddf90=this[_0x48fe52(0x1f0)](_0x175a4c);if(_0x250794[_0x48fe52(0x150)]=_0x175a4c,_0x1ddf90)this[_0x48fe52(0x141)](_0x250794,_0x116d07,_0x31ea3e,function(){var _0xc830d=_0x48fe52;_0x250794[_0xc830d(0x148)]=_0x31ea3e[_0xc830d(0x1b8)](),!_0x97eb76&&_0x3a83f7['_capIfString'](_0x175a4c,_0x250794,_0x116d07,{});});else{var _0x49ad15=_0x116d07['autoExpand']&&_0x116d07[_0x48fe52(0x1ea)]<_0x116d07[_0x48fe52(0x18e)]&&_0x116d07['autoExpandPreviousObjects'][_0x48fe52(0x178)](_0x31ea3e)<0x0&&_0x175a4c!==_0x48fe52(0x11f)&&_0x116d07[_0x48fe52(0x15c)]<_0x116d07[_0x48fe52(0x1c0)];_0x49ad15||_0x116d07[_0x48fe52(0x1ea)]<_0x1dd963||_0x97eb76?(this[_0x48fe52(0x121)](_0x250794,_0x31ea3e,_0x116d07,_0x97eb76||{}),this[_0x48fe52(0x1b2)](_0x31ea3e,_0x250794)):this['_processTreeNodeResult'](_0x250794,_0x116d07,_0x31ea3e,function(){var _0x1e18c6=_0x48fe52;_0x175a4c===_0x1e18c6(0x12a)||_0x175a4c===_0x1e18c6(0x197)||(delete _0x250794['value'],_0x250794[_0x1e18c6(0x1a5)]=!0x0);});}return _0x250794;}finally{_0x116d07[_0x48fe52(0x15e)]=_0x224be3,_0x116d07[_0x48fe52(0x1e0)]=_0x1dd963,_0x116d07[_0x48fe52(0x175)]=_0x51d041;}}[_0x433aca(0x123)](_0x35f650,_0x179012,_0x2d596f,_0x95dd9){var _0x1e8301=_0x433aca,_0x666db2=_0x95dd9[_0x1e8301(0x156)]||_0x2d596f[_0x1e8301(0x156)];if((_0x35f650===_0x1e8301(0x1f4)||_0x35f650===_0x1e8301(0x145))&&_0x179012[_0x1e8301(0x148)]){let _0x3e1356=_0x179012['value'][_0x1e8301(0x157)];_0x2d596f[_0x1e8301(0x198)]+=_0x3e1356,_0x2d596f[_0x1e8301(0x198)]>_0x2d596f[_0x1e8301(0x12d)]?(_0x179012[_0x1e8301(0x1a5)]='',delete _0x179012[_0x1e8301(0x148)]):_0x3e1356>_0x666db2&&(_0x179012[_0x1e8301(0x1a5)]=_0x179012[_0x1e8301(0x148)][_0x1e8301(0x133)](0x0,_0x666db2),delete _0x179012[_0x1e8301(0x148)]);}}['_isMap'](_0x291310){var _0x49da7d=_0x433aca;return!!(_0x291310&&_0x1f0003[_0x49da7d(0x1d9)]&&this['_objectToString'](_0x291310)===_0x49da7d(0x16b)&&_0x291310[_0x49da7d(0x159)]);}[_0x433aca(0x129)](_0x4c3443){var _0x26e8ee=_0x433aca;if(_0x4c3443[_0x26e8ee(0x1cd)](/^\\d+$/))return _0x4c3443;var _0x507c13;try{_0x507c13=JSON['stringify'](''+_0x4c3443);}catch{_0x507c13='\\x22'+this[_0x26e8ee(0x151)](_0x4c3443)+'\\x22';}return _0x507c13['match'](/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)?_0x507c13=_0x507c13[_0x26e8ee(0x133)](0x1,_0x507c13[_0x26e8ee(0x157)]-0x2):_0x507c13=_0x507c13[_0x26e8ee(0x19f)](/'/g,'\\x5c\\x27')[_0x26e8ee(0x19f)](/\\\\\"/g,'\\x22')['replace'](/(^\"|\"$)/g,'\\x27'),_0x507c13;}[_0x433aca(0x141)](_0x4145bc,_0xc711b5,_0x232653,_0x1ee20a){var _0x3322ae=_0x433aca;this['_treeNodePropertiesBeforeFullValue'](_0x4145bc,_0xc711b5),_0x1ee20a&&_0x1ee20a(),this[_0x3322ae(0x1b2)](_0x232653,_0x4145bc),this['_treeNodePropertiesAfterFullValue'](_0x4145bc,_0xc711b5);}[_0x433aca(0x11d)](_0x3d1fa9,_0x3b5c26){var _0x1c56da=_0x433aca;this[_0x1c56da(0x152)](_0x3d1fa9,_0x3b5c26),this[_0x1c56da(0x1bd)](_0x3d1fa9,_0x3b5c26),this[_0x1c56da(0x188)](_0x3d1fa9,_0x3b5c26),this[_0x1c56da(0x199)](_0x3d1fa9,_0x3b5c26);}['_setNodeId'](_0xeeae71,_0x306e2b){}[_0x433aca(0x1bd)](_0x40ddb9,_0x518140){}[_0x433aca(0x182)](_0x34bb3e,_0x2affba){}[_0x433aca(0x1d2)](_0x33a836){return _0x33a836===this['_undefined'];}['_treeNodePropertiesAfterFullValue'](_0xabea40,_0x4253d6){var _0x4384d2=_0x433aca;this[_0x4384d2(0x182)](_0xabea40,_0x4253d6),this[_0x4384d2(0x205)](_0xabea40),_0x4253d6[_0x4384d2(0x16d)]&&this['_sortProps'](_0xabea40),this[_0x4384d2(0x1e7)](_0xabea40,_0x4253d6),this[_0x4384d2(0x1fd)](_0xabea40,_0x4253d6),this['_cleanNode'](_0xabea40);}[_0x433aca(0x1b2)](_0x319356,_0x421c61){var _0x27e209=_0x433aca;let _0x8bc189;try{_0x1f0003[_0x27e209(0x1ee)]&&(_0x8bc189=_0x1f0003[_0x27e209(0x1ee)]['error'],_0x1f0003['console'][_0x27e209(0x1ff)]=function(){}),_0x319356&&typeof _0x319356[_0x27e209(0x157)]==_0x27e209(0x1f5)&&(_0x421c61[_0x27e209(0x157)]=_0x319356['length']);}catch{}finally{_0x8bc189&&(_0x1f0003[_0x27e209(0x1ee)][_0x27e209(0x1ff)]=_0x8bc189);}if(_0x421c61[_0x27e209(0x150)]===_0x27e209(0x1f5)||_0x421c61[_0x27e209(0x150)]===_0x27e209(0x1de)){if(isNaN(_0x421c61[_0x27e209(0x148)]))_0x421c61['nan']=!0x0,delete _0x421c61['value'];else switch(_0x421c61['value']){case Number[_0x27e209(0x16f)]:_0x421c61['positiveInfinity']=!0x0,delete _0x421c61['value'];break;case Number[_0x27e209(0x19d)]:_0x421c61['negativeInfinity']=!0x0,delete _0x421c61[_0x27e209(0x148)];break;case 0x0:this['_isNegativeZero'](_0x421c61[_0x27e209(0x148)])&&(_0x421c61[_0x27e209(0x16e)]=!0x0);break;}}else _0x421c61[_0x27e209(0x150)]==='function'&&typeof _0x319356[_0x27e209(0x143)]==_0x27e209(0x1f4)&&_0x319356[_0x27e209(0x143)]&&_0x421c61['name']&&_0x319356[_0x27e209(0x143)]!==_0x421c61[_0x27e209(0x143)]&&(_0x421c61[_0x27e209(0x14e)]=_0x319356['name']);}[_0x433aca(0x131)](_0x38529f){var _0x199888=_0x433aca;return 0x1/_0x38529f===Number[_0x199888(0x19d)];}[_0x433aca(0x17e)](_0x52cbce){var _0xfd397e=_0x433aca;!_0x52cbce[_0xfd397e(0x1ae)]||!_0x52cbce[_0xfd397e(0x1ae)][_0xfd397e(0x157)]||_0x52cbce[_0xfd397e(0x150)]===_0xfd397e(0x1be)||_0x52cbce[_0xfd397e(0x150)]===_0xfd397e(0x1d9)||_0x52cbce[_0xfd397e(0x150)]===_0xfd397e(0x136)||_0x52cbce[_0xfd397e(0x1ae)][_0xfd397e(0x161)](function(_0x55c773,_0x119e91){var _0x1f0ef4=_0xfd397e,_0x4f83a8=_0x55c773[_0x1f0ef4(0x143)]['toLowerCase'](),_0x1a95f6=_0x119e91[_0x1f0ef4(0x143)][_0x1f0ef4(0x13f)]();return _0x4f83a8<_0x1a95f6?-0x1:_0x4f83a8>_0x1a95f6?0x1:0x0;});}[_0x433aca(0x1e7)](_0x6b619e,_0x4d1830){var _0x2f1876=_0x433aca;if(!(_0x4d1830['noFunctions']||!_0x6b619e[_0x2f1876(0x1ae)]||!_0x6b619e[_0x2f1876(0x1ae)][_0x2f1876(0x157)])){for(var _0x398d2e=[],_0x49dc6c=[],_0x413881=0x0,_0x5386e7=_0x6b619e[_0x2f1876(0x1ae)][_0x2f1876(0x157)];_0x413881<_0x5386e7;_0x413881++){var _0x53badb=_0x6b619e[_0x2f1876(0x1ae)][_0x413881];_0x53badb[_0x2f1876(0x150)]===_0x2f1876(0x11f)?_0x398d2e[_0x2f1876(0x120)](_0x53badb):_0x49dc6c[_0x2f1876(0x120)](_0x53badb);}if(!(!_0x49dc6c['length']||_0x398d2e[_0x2f1876(0x157)]<=0x1)){_0x6b619e['props']=_0x49dc6c;var _0x4f9048={'functionsNode':!0x0,'props':_0x398d2e};this['_setNodeId'](_0x4f9048,_0x4d1830),this['_setNodeLabel'](_0x4f9048,_0x4d1830),this[_0x2f1876(0x205)](_0x4f9048),this[_0x2f1876(0x199)](_0x4f9048,_0x4d1830),_0x4f9048['id']+='\\x20f',_0x6b619e['props']['unshift'](_0x4f9048);}}}[_0x433aca(0x1fd)](_0x278bab,_0x4b8b27){}[_0x433aca(0x205)](_0x246c56){}[_0x433aca(0x12f)](_0x113fc3){var _0x3ef565=_0x433aca;return Array[_0x3ef565(0x1b6)](_0x113fc3)||typeof _0x113fc3==_0x3ef565(0x128)&&this['_objectToString'](_0x113fc3)==='[object\\x20Array]';}[_0x433aca(0x199)](_0x3c4c19,_0x461c82){}[_0x433aca(0x168)](_0x2e6ab0){var _0x28756d=_0x433aca;delete _0x2e6ab0[_0x28756d(0x1c6)],delete _0x2e6ab0[_0x28756d(0x1f2)],delete _0x2e6ab0[_0x28756d(0x1fc)];}[_0x433aca(0x188)](_0x469a5d,_0x4a22ef){}}let _0x563d1e=new _0x4a3f4d(),_0x5b329f={'props':0x64,'elements':0x64,'strLength':0x400*0x32,'totalStrLength':0x400*0x32,'autoExpandLimit':0x1388,'autoExpandMaxDepth':0xa},_0x603c01={'props':0x5,'elements':0x5,'strLength':0x100,'totalStrLength':0x100*0x3,'autoExpandLimit':0x1e,'autoExpandMaxDepth':0x2};function _0x5f480e(_0x3193ed,_0x20af3c,_0x4f0827,_0x53d8b1,_0xe97fc3,_0x22a33f){var _0x4dfeb1=_0x433aca;let _0x56d916,_0x3e4af1;try{_0x3e4af1=_0x49a237(),_0x56d916=_0x246933[_0x20af3c],!_0x56d916||_0x3e4af1-_0x56d916['ts']>0x1f4&&_0x56d916[_0x4dfeb1(0x1c8)]&&_0x56d916[_0x4dfeb1(0x1e9)]/_0x56d916['count']<0x64?(_0x246933[_0x20af3c]=_0x56d916={'count':0x0,'time':0x0,'ts':_0x3e4af1},_0x246933['hits']={}):_0x3e4af1-_0x246933['hits']['ts']>0x32&&_0x246933[_0x4dfeb1(0x172)][_0x4dfeb1(0x1c8)]&&_0x246933[_0x4dfeb1(0x172)]['time']/_0x246933[_0x4dfeb1(0x172)][_0x4dfeb1(0x1c8)]<0x64&&(_0x246933[_0x4dfeb1(0x172)]={});let _0x30e908=[],_0x111f30=_0x56d916[_0x4dfeb1(0x1e6)]||_0x246933['hits']['reduceLimits']?_0x603c01:_0x5b329f,_0x202cd4=_0x18f292=>{var _0x2817fd=_0x4dfeb1;let _0x2b31de={};return _0x2b31de[_0x2817fd(0x1ae)]=_0x18f292['props'],_0x2b31de[_0x2817fd(0x173)]=_0x18f292[_0x2817fd(0x173)],_0x2b31de[_0x2817fd(0x156)]=_0x18f292[_0x2817fd(0x156)],_0x2b31de[_0x2817fd(0x12d)]=_0x18f292[_0x2817fd(0x12d)],_0x2b31de[_0x2817fd(0x1c0)]=_0x18f292[_0x2817fd(0x1c0)],_0x2b31de[_0x2817fd(0x18e)]=_0x18f292['autoExpandMaxDepth'],_0x2b31de[_0x2817fd(0x16d)]=!0x1,_0x2b31de[_0x2817fd(0x13d)]=!_0x1a15fa,_0x2b31de[_0x2817fd(0x1e0)]=0x1,_0x2b31de[_0x2817fd(0x1ea)]=0x0,_0x2b31de[_0x2817fd(0x184)]='root_exp_id',_0x2b31de[_0x2817fd(0x124)]=_0x2817fd(0x164),_0x2b31de[_0x2817fd(0x166)]=!0x0,_0x2b31de['autoExpandPreviousObjects']=[],_0x2b31de[_0x2817fd(0x15c)]=0x0,_0x2b31de[_0x2817fd(0x1a9)]=!0x0,_0x2b31de[_0x2817fd(0x198)]=0x0,_0x2b31de[_0x2817fd(0x11e)]={'current':void 0x0,'parent':void 0x0,'index':0x0},_0x2b31de;};for(var _0x1d6c83=0x0;_0x1d6c83<_0xe97fc3['length'];_0x1d6c83++)_0x30e908[_0x4dfeb1(0x120)](_0x563d1e['serialize']({'timeNode':_0x3193ed===_0x4dfeb1(0x1e9)||void 0x0},_0xe97fc3[_0x1d6c83],_0x202cd4(_0x111f30),{}));if(_0x3193ed===_0x4dfeb1(0x14d)){let _0x204c59=Error[_0x4dfeb1(0x125)];try{Error[_0x4dfeb1(0x125)]=0x1/0x0,_0x30e908['push'](_0x563d1e[_0x4dfeb1(0x121)]({'stackNode':!0x0},new Error()[_0x4dfeb1(0x1af)],_0x202cd4(_0x111f30),{'strLength':0x1/0x0}));}finally{Error['stackTraceLimit']=_0x204c59;}}return{'method':'log','version':_0x544019,'args':[{'ts':_0x4f0827,'session':_0x53d8b1,'args':_0x30e908,'id':_0x20af3c,'context':_0x22a33f}]};}catch(_0x54dd5e){return{'method':_0x4dfeb1(0x1a3),'version':_0x544019,'args':[{'ts':_0x4f0827,'session':_0x53d8b1,'args':[{'type':_0x4dfeb1(0x1fe),'error':_0x54dd5e&&_0x54dd5e[_0x4dfeb1(0x200)]}],'id':_0x20af3c,'context':_0x22a33f}]};}finally{try{if(_0x56d916&&_0x3e4af1){let _0x19f770=_0x49a237();_0x56d916[_0x4dfeb1(0x1c8)]++,_0x56d916[_0x4dfeb1(0x1e9)]+=_0x269c14(_0x3e4af1,_0x19f770),_0x56d916['ts']=_0x19f770,_0x246933[_0x4dfeb1(0x172)][_0x4dfeb1(0x1c8)]++,_0x246933[_0x4dfeb1(0x172)][_0x4dfeb1(0x1e9)]+=_0x269c14(_0x3e4af1,_0x19f770),_0x246933[_0x4dfeb1(0x172)]['ts']=_0x19f770,(_0x56d916[_0x4dfeb1(0x1c8)]>0x32||_0x56d916[_0x4dfeb1(0x1e9)]>0x64)&&(_0x56d916[_0x4dfeb1(0x1e6)]=!0x0),(_0x246933[_0x4dfeb1(0x172)]['count']>0x3e8||_0x246933[_0x4dfeb1(0x172)]['time']>0x12c)&&(_0x246933[_0x4dfeb1(0x172)][_0x4dfeb1(0x1e6)]=!0x0);}}catch{}}}return _0x5f480e;}((_0x28331b,_0x22ab47,_0x28125a,_0x28e75c,_0x33a3c2,_0xa1ea8f,_0x1b95ec,_0x37e309,_0x1c99af,_0x4ae76f)=>{var _0x1b8b78=_0xa27832;if(_0x28331b[_0x1b8b78(0x160)])return _0x28331b[_0x1b8b78(0x160)];if(!J(_0x28331b,_0x37e309,_0x33a3c2))return _0x28331b[_0x1b8b78(0x160)]={'consoleLog':()=>{},'consoleTrace':()=>{},'consoleTime':()=>{},'consoleTimeEnd':()=>{},'autoLog':()=>{},'autoLogMany':()=>{},'autoTraceMany':()=>{},'coverage':()=>{},'autoTrace':()=>{},'autoTime':()=>{},'autoTimeEnd':()=>{}},_0x28331b[_0x1b8b78(0x160)];let _0x3e7b70=W(_0x28331b),_0x1fe98a=_0x3e7b70[_0x1b8b78(0x142)],_0x2db71b=_0x3e7b70['timeStamp'],_0x5159de=_0x3e7b70[_0x1b8b78(0x183)],_0x3665e0={'hits':{},'ts':{}},_0x3b5676=Y(_0x28331b,_0x1c99af,_0x3665e0,_0xa1ea8f),_0x163451=_0x5729fd=>{_0x3665e0['ts'][_0x5729fd]=_0x2db71b();},_0x2c8fca=(_0x25def9,_0x17889b)=>{var _0x486236=_0x1b8b78;let _0x483566=_0x3665e0['ts'][_0x17889b];if(delete _0x3665e0['ts'][_0x17889b],_0x483566){let _0x4a82a9=_0x1fe98a(_0x483566,_0x2db71b());_0x472878(_0x3b5676(_0x486236(0x1e9),_0x25def9,_0x5159de(),_0xe95e2e,[_0x4a82a9],_0x17889b));}},_0x5abfa9=_0x19b80d=>_0x2ee396=>{var _0x16af84=_0x1b8b78;try{_0x163451(_0x2ee396),_0x19b80d(_0x2ee396);}finally{_0x28331b[_0x16af84(0x1ee)][_0x16af84(0x1e9)]=_0x19b80d;}},_0x619635=_0x169afb=>_0x7e4a8=>{var _0x1a4e09=_0x1b8b78;try{let [_0xaf5afe,_0x1ce59e]=_0x7e4a8['split'](_0x1a4e09(0x17b));_0x2c8fca(_0x1ce59e,_0xaf5afe),_0x169afb(_0xaf5afe);}finally{_0x28331b[_0x1a4e09(0x1ee)][_0x1a4e09(0x170)]=_0x169afb;}};_0x28331b[_0x1b8b78(0x160)]={'consoleLog':(_0x715ca0,_0xaacd9f)=>{var _0x36622a=_0x1b8b78;_0x28331b[_0x36622a(0x1ee)][_0x36622a(0x1a3)]['name']!==_0x36622a(0x15a)&&_0x472878(_0x3b5676(_0x36622a(0x1a3),_0x715ca0,_0x5159de(),_0xe95e2e,_0xaacd9f));},'consoleTrace':(_0x60f4ea,_0x1e029e)=>{var _0x4d7024=_0x1b8b78;_0x28331b[_0x4d7024(0x1ee)]['log'][_0x4d7024(0x143)]!==_0x4d7024(0x1f6)&&_0x472878(_0x3b5676(_0x4d7024(0x14d),_0x60f4ea,_0x5159de(),_0xe95e2e,_0x1e029e));},'consoleTime':()=>{var _0x470a11=_0x1b8b78;_0x28331b[_0x470a11(0x1ee)][_0x470a11(0x1e9)]=_0x5abfa9(_0x28331b[_0x470a11(0x1ee)][_0x470a11(0x1e9)]);},'consoleTimeEnd':()=>{var _0x4c2b10=_0x1b8b78;_0x28331b['console']['timeEnd']=_0x619635(_0x28331b[_0x4c2b10(0x1ee)][_0x4c2b10(0x170)]);},'autoLog':(_0x1b2d50,_0x4ed1eb)=>{var _0x36924f=_0x1b8b78;_0x472878(_0x3b5676(_0x36924f(0x1a3),_0x4ed1eb,_0x5159de(),_0xe95e2e,[_0x1b2d50]));},'autoLogMany':(_0x45dbc8,_0x55f0de)=>{var _0x4f4302=_0x1b8b78;_0x472878(_0x3b5676(_0x4f4302(0x1a3),_0x45dbc8,_0x5159de(),_0xe95e2e,_0x55f0de));},'autoTrace':(_0x3a4027,_0x3aad84)=>{var _0x47aaec=_0x1b8b78;_0x472878(_0x3b5676(_0x47aaec(0x14d),_0x3aad84,_0x5159de(),_0xe95e2e,[_0x3a4027]));},'autoTraceMany':(_0x52d9eb,_0x28c43c)=>{var _0x197168=_0x1b8b78;_0x472878(_0x3b5676(_0x197168(0x14d),_0x52d9eb,_0x5159de(),_0xe95e2e,_0x28c43c));},'autoTime':(_0x50c57e,_0x2bcc66,_0x465d98)=>{_0x163451(_0x465d98);},'autoTimeEnd':(_0x1a7664,_0x134ee0,_0xd56688)=>{_0x2c8fca(_0x134ee0,_0xd56688);},'coverage':_0x76e9ad=>{var _0x3c5267=_0x1b8b78;_0x472878({'method':_0x3c5267(0x1ba),'version':_0xa1ea8f,'args':[{'id':_0x76e9ad}]});}};let _0x472878=b(_0x28331b,_0x22ab47,_0x28125a,_0x28e75c,_0x33a3c2,_0x4ae76f),_0xe95e2e=_0x28331b[_0x1b8b78(0x1ad)];return _0x28331b[_0x1b8b78(0x160)];})(globalThis,_0xa27832(0x187),_0xa27832(0x12b),\"c:\\\\Users\\\\arvin\\\\.vscode\\\\extensions\\\\wallabyjs.console-ninja-1.0.255\\\\node_modules\",_0xa27832(0x154),_0xa27832(0x162),_0xa27832(0x195),_0xa27832(0x1a6),'',_0xa27832(0x206));");}catch(e){}};function oo_oo(i,...v){try{oo_cm().consoleLog(i, v);}catch(e){} return v};function oo_tr(i,...v){try{oo_cm().consoleTrace(i, v);}catch(e){} return v};function oo_ts(){try{oo_cm().consoleTime();}catch(e){}};function oo_te(){try{oo_cm().consoleTimeEnd();}catch(e){}};/*eslint unicorn/no-abusive-eslint-disable:,eslint-comments/disable-enable-pair:,eslint-comments/no-unlimited-disable:,eslint-comments/no-aggregating-enable:,eslint-comments/no-duplicate-disable:,eslint-comments/no-unused-disable:,eslint-comments/no-unused-enable:,*/
+ + + + + + \ 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 index f2abe11..bd75af7 100644 --- a/server/coverage/lcov-report/server/helpers/index.html +++ b/server/coverage/lcov-report/server/helpers/index.html @@ -23,30 +23,30 @@

All files server/helpers

- 59.37% + 53.33% Statements - 19/32 + 24/45
- 100% + 0% Branches - 0/0 + 0/8
- 50% + 33.33% Functions - 3/6 + 3/9
- 61.29% + 54.54% Lines - 19/31 + 24/44
@@ -93,6 +93,21 @@

All files server/helpers

9/9 + + googlebooks.js + +
+ + 37.5% + 3/8 + 0% + 0/8 + 0% + 0/2 + 37.5% + 3/8 + + jwt.js @@ -110,17 +125,17 @@

All files server/helpers

openai.js - -
+ +
- 21.42% - 3/14 + 26.31% + 5/19 100% 0/0 0% - 0/2 - 23.07% - 3/13 + 0/3 + 27.77% + 5/18 @@ -131,7 +146,7 @@

All files server/helpers

+ + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/middlewares/authorization.js.html b/server/coverage/lcov-report/server/middlewares/authorization.js.html new file mode 100644 index 0000000..adc3b30 --- /dev/null +++ b/server/coverage/lcov-report/server/middlewares/authorization.js.html @@ -0,0 +1,136 @@ + + + + + + Code coverage report for server/middlewares/authorization.js + + + + + + + + + +
+
+

All files / server/middlewares authorization.js

+
+ +
+ 27.27% + Statements + 3/11 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 33.33% + Lines + 3/9 +
+ + +
+

+ 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 +181x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x
const { User, Book } = require("../models");
+ 
+const authorization = {
+    AdminOnly: async (req, res, next) => {
+        try {
+            const user = await User.findByPk(req.user.id);
+            if (!user) throw ({ name: "Unauthorized" });
+            if (user.role !== 'admin') throw ({ name: "Unauthorized" });
+ 
+            next();
+        } catch (error) {
+            next(error);
+        }
+    },
+ 
+}
+ 
+module.exports = authorization;
+ +
+
+ + + + + + + + \ 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 index 5679277..a9836a2 100644 --- a/server/coverage/lcov-report/server/middlewares/errorHandler.js.html +++ b/server/coverage/lcov-report/server/middlewares/errorHandler.js.html @@ -23,16 +23,16 @@

All files / server/middl

-
+
1 2 @@ -125,10 +125,15 @@

All files / server/middl 60 61 62 -63

1x +63 +64 +65 +66 +67 +681x     -8x +9x     4x @@ -161,6 +166,11 @@

All files / server/middl 2x     +1x +1x +1x +  +        @@ -182,7 +192,7 @@

All files / server/middl       -8x +9x       @@ -222,23 +232,28 @@

All files / server/middl message = `Invalid Email/Password!`; break;   - case 'JsonWebTokenError': - case 'Unauthenticated': + case 'googleAcc': + statusCode = 401; + message = `Use your Google account to login`; + break; +  + case 'JsonWebTokenError': + case 'Unauthenticated': statusCode = 401; message = `Unauthenticated`; break;   - case 'Unauthorized': + case 'Unauthorized': statusCode = 403; message = `You're not authorized`; break;   - case 'NotFound': + case 'NotFound': statusCode = 404; message = `Not Found`; break;   - default: + default: statusCode = 500; message = `Internal Server Error`; break; @@ -256,7 +271,7 @@

All files / server/middl + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/controllers/mails/index.html b/server/coverage/lcov-report/server/controllers/mails/index.html new file mode 100644 index 0000000..6a89c52 --- /dev/null +++ b/server/coverage/lcov-report/server/controllers/mails/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for server/controllers/mails + + + + + + + + + +
+
+

All files server/controllers/mails

+
+ +
+ 11.11% + Statements + 3/27 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 18.75% + Lines + 3/16 +
+ + +
+

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

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
MailController.js +
+
11.11%3/270%0/20%0/618.75%3/16
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/server/coverage/lcov-report/server/helpers/bcryptjs.js.html b/server/coverage/lcov-report/server/helpers/bcryptjs.js.html index 4a410ad..2987f31 100644 --- a/server/coverage/lcov-report/server/helpers/bcryptjs.js.html +++ b/server/coverage/lcov-report/server/helpers/bcryptjs.js.html @@ -23,9 +23,9 @@

All files / server/helpe -
+
1 2 @@ -79,14 +79,14 @@

All files / server/helpe 14

1x   1x -3x -3x -3x +1x +1x +1x     1x -3x -3x +  +      1x
const bcryptjs = require('bcryptjs');
@@ -97,9 +97,9 @@ 

All files / server/helpe return hash; }   -const bcryptCompare = (req, hashed) => { - const compare = bcryptjs.compareSync(req, hashed); - return compare; +const bcryptCompare = (req, hashed) => { + const compare = bcryptjs.compareSync(req, hashed); + return compare; }   module.exports = { bcryptHash, bcryptCompare };

@@ -109,7 +109,7 @@

All files / server/helpe