From 2fa5a2a5b4b25036dc298d72ad0ce4f5062010a5 Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Mon, 15 Aug 2022 10:55:12 +0300 Subject: [PATCH 01/17] add webpack-bundle-analyzer --- frontend/craco.config.js | 10 + frontend/package-lock.json | 717 ++++++++++++++++++++++++++++++++----- frontend/package.json | 7 +- 3 files changed, 642 insertions(+), 92 deletions(-) create mode 100644 frontend/craco.config.js diff --git a/frontend/craco.config.js b/frontend/craco.config.js new file mode 100644 index 0000000..7a425e0 --- /dev/null +++ b/frontend/craco.config.js @@ -0,0 +1,10 @@ +const BundleAnalyzerPlugin = + require("webpack-bundle-analyzer").BundleAnalyzerPlugin; + +module.exports = function () { + return { + webpack: { + plugins: [new BundleAnalyzerPlugin({ analyzerMode: "server" })], + }, + }; +}; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ba72a5b..f88113d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "neonlink-frontend", - "version": "0.1.0", + "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "neonlink-frontend", - "version": "0.1.0", + "version": "1.0.0", "dependencies": { "@dnd-kit/core": "^6.0.5", "@dnd-kit/sortable": "^7.0.1", @@ -26,9 +26,11 @@ "web-vitals": "^2.1.4" }, "devDependencies": { + "@craco/craco": "^6.4.5", "autoprefixer": "^10.4.4", "postcss": "^8.4.12", - "tailwindcss": "^3.0.23" + "tailwindcss": "^3.0.23", + "webpack-bundle-analyzer": "^4.5.0" } }, "node_modules/@ampproject/remapping": { @@ -1853,6 +1855,41 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, + "node_modules/@craco/craco": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-6.4.5.tgz", + "integrity": "sha512-8F2rIAao8sEh0FPP52ViEvDM9GjJ7acq0knu1c8UgI+EuZMD5/ZB270ol6jV4iNY7it9Umg/RoGBvNRUNr8U8w==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.1", + "cosmiconfig-typescript-loader": "^1.0.0", + "cross-spawn": "^7.0.0", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "webpack-merge": "^4.2.2" + }, + "bin": { + "craco": "bin/craco.js" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "react-scripts": "^4.0.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@csstools/normalize.css": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", @@ -2786,9 +2823,9 @@ "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2888,6 +2925,12 @@ "node": ">= 8" } }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -3429,6 +3472,30 @@ "node": ">=10.13.0" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, "node_modules/@types/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", @@ -5471,6 +5538,31 @@ "node": ">=10" } }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz", + "integrity": "sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7", + "ts-node": "^10.7.0" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "typescript": ">=3" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -6079,6 +6171,15 @@ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -10886,6 +10987,12 @@ "semver": "bin/semver.js" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -11101,6 +11208,15 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -13656,6 +13772,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -16277,6 +16402,20 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -17083,6 +17222,15 @@ "node": ">=0.6" } }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", @@ -17120,6 +17268,64 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -17224,19 +17430,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -17381,6 +17574,12 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", @@ -17516,6 +17715,117 @@ } } }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/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/webpack-bundle-analyzer/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/webpack-bundle-analyzer/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/webpack-bundle-analyzer/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/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/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/webpack-bundle-analyzer/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/webpack-dev-middleware": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", @@ -17741,6 +18051,15 @@ "node": ">=10.13.0" } }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -18304,6 +18623,15 @@ "node": ">=10" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -19543,6 +19871,29 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, + "@craco/craco": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-6.4.5.tgz", + "integrity": "sha512-8F2rIAao8sEh0FPP52ViEvDM9GjJ7acq0knu1c8UgI+EuZMD5/ZB270ol6jV4iNY7it9Umg/RoGBvNRUNr8U8w==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.1", + "cosmiconfig-typescript-loader": "^1.0.0", + "cross-spawn": "^7.0.0", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "webpack-merge": "^4.2.2" + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, "@csstools/normalize.css": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", @@ -19697,8 +20048,7 @@ "@heroicons/react": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-1.0.6.tgz", - "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==", - "requires": {} + "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==" }, "@humanwhocodes/config-array": { "version": "0.9.5", @@ -20205,9 +20555,9 @@ "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -20264,6 +20614,12 @@ } } }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -20612,6 +20968,30 @@ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, "@types/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", @@ -21223,14 +21603,12 @@ "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "requires": {} + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" }, "acorn-node": { "version": "1.8.2", @@ -21316,8 +21694,7 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "ansi-escapes": { "version": "4.3.2", @@ -21601,8 +21978,7 @@ "babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "requires": {} + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" }, "babel-plugin-polyfill-corejs2": { "version": "0.3.1", @@ -22196,6 +22572,22 @@ "yaml": "^1.10.0" } }, + "cosmiconfig-typescript-loader": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz", + "integrity": "sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==", + "dev": true, + "requires": { + "cosmiconfig": "^7", + "ts-node": "^10.7.0" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -22239,8 +22631,7 @@ "css-declaration-sorter": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", - "requires": {} + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==" }, "css-has-pseudo": { "version": "3.0.4", @@ -22323,8 +22714,7 @@ "css-prefers-color-scheme": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "requires": {} + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==" }, "css-select": { "version": "4.3.0", @@ -22428,8 +22818,7 @@ "cssnano-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "requires": {} + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" }, "csso": { "version": "4.2.0", @@ -22623,6 +23012,12 @@ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -23274,8 +23669,7 @@ "eslint-plugin-react-hooks": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", - "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", - "requires": {} + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==" }, "eslint-plugin-testing-library": { "version": "5.2.1", @@ -24186,8 +24580,7 @@ "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" }, "idb": { "version": "6.1.5", @@ -25229,8 +25622,7 @@ "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "requires": {} + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" }, "jest-regex-util": { "version": "27.5.1", @@ -26090,6 +26482,12 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -26244,6 +26642,12 @@ "minimist": "^1.2.6" } }, + "mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -27972,6 +28376,12 @@ "is-wsl": "^2.2.0" } }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -28244,8 +28654,7 @@ "postcss-browser-comments": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "requires": {} + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" }, "postcss-calc": { "version": "8.2.4", @@ -28310,8 +28719,7 @@ "postcss-custom-media": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", - "requires": {} + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==" }, "postcss-custom-properties": { "version": "12.1.6", @@ -28340,26 +28748,22 @@ "postcss-discard-comments": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "requires": {} + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==" }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "requires": {} + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "requires": {} + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "requires": {} + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" }, "postcss-double-position-gradients": { "version": "3.1.1", @@ -28381,8 +28785,7 @@ "postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "requires": {} + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" }, "postcss-focus-visible": { "version": "6.0.4", @@ -28403,14 +28806,12 @@ "postcss-font-variant": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "requires": {} + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" }, "postcss-gap-properties": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", - "requires": {} + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==" }, "postcss-image-set-function": { "version": "4.0.6", @@ -28423,8 +28824,7 @@ "postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "requires": {} + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" }, "postcss-js": { "version": "4.0.0", @@ -28465,14 +28865,12 @@ "postcss-logical": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "requires": {} + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==" }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "requires": {} + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" }, "postcss-merge-longhand": { "version": "5.1.4", @@ -28533,8 +28931,7 @@ "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "requires": {} + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -28591,8 +28988,7 @@ "postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "requires": {} + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -28677,14 +29073,12 @@ "postcss-overflow-shorthand": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", - "requires": {} + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==" }, "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "requires": {} + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" }, "postcss-place": { "version": "7.0.4", @@ -28772,8 +29166,7 @@ "postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "requires": {} + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" }, "postcss-selector-not": { "version": "5.0.0", @@ -29744,6 +30137,17 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -30007,8 +30411,7 @@ "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "requires": {} + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==" }, "stylehacks": { "version": "5.1.0", @@ -30337,6 +30740,12 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true + }, "tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", @@ -30367,6 +30776,41 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + } + } + }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -30448,12 +30892,6 @@ "is-typedarray": "^1.0.0" } }, - "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "peer": true - }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -30561,6 +30999,12 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", @@ -30681,6 +31125,86 @@ } } }, + "webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "dev": true, + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "webpack-dev-middleware": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", @@ -30804,8 +31328,7 @@ "ws": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "requires": {} + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==" } } }, @@ -30834,6 +31357,15 @@ } } }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -31239,8 +31771,7 @@ "ws": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "requires": {} + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" }, "xml-name-validator": { "version": "3.0.0", @@ -31286,6 +31817,12 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 3b31c68..a8a9489 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -24,7 +24,8 @@ "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", - "eject": "react-scripts eject" + "eject": "react-scripts eject", + "analyze": "craco build" }, "eslintConfig": { "extends": [ @@ -45,8 +46,10 @@ ] }, "devDependencies": { + "@craco/craco": "^6.4.5", "autoprefixer": "^10.4.4", "postcss": "^8.4.12", - "tailwindcss": "^3.0.23" + "tailwindcss": "^3.0.23", + "webpack-bundle-analyzer": "^4.5.0" } } From 96080a74c2b64a4724189a2e5f2e3dcef2fdde1a Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Mon, 15 Aug 2022 10:55:30 +0300 Subject: [PATCH 02/17] optimize lodash imports --- frontend/src/pages/addBookmark/components/TagInput.jsx | 4 +++- frontend/src/pages/addBookmark/index.jsx | 5 ++++- frontend/src/pages/link/components/BookmarksHeader.jsx | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/frontend/src/pages/addBookmark/components/TagInput.jsx b/frontend/src/pages/addBookmark/components/TagInput.jsx index 169c17a..3efde38 100644 --- a/frontend/src/pages/addBookmark/components/TagInput.jsx +++ b/frontend/src/pages/addBookmark/components/TagInput.jsx @@ -1,11 +1,12 @@ import React, { useCallback, useEffect, useState } from "react"; import { getJSON, postJSON } from "../../../helpers/fetch"; -import { debounce } from "lodash"; +import { debounce } from "lodash/debounce"; export default function TagInput({ tags, setTags }) { const [tagInput, setTagInput] = useState(""); const [suggestions, setSuggestions] = useState([]); + // eslint-disable-next-line react-hooks/exhaustive-deps const debounced = useCallback(debounce(fetchUrl, 500), [tagInput]); async function fetchUrl() { @@ -27,6 +28,7 @@ export default function TagInput({ tags, setTags }) { } debounced(); return debounced.cancel; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [setTags, tagInput, tags]); function addTag(textInput) { diff --git a/frontend/src/pages/addBookmark/index.jsx b/frontend/src/pages/addBookmark/index.jsx index 4f765b2..6fedf60 100644 --- a/frontend/src/pages/addBookmark/index.jsx +++ b/frontend/src/pages/addBookmark/index.jsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useRef, useState } from "react"; -import { debounce } from "lodash"; +import { debounce } from "lodash/debounce"; import { postJSON } from "../../helpers/fetch"; import InputBox from "./components/InputBox"; import { Navigate } from "react-router"; @@ -55,6 +55,7 @@ export default function AddPage() { let { categories, fetchCategories } = useCategoriesList(); + // eslint-disable-next-line react-hooks/exhaustive-deps const debounced = useCallback(debounce(fetchUrl, 800), [url]); useEffect(() => { @@ -67,10 +68,12 @@ export default function AddPage() { icon: "", }); return debounced.cancel; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [debounced, url]); useEffect(() => { fetchCategories(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const refreshHandler = (e) => { diff --git a/frontend/src/pages/link/components/BookmarksHeader.jsx b/frontend/src/pages/link/components/BookmarksHeader.jsx index f13ff59..b7e2346 100644 --- a/frontend/src/pages/link/components/BookmarksHeader.jsx +++ b/frontend/src/pages/link/components/BookmarksHeader.jsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useState } from "react"; -import { debounce } from "lodash"; +import { debounce } from "lodash/debounce"; import { useBookMarkList } from "../../../context/bookmarkList"; import { DEF_MAX_ITEMS } from "../../../helpers/constants"; import { useLocalStorage } from "../../../hooks/useLocalStorage"; @@ -8,6 +8,7 @@ import { useRef } from "react"; export default function BookmarksHeader() { const [query, setQuery] = useState(""); + // eslint-disable-next-line react-hooks/exhaustive-deps const delayedQuery = useCallback(debounce(updateBookmarkList, 800), [query]); const { fetchBookmarks } = useBookMarkList(); From a1472f30e04cad163225c5263cbb883e14aa460c Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Mon, 15 Aug 2022 13:16:14 +0300 Subject: [PATCH 03/17] fix debounce import --- frontend/src/pages/addBookmark/components/TagInput.jsx | 2 +- frontend/src/pages/addBookmark/index.jsx | 2 +- frontend/src/pages/link/components/BookmarksHeader.jsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/pages/addBookmark/components/TagInput.jsx b/frontend/src/pages/addBookmark/components/TagInput.jsx index 3efde38..a98115b 100644 --- a/frontend/src/pages/addBookmark/components/TagInput.jsx +++ b/frontend/src/pages/addBookmark/components/TagInput.jsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useState } from "react"; import { getJSON, postJSON } from "../../../helpers/fetch"; -import { debounce } from "lodash/debounce"; +import debounce from "lodash/debounce"; export default function TagInput({ tags, setTags }) { const [tagInput, setTagInput] = useState(""); diff --git a/frontend/src/pages/addBookmark/index.jsx b/frontend/src/pages/addBookmark/index.jsx index 6fedf60..92fbadc 100644 --- a/frontend/src/pages/addBookmark/index.jsx +++ b/frontend/src/pages/addBookmark/index.jsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useRef, useState } from "react"; -import { debounce } from "lodash/debounce"; +import debounce from "lodash/debounce"; import { postJSON } from "../../helpers/fetch"; import InputBox from "./components/InputBox"; import { Navigate } from "react-router"; diff --git a/frontend/src/pages/link/components/BookmarksHeader.jsx b/frontend/src/pages/link/components/BookmarksHeader.jsx index b7e2346..6658e8b 100644 --- a/frontend/src/pages/link/components/BookmarksHeader.jsx +++ b/frontend/src/pages/link/components/BookmarksHeader.jsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useState } from "react"; -import { debounce } from "lodash/debounce"; +import debounce from "lodash/debounce"; import { useBookMarkList } from "../../../context/bookmarkList"; import { DEF_MAX_ITEMS } from "../../../helpers/constants"; import { useLocalStorage } from "../../../hooks/useLocalStorage"; From 1ada2dc0cc8ea35c91c73f43f174307de928f630 Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Mon, 15 Aug 2022 13:17:08 +0300 Subject: [PATCH 04/17] fix set bookmark category to none --- frontend/src/pages/editBookmark/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/editBookmark/index.jsx b/frontend/src/pages/editBookmark/index.jsx index e6b4762..e65ed0b 100644 --- a/frontend/src/pages/editBookmark/index.jsx +++ b/frontend/src/pages/editBookmark/index.jsx @@ -143,7 +143,7 @@ export default function EditBookmark() { value={formData.categoryId} onChange={inputHandler} > - {categories.map((category) => ( From f73e998afe6cb92a39af25187d267f5c006019f5 Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Mon, 15 Aug 2022 13:17:39 +0300 Subject: [PATCH 05/17] fix delete bookmarkPosition with bookmark --- server/db/categories.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/server/db/categories.js b/server/db/categories.js index de38869..ecec34d 100644 --- a/server/db/categories.js +++ b/server/db/categories.js @@ -93,9 +93,20 @@ function getCategoryByName(name) { * @returns {boolean} Deleted succsessfuly */ function deleteCategoryById(id) { - return db.prepare("DELETE FROM category WHERE id = ?").run(id).changes > 0 - ? true - : false; + const statements = [ + "DELETE FROM category WHERE id = :categoryId", + "DELETE FROM categoryPosition WHERE categoryId = :categoryId", + ].map((sql) => db.prepare(sql)); + + const deleteTransaction = db.transaction((data) => { + for (const stmt of statements) { + stmt.run(data); + } + }); + + deleteTransaction({ categoryId: id }); + + return true; } /** From d9d59b53c7e7a5c71b0fa1511500d9a30ed6ebdf Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Mon, 15 Aug 2022 16:59:58 +0300 Subject: [PATCH 06/17] lazy load icons --- .../pages/link/components/BookmarksList.jsx | 5 +- .../pages/link/components/LinkTemplate.jsx | 47 +++++++++++++------ server/db/bookmarks.js | 20 ++++++-- server/routes/api/bookmarks/index.js | 23 +++++++++ 4 files changed, 75 insertions(+), 20 deletions(-) diff --git a/frontend/src/pages/link/components/BookmarksList.jsx b/frontend/src/pages/link/components/BookmarksList.jsx index 3875a98..c138570 100644 --- a/frontend/src/pages/link/components/BookmarksList.jsx +++ b/frontend/src/pages/link/components/BookmarksList.jsx @@ -31,6 +31,7 @@ export default function BookmarksList() { return; } fetchBookmarks({ offset, limit }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchParams]); return ( @@ -43,8 +44,8 @@ export default function BookmarksList() {
{bookmarkList .sort((a, b) => new Date(b.created) - new Date(a.created)) - .map((bookmark, idx) => ( - + .map((bookmark) => ( + ))}
-
-
+
+
setShowOptions(!showOptions)} > - {showOptions ? ( - - ) : ( - - )} +
); } + +function LazyIcon({ id, title }) { + const [isLoading, setIsLoading] = useState(true); + return ( + <> + setIsLoading(false)} + className={`w-8 h-8 bg-contain bg-no-repeat bg-center transition-opacity ${ + isLoading ? "opacity-0" : "opacity-100" + }`} + height={32} + width={32} + loading="lazy" + alt={`icon for ${title}`} + src={`${ + process.env.NODE_ENV !== "production" ? "http://localhost:3333" : "" + }/api/bookmarks/${id}/icon`} + > +
+ + ); +} diff --git a/server/db/bookmarks.js b/server/db/bookmarks.js index 1970a15..b797159 100644 --- a/server/db/bookmarks.js +++ b/server/db/bookmarks.js @@ -71,7 +71,6 @@ function getAllBookmarks(offset = 0, limit = 10) { url, title, desc, - icon, created, group_concat(tags.name, ',') as tags FROM bookmarks @@ -101,7 +100,6 @@ function getBookmarkById(id) { url, title, desc, - icon, created, categoryId, group_concat(tags.name, ',') as tags @@ -156,7 +154,6 @@ function findBookmark(query, limit = 10, offset = 0) { url, title, desc, - icon, created, group_concat(tags.name, ',') as tags FROM bookmarks @@ -231,6 +228,22 @@ function deleteBookmarkById(id) { : false; } +/** + * + * @param {number} id + * @returns + */ +function getIconByBookmarkId(id) { + return db + .prepare( + `SELECT + icon + FROM bookmarks + WHERE bookmarks.id = ?` + ) + .get(id); +} + /** * * @param {number} id @@ -285,4 +298,5 @@ module.exports = { findBookmarkByTag, updateBookmarkById, deleteBookmarkById, + getIconByBookmarkId, }; diff --git a/server/routes/api/bookmarks/index.js b/server/routes/api/bookmarks/index.js index 1fc0f13..44b9b5e 100644 --- a/server/routes/api/bookmarks/index.js +++ b/server/routes/api/bookmarks/index.js @@ -55,6 +55,29 @@ module.exports = async function (fastify, opts) { } ); + fastify.get( + "/:id/icon", + { preHandler: requestForbidden }, + async function (request, reply) { + let { id } = request.params; + let icon = db.getIconByBookmarkId(id); + if (icon?.icon) { + // const toSendBuffer = Buffer.from(`data:image/png:base64,${icon.icon}`); + // return toSendBuffer; + let type = icon.icon.split(";")[0].split(":")[1]; + reply + .type(type) + .send( + Buffer.from( + icon.icon.replace(/^data:\w+\/.+;base64,/, ""), + "base64" + ) + ); + } + throw fastify.httpErrors.notFound(`bookmark with id ${id} not found`); + } + ); + fastify.get( "/export", { preHandler: requestForbidden }, From 51832fb96b7bd33f12c7659bd08fc318b29ae121 Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Mon, 15 Aug 2022 17:31:14 +0300 Subject: [PATCH 07/17] code splitting in routers --- frontend/src/App.jsx | 66 ++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 245719c..d5fc141 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,19 +1,20 @@ import "./App.css"; import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; -import LoginPage from "./pages/login"; -import LinksPage from "./pages/link"; import { useIsloggedIn } from "./context/isLoggedIn"; -import SettingsPage from "./pages/settings"; -import AddPage from "./pages/addBookmark"; import { Navigate, Outlet } from "react-router"; -import { useEffect } from "react"; +import React, { useEffect } from "react"; import { getJSON } from "./helpers/fetch"; -import EditBookmark from "./pages/editBookmark"; -import NotFound from "./pages/notFound"; -import Dashboard from "./pages/dashboard"; -import RegisterPage from "./pages/register"; import { APP_NAME } from "./helpers/constants"; +const RegisterPage = React.lazy(() => import("./pages/register")); +const Dashboard = React.lazy(() => import("./pages/dashboard")); +const NotFound = React.lazy(() => import("./pages/notFound")); +const EditBookmark = React.lazy(() => import("./pages/editBookmark")); +const AddPage = React.lazy(() => import("./pages/addBookmark")); +const SettingsPage = React.lazy(() => import("./pages/settings")); +const LinksPage = React.lazy(() => import("./pages/link")); +const LoginPage = React.lazy(() => import("./pages/login")); + function PrivateWrapper({ profile }) { return profile ? : ; } @@ -54,10 +55,7 @@ function App() { document.title = APP_NAME; }, []); - if (isProfileLoading) - return ( -
- ); + if (isProfileLoading) return ; const routes = [ { path: "/", element: }, @@ -71,24 +69,56 @@ function App() {
- } /> + }> + + + } + /> - } /> + }> + + + } + /> {routes.map((route) => ( } > - + }> + {route.element} + + } + /> ))} - } /> + }> + + + } + />
); } - +function LoadScreen() { + return ( +
+ ); +} export default App; From 7829cd13f3a6e3a4c6cd67bb9b20dda2d9ee13aa Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Mon, 15 Aug 2022 17:32:52 +0300 Subject: [PATCH 08/17] hide categories when loading --- frontend/src/pages/dashboard/components/groupList.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/dashboard/components/groupList.jsx b/frontend/src/pages/dashboard/components/groupList.jsx index 33ca493..9afdb77 100644 --- a/frontend/src/pages/dashboard/components/groupList.jsx +++ b/frontend/src/pages/dashboard/components/groupList.jsx @@ -7,13 +7,14 @@ import { useLocalStorage } from "../../../hooks/useLocalStorage"; import Group from "../components/group"; export default function GroupList() { - let { categories, fetchCategories } = useCategoriesList(); + let { categories, isLoading, fetchCategories } = useCategoriesList(); useEffect(() => { fetchCategories(); }, []); const [columns] = useLocalStorage("dashboardColumns", 3); + if (isLoading) return
; if (categories.length === 0) { return (
From cabf3ed50fc05118eb6ccf9f62ac5b38d594d0bd Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Tue, 16 Aug 2022 09:04:52 +0300 Subject: [PATCH 09/17] add cancelation to requests --- frontend/src/context/bookmarkList.js | 24 +++++++++---- frontend/src/context/categoriesList.js | 35 +++++++++++++++---- frontend/src/context/tagsList.js | 14 +++++--- frontend/src/helpers/fetch.js | 26 ++++++++------ .../pages/dashboard/components/groupList.jsx | 6 +++- .../pages/link/components/BookmarksList.jsx | 4 +++ .../link/components/rightPanel/TagList.jsx | 4 ++- .../pages/settings/tabs/groupTab/groupTab.jsx | 4 ++- 8 files changed, 87 insertions(+), 30 deletions(-) diff --git a/frontend/src/context/bookmarkList.js b/frontend/src/context/bookmarkList.js index 4ed4317..a86ef6c 100644 --- a/frontend/src/context/bookmarkList.js +++ b/frontend/src/context/bookmarkList.js @@ -1,4 +1,4 @@ -import React, { createContext, useContext, useState } from "react"; +import React, { createContext, useContext, useRef, useState } from "react"; import { deleteJSON, getJSON } from "../helpers/fetch"; const BookMarkList = createContext(); @@ -13,17 +13,27 @@ export function BookMarkListProvider({ children }) { const [currentPage, setCurrentPage] = useState(1); const [maxPage, setMaxPage] = useState(10); const [errorBookmarks, setErrorBookmarks] = useState(); + const abortController = useRef(null); + + function abort() { + abortController.current.abort(); + } async function fetchBookmarks({ offset = 0, limit = 25, query, tag }) { setIsBookmarksLoading(true); setErrorBookmarks(undefined); + abortController.current = new AbortController(); + let searchParams = new URLSearchParams(); searchParams.append("offset", offset); searchParams.append("limit", limit); if (query) searchParams.append("q", query); if (tag) searchParams.append("tag", tag); - let res = await getJSON(`/api/bookmarks/?${searchParams.toString()}`); + let res = await getJSON( + `/api/bookmarks/?${searchParams.toString()}`, + abortController.current.signal + ); if (res.ok) { let json = await res.json(); setBookmarkList(json.bookmarks); @@ -36,10 +46,11 @@ export function BookMarkListProvider({ children }) { } async function deleteBookmark(id) { - let res = await deleteJSON(`/api/bookmarks/${id}`, { - credentials: "include", - method: "DELETE", - }); + abortController.current = new AbortController(); + let res = await deleteJSON( + `/api/bookmarks/${id}`, + abortController.current.signal + ); if (res.ok) { setBookmarkList(bookmarkList.filter((item) => item.id !== id)); } else { @@ -57,6 +68,7 @@ export function BookMarkListProvider({ children }) { isBookmarksLoading, fetchBookmarks, deleteBookmark, + abort, }} > {children} diff --git a/frontend/src/context/categoriesList.js b/frontend/src/context/categoriesList.js index 33db497..5836f0e 100644 --- a/frontend/src/context/categoriesList.js +++ b/frontend/src/context/categoriesList.js @@ -1,4 +1,4 @@ -import React, { createContext, useContext, useEffect, useState } from "react"; +import React, { createContext, useContext, useRef, useState } from "react"; import { deleteJSON, getJSON, postJSON, putJSON } from "../helpers/fetch"; const CategoriesList = createContext(); @@ -11,11 +11,13 @@ export function CategoriesListProvider({ children }) { const [categories, setCategories] = useState([]); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(); + const abortController = useRef(null); async function fetchCategories() { setError(undefined); setIsLoading(true); - let res = await getJSON(`/api/categories`); + abortController.current = new AbortController(); + let res = await getJSON(`/api/categories`, abortController.current.signal); if (res.ok) { setCategories(await res.json()); } else { @@ -27,7 +29,12 @@ export function CategoriesListProvider({ children }) { async function addCategory(name, color) { setError(undefined); // setIsLoading(true); - let res = await postJSON("api/categories", { name, color }); + abortController.current = new AbortController(); + let res = await postJSON( + "api/categories", + { name, color }, + abortController.current.signal + ); if (res.ok) { let id = await res.json(); setCategories([...categories, { id, name, color }]); @@ -47,7 +54,12 @@ export function CategoriesListProvider({ children }) { async function editCategory(id, name, color, position) { setError(undefined); // setIsLoading(true); - let res = await putJSON(`api/categories/${id}`, { name, color, position }); + abortController.current = new AbortController(); + let res = await putJSON( + `api/categories/${id}`, + { name, color, position }, + abortController.current.signal + ); if (res.ok) { let idx = categories.findIndex((category) => category.id === id); let arrayCopy = [...categories]; @@ -68,7 +80,11 @@ export function CategoriesListProvider({ children }) { async function deleteCategory(id) { setError(undefined); // setIsLoading(true); - let res = await deleteJSON(`api/categories/${id}`); + abortController.current = new AbortController(); + let res = await deleteJSON( + `api/categories/${id}`, + abortController.current.signal + ); if (res.ok) { let filtered = categories.filter((item) => item.id !== id); setCategories(filtered); @@ -81,9 +97,11 @@ export function CategoriesListProvider({ children }) { async function changePositions(idPositionPairArray) { setError(undefined); // setIsLoading(true); + abortController.current = new AbortController(); let res = await putJSON( `api/categories/changePositions`, - idPositionPairArray + idPositionPairArray, + abortController.current.signal ); if (res.ok) { // setCategories(re); @@ -93,6 +111,10 @@ export function CategoriesListProvider({ children }) { // setIsLoading(false); } + function abort() { + abortController.current.abort(); + } + return ( {children} diff --git a/frontend/src/context/tagsList.js b/frontend/src/context/tagsList.js index a5a454e..0760ef7 100644 --- a/frontend/src/context/tagsList.js +++ b/frontend/src/context/tagsList.js @@ -1,5 +1,5 @@ -import React, { createContext, useContext, useState } from "react"; -import { deleteJSON, getJSON } from "../helpers/fetch"; +import React, { createContext, useContext, useRef, useState } from "react"; +import { getJSON } from "../helpers/fetch"; const TagsList = createContext(); @@ -11,11 +11,13 @@ export function TagsListProvider({ children }) { const [tags, setTags] = useState([]); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(); + const abortController = useRef(null); async function fetchTags() { setError(undefined); setIsLoading(true); - let res = await getJSON(`/api/tags`); + abortController.current = new AbortController(); + let res = await getJSON(`/api/tags`, abortController.current.signal); if (res.ok) { setTags(await res.json()); } else { @@ -23,9 +25,11 @@ export function TagsListProvider({ children }) { } setIsLoading(false); } - + function abort() { + abortController.current.abort(); + } return ( - + {children} ); diff --git a/frontend/src/helpers/fetch.js b/frontend/src/helpers/fetch.js index bfe2737..20dbd20 100644 --- a/frontend/src/helpers/fetch.js +++ b/frontend/src/helpers/fetch.js @@ -3,7 +3,7 @@ const BASE_URL = ? window.location.origin : `${window.location.protocol}//${window.location.hostname}:3333`; -export async function postJSON(endpoint, json) { +export async function postJSON(endpoint, json, signal) { let url = new URL(endpoint, BASE_URL).toString(); return await fetch(url, { method: "POST", @@ -12,9 +12,10 @@ export async function postJSON(endpoint, json) { "Content-Type": "application/json", }, credentials: "include", + signal, }); } -export async function postFormData(endpoint, object) { +export async function postFormData(endpoint, object, signal) { let url = new URL(endpoint, BASE_URL).toString(); let formData = new FormData(); for (const name in object) { @@ -24,13 +25,20 @@ export async function postFormData(endpoint, object) { method: "POST", body: formData, credentials: "include", + signal, }); } -export async function getJSON(endpoint) { +/** + * + * @param {string} endpoint + * @param {AbortSignal} signal + * @returns {Promise} + */ +export async function getJSON(endpoint, signal) { let url = new URL(endpoint, BASE_URL).toString(); - return await fetch(url, { credentials: "include" }); + return await fetch(url, { credentials: "include", signal }); } -export async function putJSON(endpoint, json) { +export async function putJSON(endpoint, json, signal) { let url = new URL(endpoint, BASE_URL).toString(); return await fetch(url, { method: "PUT", @@ -39,16 +47,14 @@ export async function putJSON(endpoint, json) { "Content-Type": "application/json", }, credentials: "include", + signal, }); } -export async function deleteJSON(endpoint, json) { +export async function deleteJSON(endpoint, signal) { let url = new URL(endpoint, BASE_URL).toString(); return await fetch(url, { method: "DELETE", - body: JSON.stringify(json), - headers: { - "Content-Type": "application/json", - }, credentials: "include", + signal, }); } diff --git a/frontend/src/pages/dashboard/components/groupList.jsx b/frontend/src/pages/dashboard/components/groupList.jsx index 9afdb77..0872091 100644 --- a/frontend/src/pages/dashboard/components/groupList.jsx +++ b/frontend/src/pages/dashboard/components/groupList.jsx @@ -7,10 +7,14 @@ import { useLocalStorage } from "../../../hooks/useLocalStorage"; import Group from "../components/group"; export default function GroupList() { - let { categories, isLoading, fetchCategories } = useCategoriesList(); + let { categories, isLoading, fetchCategories, abort } = useCategoriesList(); useEffect(() => { fetchCategories(); + return () => { + abort(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const [columns] = useLocalStorage("dashboardColumns", 3); diff --git a/frontend/src/pages/link/components/BookmarksList.jsx b/frontend/src/pages/link/components/BookmarksList.jsx index c138570..bb29dc1 100644 --- a/frontend/src/pages/link/components/BookmarksList.jsx +++ b/frontend/src/pages/link/components/BookmarksList.jsx @@ -18,6 +18,7 @@ export default function BookmarksList() { maxPage, isBookmarksLoading, fetchBookmarks, + abort, } = useBookMarkList(); useEffect(() => { @@ -31,6 +32,9 @@ export default function BookmarksList() { return; } fetchBookmarks({ offset, limit }); + return () => { + abort(); + }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchParams]); diff --git a/frontend/src/pages/link/components/rightPanel/TagList.jsx b/frontend/src/pages/link/components/rightPanel/TagList.jsx index 962c31a..170965b 100644 --- a/frontend/src/pages/link/components/rightPanel/TagList.jsx +++ b/frontend/src/pages/link/components/rightPanel/TagList.jsx @@ -3,10 +3,12 @@ import { useTagsList } from "../../../../context/tagsList"; import TagItem from "./TagItem"; export default function TagList() { - const { tags, fetchTags } = useTagsList(); + const { tags, fetchTags, abort } = useTagsList(); useEffect(() => { fetchTags(); + return () => abort(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); if (tags.length === 0) return
No tags
; diff --git a/frontend/src/pages/settings/tabs/groupTab/groupTab.jsx b/frontend/src/pages/settings/tabs/groupTab/groupTab.jsx index 5e30d0a..19eaf7e 100644 --- a/frontend/src/pages/settings/tabs/groupTab/groupTab.jsx +++ b/frontend/src/pages/settings/tabs/groupTab/groupTab.jsx @@ -22,8 +22,8 @@ export default function GroupTab() { setCategories, changePositions, isLoading, - error, fetchCategories, + abort, } = useCategoriesList(); const sensors = useSensors( @@ -44,6 +44,8 @@ export default function GroupTab() { useEffect(() => { fetchCategories(); + return () => abort(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); function handleDragEnd(e) { From a3ac647144d6fa8134a974d23dd708b4e96d50b9 Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Tue, 16 Aug 2022 13:20:55 +0300 Subject: [PATCH 10/17] add batch update links info --- frontend/src/helpers/constants.js | 2 +- .../settings/tabs/mainTab/BatchEditing.jsx | 30 +++++++++++ .../settings/tabs/mainTab/ImportBookmark.jsx | 3 +- .../pages/settings/tabs/mainTab/mainTab.jsx | 4 ++ server/db/bookmarks.js | 51 +++++++++++-------- server/routes/api/bookmarks/index.js | 12 ++--- server/routes/api/utils/batchUpdateLinks.js | 34 +++++++++++++ server/routes/api/utils/index.js | 6 +++ server/routes/api/utils/parsePage.js | 19 ++----- server/utils/imgUrlToBase64.js | 2 +- 10 files changed, 118 insertions(+), 45 deletions(-) create mode 100644 frontend/src/pages/settings/tabs/mainTab/BatchEditing.jsx create mode 100644 server/routes/api/utils/batchUpdateLinks.js diff --git a/frontend/src/helpers/constants.js b/frontend/src/helpers/constants.js index 61f203d..9bd0741 100644 --- a/frontend/src/helpers/constants.js +++ b/frontend/src/helpers/constants.js @@ -1,6 +1,6 @@ export const APP_NAME = "NeonLink"; export const VERSION = "1.0.0"; -export const DEF_MAX_ITEMS = 10; +export const DEF_MAX_ITEMS = 20; export const DEF_COLUMNS = 3; export const CARD_HEADER_STYLE = ["default", "transparent", "borderless"]; export const DEF_OPEN_LINK_IN_NEW_TAB = true; diff --git a/frontend/src/pages/settings/tabs/mainTab/BatchEditing.jsx b/frontend/src/pages/settings/tabs/mainTab/BatchEditing.jsx new file mode 100644 index 0000000..01f31c7 --- /dev/null +++ b/frontend/src/pages/settings/tabs/mainTab/BatchEditing.jsx @@ -0,0 +1,30 @@ +import React from "react"; +import { useState } from "react"; +import { BUTTON_BASE_CLASS } from "../../../../helpers/baseDesign"; +import { getJSON } from "../../../../helpers/fetch"; + +export default function BatchEditing() { + const [isLoading, setIsLoading] = useState(false); + function handleUpdateIconClick() { + setIsLoading(true); + async function requestUpdateLinks() { + let res = await getJSON("/api/utils/updatelinks"); + setIsLoading(false); + if (res.ok) { + } + } + requestUpdateLinks(); + } + return ( +
+ +
This will update title, description and icon in all links.
+
+ ); +} diff --git a/frontend/src/pages/settings/tabs/mainTab/ImportBookmark.jsx b/frontend/src/pages/settings/tabs/mainTab/ImportBookmark.jsx index e8252d6..ced444b 100644 --- a/frontend/src/pages/settings/tabs/mainTab/ImportBookmark.jsx +++ b/frontend/src/pages/settings/tabs/mainTab/ImportBookmark.jsx @@ -2,7 +2,7 @@ import React from "react"; import { useNavigate } from "react-router-dom"; import { UploadIcon } from "@heroicons/react/outline"; import { useState } from "react"; -import { postFormData, postJSON } from "../../../../helpers/fetch"; +import { getJSON, postFormData, postJSON } from "../../../../helpers/fetch"; import { useEffect } from "react"; import BookmarkList from "./BookmarkList"; @@ -47,6 +47,7 @@ export default function ImportBookmark() { })) ); if (res.ok) { + await getJSON("/api/utils/updatelinks"); navigate("/links"); } else { setError((await res.json()).message); diff --git a/frontend/src/pages/settings/tabs/mainTab/mainTab.jsx b/frontend/src/pages/settings/tabs/mainTab/mainTab.jsx index ed0d18e..3502027 100644 --- a/frontend/src/pages/settings/tabs/mainTab/mainTab.jsx +++ b/frontend/src/pages/settings/tabs/mainTab/mainTab.jsx @@ -1,5 +1,6 @@ import React from "react"; import InputGroup from "../../components/inputGroup"; +import BatchEditing from "./BatchEditing"; import ChangePassword from "./ChangePassword"; import ExportBookmarks from "./ExportBookmarks"; import ImportBookmark from "./ImportBookmark"; @@ -16,6 +17,9 @@ export default function MainTab() { + + +
); } diff --git a/server/db/bookmarks.js b/server/db/bookmarks.js index b797159..bc6831d 100644 --- a/server/db/bookmarks.js +++ b/server/db/bookmarks.js @@ -8,7 +8,9 @@ let db = new Database("./db/bookmarks.sqlite"); * @property {string} url * @property {string} title * @property {string} desc - * @property {string} icon + * @property {string} created + * @property {number} categoryId + * @property {string[]} tags */ /** @@ -53,12 +55,17 @@ function addBookmark(url, title, desc, icon, categoryId, tags) { transaction(tags); return bookmarkId; } - +/** + * @typedef AllBookmarks + * @property {Bookmark[]} bookmarks + * @property {number} currentPage + * @property {number} maxPage + */ /** * * @param {number} offset * @param {number} limit - * @returns {Bookmark[]} Array of bookmarks + * @returns {AllBookmarks} All bookmarks */ function getAllBookmarks(offset = 0, limit = 10) { let total = db.prepare("SELECT COUNT(*) FROM bookmarks").get()["COUNT(*)"]; @@ -72,6 +79,7 @@ function getAllBookmarks(offset = 0, limit = 10) { title, desc, created, + categoryId, group_concat(tags.name, ',') as tags FROM bookmarks LEFT JOIN bookmarksTags ON bookmarksTags.bookmarkId = bookmarks.id @@ -241,7 +249,7 @@ function getIconByBookmarkId(id) { FROM bookmarks WHERE bookmarks.id = ?` ) - .get(id); + .get(id).icon; } /** @@ -257,22 +265,25 @@ function getIconByBookmarkId(id) { */ function updateBookmarkById(id, url, title, desc, icon, categoryId, tags) { db.prepare("DELETE FROM bookmarksTags WHERE bookmarkId = ?").run(id); - let ids = db - .prepare( - `SELECT id FROM tags WHERE name IN (${new Array(tags.length) - .fill("?") - .join(",")})` - ) - .all(...tags); - let stmt = db.prepare( - "INSERT INTO bookmarksTags (bookmarkId, tagId) VALUES(:bookmarkId,:tagId)" - ); - let transaction = db.transaction((ids) => { - for (const tagId of ids.map((value) => value.id)) { - stmt.run({ bookmarkId: id, tagId }); - } - }); - transaction(ids); + + if (tags) { + let ids = db + .prepare( + `SELECT id FROM tags WHERE name IN (${new Array(tags.length) + .fill("?") + .join(",")})` + ) + .all(...tags); + let stmt = db.prepare( + "INSERT INTO bookmarksTags (bookmarkId, tagId) VALUES(:bookmarkId,:tagId)" + ); + let transaction = db.transaction((ids) => { + for (const tagId of ids.map((value) => value.id)) { + stmt.run({ bookmarkId: id, tagId }); + } + }); + transaction(ids); + } return db .prepare( diff --git a/server/routes/api/bookmarks/index.js b/server/routes/api/bookmarks/index.js index 44b9b5e..d74e7be 100644 --- a/server/routes/api/bookmarks/index.js +++ b/server/routes/api/bookmarks/index.js @@ -61,18 +61,14 @@ module.exports = async function (fastify, opts) { async function (request, reply) { let { id } = request.params; let icon = db.getIconByBookmarkId(id); - if (icon?.icon) { - // const toSendBuffer = Buffer.from(`data:image/png:base64,${icon.icon}`); - // return toSendBuffer; - let type = icon.icon.split(";")[0].split(":")[1]; + if (icon) { + let type = icon.split(";")[0].split(":")[1]; reply .type(type) .send( - Buffer.from( - icon.icon.replace(/^data:\w+\/.+;base64,/, ""), - "base64" - ) + Buffer.from(icon.replace(/^data:\w+\/.+;base64,/, ""), "base64") ); + return; } throw fastify.httpErrors.notFound(`bookmark with id ${id} not found`); } diff --git a/server/routes/api/utils/batchUpdateLinks.js b/server/routes/api/utils/batchUpdateLinks.js new file mode 100644 index 0000000..8d0aea6 --- /dev/null +++ b/server/routes/api/utils/batchUpdateLinks.js @@ -0,0 +1,34 @@ +const axios = require("axios").default; + +const db = require("../../../db/connect"); +const { imgUrlToBase64 } = require("../../../utils/imgUrlToBase64"); +const { parseHtml } = require("./parsePage"); + +function batchUpdateLinks() { + let bookmarks = db.getAllBookmarks(0, 999999); + + bookmarks.bookmarks.forEach(async (bookmark) => { + let response; + try { + response = await axios.get(bookmark.url); + } catch (err) { + // console.error(err.message); + return; + } + if (response.status !== 200) return; + let html = await response.data; + let urlInfo = await parseHtml(html, bookmark.url); + let icon = await imgUrlToBase64(urlInfo.icon); + db.updateBookmarkById( + bookmark.id, + bookmark.url, + urlInfo.title || bookmark.title, + urlInfo.desc || bookmark.desc, + icon, + bookmark.categoryId, + bookmark.tags + ); + }); + return true; +} +module.exports = { batchUpdateLinks }; diff --git a/server/routes/api/utils/index.js b/server/routes/api/utils/index.js index 653e118..6e534cb 100644 --- a/server/routes/api/utils/index.js +++ b/server/routes/api/utils/index.js @@ -1,6 +1,7 @@ "use strict"; const { parseHtml } = require("./parsePage"); const { parseBookmarkFile } = require("./bookmarkParser"); +const { batchUpdateLinks } = require("./batchUpdateLinks"); const axios = require("axios").default; /** @@ -28,6 +29,7 @@ module.exports = async function (fastify, opts) { try { res = await axios.get(url); } catch (error) { + console.error(url, error.message); return { title: "", desc: "", icon: "" }; } @@ -41,4 +43,8 @@ module.exports = async function (fastify, opts) { let parsedJson = parseBookmarkFile(bookmarkFile.data); return parsedJson; }); + + fastify.get("/updatelinks", {}, async function (request, reply) { + return batchUpdateLinks(); + }); }; diff --git a/server/routes/api/utils/parsePage.js b/server/routes/api/utils/parsePage.js index c530dce..dd6b054 100644 --- a/server/routes/api/utils/parsePage.js +++ b/server/routes/api/utils/parsePage.js @@ -5,21 +5,12 @@ const { parse } = require("node-html-parser"); * * @param {HTMLElement} doc * @param {string} baseUrl - * @returns + * @returns {string} */ function parseIcon(doc, baseUrl) { - var regex = new RegExp("^(?:[a-z]+:)?//", "i"); - let icon = doc.querySelector('link[rel="icon"]'); - if (icon) { - let iconUrl = icon.attributes["href"]; - let isRelative = !regex.test(iconUrl); - if (isRelative) { - return new URL(iconUrl, baseUrl); - } else { - return iconUrl; - } - } - icon = doc.querySelector('link[rel="shortcut icon"]'); + let icon = + doc.querySelector('link[rel="icon"]') || + doc.querySelector('link[rel="shortcut icon"]'); if (icon) { let path = icon.attributes["href"]; return new URL(path, baseUrl).toString(); @@ -31,7 +22,7 @@ function parseIcon(doc, baseUrl) { * @param {HTMLElement} doc */ function parseTitle(doc) { - let title = doc.querySelector("title").textContent; + let title = doc.querySelector("title")?.textContent ?? ""; let desc = doc.querySelector("meta[name=description]")?.attributes["content"] ?? ""; return { title, desc }; diff --git a/server/utils/imgUrlToBase64.js b/server/utils/imgUrlToBase64.js index e78e70e..0d43551 100644 --- a/server/utils/imgUrlToBase64.js +++ b/server/utils/imgUrlToBase64.js @@ -6,7 +6,7 @@ async function imgUrlToBase64(url) { let raw = Buffer.from(image.data).toString("base64"); return "data:" + image.headers["content-type"] + ";base64," + raw; } catch (error) { - console.error(error); + console.error(error.message); return undefined; } } From cc5545cc5d5c2331cb5d2f366f9fa74d5a608d36 Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Wed, 17 Aug 2022 15:36:03 +0300 Subject: [PATCH 11/17] add support to save multiple background images --- server/db/bgImages.js | 56 ++++++++++++++++ server/db/connect.js | 7 ++ server/routes/api/backgroundimage/index.js | 76 ++++++++++++++++++++++ server/routes/api/bookmarks/index.js | 2 +- server/routes/api/tags/index.js | 63 +++++++++++++----- server/routes/api/utils/index.js | 6 ++ server/routes/api/utils/saveFile.js | 20 ++++++ 7 files changed, 214 insertions(+), 16 deletions(-) create mode 100644 server/db/bgImages.js create mode 100644 server/routes/api/backgroundimage/index.js create mode 100644 server/routes/api/utils/saveFile.js diff --git a/server/db/bgImages.js b/server/db/bgImages.js new file mode 100644 index 0000000..8db0b35 --- /dev/null +++ b/server/db/bgImages.js @@ -0,0 +1,56 @@ +const Database = require("better-sqlite3"); +let db = new Database("./db/bookmarks.sqlite"); + +/** + * @typedef BgImage + * @property {number} id + * @property {string} url + */ +/** + * + * @param {string} url + * @return {number} last inserted row + */ +function addImage(url) { + return db.prepare("INSERT INTO bgImages (url) VALUES(:url)").run({ url }) + .lastInsertRowid; +} +/** + * + * @param {number} id + * @returns {number} changes + */ +function deleteImage(id) { + return db.prepare("DELETE FROM bgImages WHERE id=:id").run({ id }).changes; +} + +/** + * + * @returns {BgImage[]} + */ +function getAllImages() { + return db.prepare("SELECT * FROM bgImages").all(); +} +/** + * + * @param {number} id + * @returns {BgImage[]} + */ +function getImageById(id) { + return db.prepare("SELECT * FROM bgImages WHERE id=:id").all({ id }); +} +/** + * + * @param {string} url + * @returns {BgImage[]} + */ +function getImageByUrl(url) { + return db.prepare("SELECT * FROM bgImages WHERE url=:url").all({ url }); +} +module.exports = { + addImage, + deleteImage, + getAllImages, + getImageById, + getImageByUrl, +}; diff --git a/server/db/connect.js b/server/db/connect.js index bd2e46c..6543471 100644 --- a/server/db/connect.js +++ b/server/db/connect.js @@ -5,6 +5,7 @@ const bookmarks = require("./bookmarks"); const users = require("./users"); const tags = require("./tags"); const categories = require("./categories"); +const bgImages = require("./bgImages"); function init() { console.log("Starting up..."); @@ -58,6 +59,12 @@ function init() { position INTEGER )` ).run(); + db.prepare( + `CREATE TABLE IF NOT EXISTS bgImages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + url INTEGER + )` + ).run(); } module.exports = { diff --git a/server/routes/api/backgroundimage/index.js b/server/routes/api/backgroundimage/index.js new file mode 100644 index 0000000..583c61d --- /dev/null +++ b/server/routes/api/backgroundimage/index.js @@ -0,0 +1,76 @@ +const { default: fastify } = require("fastify"); +const bgImages = require("../../../db/bgImages"); +const usersDB = require("../../../db/users"); + +/** + * + * @param {import("fastify").FastifyRequest} request + * @param {import("fastify").FastifyReply} reply + */ +async function requestForbidden(request, reply) { + try { + let SSID = request.cookies.SSID; + if (SSID) { + let user = await usersDB.getUserByUUID(SSID); + if (user === undefined) { + throw reply.unauthorized("You must login to use this method"); + } + } else throw reply.unauthorized("You must login to use this method"); + } catch { + throw reply.unauthorized("You must login to use this method"); + } +} + +/** + * + * @param {import("fastify").FastifyInstance} fastify + * @param {*} opts + */ +module.exports = async function (fastify, opts) { + fastify.get( + "/", + { preHandler: requestForbidden }, + async function (request, reply) { + return bgImages.getAllImages(); + } + ); + fastify.get( + "/:id", + { preHandler: requestForbidden }, + async function (request, reply) { + let { id } = request.params; + return bgImages.getImageById(id); + } + ); + fastify.post( + "/", + { + schema: { + schema: { + body: { + type: "object", + required: ["url"], + properties: { + url: { type: "string" }, + }, + }, + }, + }, + preHandler: requestForbidden, + }, + async function (request, reply) { + let { url } = request.body; + if (bgImages.getImageByUrl(url).length > 0) + throw reply.notAcceptable("Already exist"); + return bgImages.addImage(url); + } + ); + fastify.delete( + "/:id", + { preHandler: requestForbidden }, + async function (request, reply) { + let { id } = request.params; + return bgImages.deleteImage(id); + } + ); +}; diff --git a/server/routes/api/bookmarks/index.js b/server/routes/api/bookmarks/index.js index d74e7be..08d0ca3 100644 --- a/server/routes/api/bookmarks/index.js +++ b/server/routes/api/bookmarks/index.js @@ -206,7 +206,7 @@ module.exports = async function (fastify, opts) { let { id } = request.params; let { url, title, desc, icon, categoryId, tags } = request.body; if (url === "") throw new Error("Url shoud not be empty string"); - if (icon.startsWith("http")) icon = await imgUrlToBase64(icon); + if (icon && icon.startsWith("http")) icon = await imgUrlToBase64(icon); if (db.updateBookmarkById(id, url, title, desc, icon, categoryId, tags)) return { url, title, desc }; throw fastify.httpErrors.notFound(); diff --git a/server/routes/api/tags/index.js b/server/routes/api/tags/index.js index d4c593a..4327794 100644 --- a/server/routes/api/tags/index.js +++ b/server/routes/api/tags/index.js @@ -8,6 +8,26 @@ const { updateTagById, findTags, } = require("../../../db/tags"); +const { getUserByUUID } = require("../../../db/users"); + +/** + * + * @param {import("fastify").FastifyRequest} request + * @param {import("fastify").FastifyReply} reply + */ +async function requestForbidden(request, reply) { + try { + let SSID = request.cookies.SSID; + if (SSID) { + let user = await getUserByUUID(SSID); + if (user === undefined) { + throw reply.unauthorized("You must login to use this method"); + } + } else throw reply.unauthorized("You must login to use this method"); + } catch { + throw reply.unauthorized("You must login to use this method"); + } +} const postOptions = { schema: { @@ -19,6 +39,7 @@ const postOptions = { }, }, }, + preHandler: requestForbidden, }; /** @@ -27,16 +48,24 @@ const postOptions = { * @param {*} opts */ module.exports = async function (fastify, opts) { - fastify.get("/", async function (request, reply) { - let { q } = request.query; - if (q) return findTags(q); - return getAllTags(); - }); + fastify.get( + "/", + { preHandler: requestForbidden }, + async function (request, reply) { + let { q } = request.query; + if (q) return findTags(q); + return getAllTags(); + } + ); - fastify.get("/:id", async function (request, reply) { - let { id } = request.params; - return getTagById(id); - }); + fastify.get( + "/:id", + { preHandler: requestForbidden }, + async function (request, reply) { + let { id } = request.params; + return getTagById(id); + } + ); fastify.post("/", postOptions, async function (request, reply) { let { name } = request.body; @@ -57,10 +86,14 @@ module.exports = async function (fastify, opts) { return { id, name }; }); - fastify.delete("/:id", async function (request, reply) { - let { id } = request.params; - let status = deleteBookmarkById(id); - if (status) return true; - throw new Error("cannot delete"); - }); + fastify.delete( + "/:id", + { preHandler: requestForbidden }, + async function (request, reply) { + let { id } = request.params; + let status = deleteBookmarkById(id); + if (status) return true; + throw new Error("cannot delete"); + } + ); }; diff --git a/server/routes/api/utils/index.js b/server/routes/api/utils/index.js index 6e534cb..4aa6e65 100644 --- a/server/routes/api/utils/index.js +++ b/server/routes/api/utils/index.js @@ -2,6 +2,7 @@ const { parseHtml } = require("./parsePage"); const { parseBookmarkFile } = require("./bookmarkParser"); const { batchUpdateLinks } = require("./batchUpdateLinks"); +const saveFileToPublic = require("./saveFile"); const axios = require("axios").default; /** @@ -47,4 +48,9 @@ module.exports = async function (fastify, opts) { fastify.get("/updatelinks", {}, async function (request, reply) { return batchUpdateLinks(); }); + + // fastify.post("/savefile", {}, async function (request, reply) { + // const file = request.raw.files.file; + // return saveFileToPublic(file.name, file.data); + // }); }; diff --git a/server/routes/api/utils/saveFile.js b/server/routes/api/utils/saveFile.js new file mode 100644 index 0000000..ce161cd --- /dev/null +++ b/server/routes/api/utils/saveFile.js @@ -0,0 +1,20 @@ +const fs = require("fs/promises"); +const path = require("path"); + +async function saveFileToPublic(filename, data) { + let publicPath = path.join( + __dirname, + "../../../public/static/media", + filename + ); + + return await fs + .writeFile(publicPath, data) + .then(() => { + return true; + }) + .catch((err) => { + return err; + }); +} +module.exports = saveFileToPublic; From 31ebc3b9c7683e32d0c1d4ff848652593277689f Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Wed, 17 Aug 2022 15:37:22 +0300 Subject: [PATCH 12/17] add ssetting for multiple background imageges --- .../pages/settings/components/inputItem.jsx | 35 +++- .../interfaceTab/BackgroundImageSettings.jsx | 173 ++++++++++++++++++ .../tabs/interfaceTab/interfaceTab.jsx | 38 ++-- 3 files changed, 223 insertions(+), 23 deletions(-) create mode 100644 frontend/src/pages/settings/tabs/interfaceTab/BackgroundImageSettings.jsx diff --git a/frontend/src/pages/settings/components/inputItem.jsx b/frontend/src/pages/settings/components/inputItem.jsx index 4182cef..73e2c9f 100644 --- a/frontend/src/pages/settings/components/inputItem.jsx +++ b/frontend/src/pages/settings/components/inputItem.jsx @@ -1,16 +1,33 @@ import React from "react"; -export default function InputItem({ title, input, description, icon }) { +export default function InputItem({ + title, + input, + description, + icon, + horisontal = false, +}) { return ( -
-
- {icon} +
+
+
+ {icon} +
+
+
{title}
+
{description}
+
-
-
{title}
-
{description}
-
-
{input}
+ + {horisontal ? ( +
{input}
+ ) : ( +
{input}
+ )}
); } diff --git a/frontend/src/pages/settings/tabs/interfaceTab/BackgroundImageSettings.jsx b/frontend/src/pages/settings/tabs/interfaceTab/BackgroundImageSettings.jsx new file mode 100644 index 0000000..63db5ea --- /dev/null +++ b/frontend/src/pages/settings/tabs/interfaceTab/BackgroundImageSettings.jsx @@ -0,0 +1,173 @@ +import { CheckIcon, PlusIcon, TrashIcon } from "@heroicons/react/outline"; +import React, { useEffect } from "react"; +import { useState } from "react"; +import Modal from "../../../../components/Modal"; +import { useInterfaceSettings } from "../../../../context/interfaceSettingsContext"; +import { BUTTON_BASE_CLASS } from "../../../../helpers/baseDesign"; +import { deleteJSON, getJSON, postJSON } from "../../../../helpers/fetch"; +const ENDPOINT = "/api/backgroundimage"; + +export default function BackgroundImageSettings() { + const { setBgUrl, bgUrl } = useInterfaceSettings(); + + const [images, setImages] = useState([]); + const [selectedId, setSelectedId] = useState(); + const [isLoading, setIsLoading] = useState(false); + const [isDeleting, setIsDeleting] = useState(false); + const [error, setError] = useState(); + const [show, setShow] = useState(false); + const [showDelete, setShowDelete] = useState(false); + + useEffect(() => { + let image = images.filter((image) => image.url === bgUrl); + setSelectedId(image?.[0]?.id); + }, [bgUrl, images]); + + useEffect(() => { + let ac = new AbortController(); + async function getImages() { + let res = await getJSON(ENDPOINT, ac.signal); + if (res.ok) { + setImages(await res.json()); + } + } + getImages(); + return () => { + ac.abort(); + }; + }, []); + + async function handleAdd(e) { + e.preventDefault(); + setIsLoading(true); + setError(); + try { + let url = e.target["add-bgimage-url"].value; + let res = await postJSON(ENDPOINT, { url }); + setIsLoading(false); + if (res.ok) { + e.target["add-bgimage-url"].value = ""; + let id = await res.text(); + setImages((prev) => [...prev, { id, url }]); + setShow(false); + } else { + setError((await res.json())?.message); + } + } catch (err) { + setIsLoading(true); + setError(err.message); + } + } + + function handleSelect(image) { + setSelectedId(image.id); + setBgUrl(image.url); + } + + async function handleImageDelete() { + setIsDeleting(true); + try { + let res = await deleteJSON(`${ENDPOINT}/${selectedId}`); + setIsDeleting(false); + if (res.ok) { + setShowDelete(false); + setImages((prev) => prev.filter((image) => image.id !== selectedId)); + setSelectedId(); + setBgUrl(""); + } + } catch (error) { + setIsDeleting(false); + } + } + + return ( +
+
+ setShow(false)}> + Add image + +
+ { + setError(false); + setIsLoading(false); + }} + className="w-full rounded border focus:outline-none focus:ring-cyan-600 focus:ring px-4 py-2 bg-transparent dark:text-white" + /> + +
+ {error &&
{error}
} +
+
+ setShowDelete(false)}> + Confirm delete + Are you sure you want to delete this image? + +
+ + +
+
+
+ {images.map((image) => ( +
+ { + handleSelect(image); + }} + className={`rounded w-20 h-20 object-cover object-center cursor-pointer ${ + selectedId === image.id ? "border-2 border-cyan-500" : "" + }`} + alt={`bg-img-${image.id}`} + src={image.url} + /> + + {selectedId === image.id && ( +
+ +
+ )} +
+ ))} +
setShow((prev) => !prev)} + className="rounded w-20 h-20 group border-2 border-cyan-500 cursor-pointer flex justify-center items-center hover:bg-cyan-500" + > + +
+ {selectedId && ( +
setShowDelete((prev) => !prev)} + className="rounded w-20 h-20 group border-2 border-red-500 cursor-pointer flex justify-center items-center hover:bg-red-500" + > + +
+ )} +
+
+ ); +} diff --git a/frontend/src/pages/settings/tabs/interfaceTab/interfaceTab.jsx b/frontend/src/pages/settings/tabs/interfaceTab/interfaceTab.jsx index bbf154c..c5fefa9 100644 --- a/frontend/src/pages/settings/tabs/interfaceTab/interfaceTab.jsx +++ b/frontend/src/pages/settings/tabs/interfaceTab/interfaceTab.jsx @@ -5,6 +5,7 @@ import { useInterfaceSettings } from "../../../../context/interfaceSettingsConte import { useLocalStorage } from "../../../../hooks/useLocalStorage"; import { CARD_HEADER_STYLE, + CARD_VERTICAL_ALIGMENT, DEF_COLUMNS, DEF_MAX_ITEMS, } from "../../../../helpers/constants"; @@ -16,9 +17,11 @@ import { LightBulbIcon, MoonIcon, PhotographIcon, + SelectorIcon, ViewBoardsIcon, ViewGridIcon, } from "@heroicons/react/outline"; +import BackgroundImageSettings from "./BackgroundImageSettings"; export default function InterfaceTab() { const { @@ -26,14 +29,14 @@ export default function InterfaceTab() { setTheme, useImageAsBg, cardHeaderStyle, - bgUrl, openLinkInNewTab, useNeonShadow, + cardVerticalAligment, setUseImageAsBg, - setBgUrl, setCardHeaderStyle, setOpenLinkInNewTab, setUseNeonShadow, + setCardVerticalAligment, } = useInterfaceSettings(); const [columns, setColumns] = useLocalStorage( @@ -127,19 +130,11 @@ export default function InterfaceTab() { ), }, { - title: "Backround image", - description: "Url to background image", + title: "Background image", + description: "Upload or choose background image", icon: , - input: ( - setBgUrl(e.target.value)} - value={bgUrl} - className="rounded border w-full focus:outline-none focus:ring-cyan-600 focus:ring px-4 py-2 bg-transparent dark:text-white" - > - ), + horisontal: true, + input: , }, { title: "Columns", @@ -188,6 +183,20 @@ export default function InterfaceTab() { /> ), }, + { + title: "Card position", + description: "Card vertical aligment", + icon: , + input: ( + setCardVerticalAligment(e.target.value)} + defaultValue={cardVerticalAligment || CARD_VERTICAL_ALIGMENT[0]} + /> + ), + }, ], }, ]; @@ -203,6 +212,7 @@ export default function InterfaceTab() { title={item.title} description={item.description} input={item.input} + horisontal={item?.horisontal} /> ))} From f71cfbfb0925a8a6a8a76e693658fea28e6d7ad4 Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Wed, 17 Aug 2022 15:37:47 +0300 Subject: [PATCH 13/17] fix icon loading --- frontend/src/pages/editBookmark/iconInput.jsx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/editBookmark/iconInput.jsx b/frontend/src/pages/editBookmark/iconInput.jsx index d337075..b366bae 100644 --- a/frontend/src/pages/editBookmark/iconInput.jsx +++ b/frontend/src/pages/editBookmark/iconInput.jsx @@ -1,18 +1,35 @@ import { DownloadIcon } from "@heroicons/react/outline"; import React from "react"; +import { useState } from "react"; +import { useEffect } from "react"; +import { useParams } from "react-router"; import { postJSON } from "../../helpers/fetch"; export default function IconInput({ url, icon, setIcon }) { + const [defaultIconUrl, setDefaultIconUrl] = useState(); + const { id } = useParams(); async function fetchIcon() { const res = await postJSON("/api/utils/urlinfo", { url }); const json = await res.json(); setIcon(json.icon); } + useEffect(() => { + if (icon === undefined || icon === "") { + setDefaultIconUrl( + `${ + process.env.NODE_ENV === "production" ? "" : "http://localhost:3333" + }/api/bookmarks/${id}/icon` + ); + } else { + setDefaultIconUrl(); + } + }, [icon, id]); + return (
Date: Wed, 17 Aug 2022 15:38:23 +0300 Subject: [PATCH 14/17] add setting to change vertical aligment of cards --- .../src/context/interfaceSettingsContext.js | 7 +++++++ frontend/src/helpers/constants.js | 10 +++++++-- .../src/pages/dashboard/components/group.jsx | 13 ++++++++---- frontend/src/pages/dashboard/index.jsx | 21 ++++++++++++++++--- 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/frontend/src/context/interfaceSettingsContext.js b/frontend/src/context/interfaceSettingsContext.js index 0cb5246..4e672dc 100644 --- a/frontend/src/context/interfaceSettingsContext.js +++ b/frontend/src/context/interfaceSettingsContext.js @@ -1,6 +1,7 @@ import React, { useContext, useState, useEffect } from "react"; import { CARD_HEADER_STYLE, + CARD_VERTICAL_ALIGMENT, DEF_OPEN_LINK_IN_NEW_TAB, DEF_USE_NEON_SHADOW, } from "../helpers/constants"; @@ -46,6 +47,10 @@ export const InterfaceSettingsProvider = ({ initialTheme, children }) => { "useNeonShadow", DEF_USE_NEON_SHADOW ); + const [cardVerticalAligment, setCardVerticalAligment] = useLocalStorage( + "card-vertical-aligment", + CARD_VERTICAL_ALIGMENT[0] + ); const rawSetTheme = (rawTheme) => { const root = window.document.documentElement; @@ -74,12 +79,14 @@ export const InterfaceSettingsProvider = ({ initialTheme, children }) => { cardHeaderStyle, openLinkInNewTab, useNeonShadow, + cardVerticalAligment, setUseImageAsBg, setBgUrl, setTheme, setCardHeaderStyle, setOpenLinkInNewTab, setUseNeonShadow, + setCardVerticalAligment, }} > {children} diff --git a/frontend/src/helpers/constants.js b/frontend/src/helpers/constants.js index 9bd0741..7424be1 100644 --- a/frontend/src/helpers/constants.js +++ b/frontend/src/helpers/constants.js @@ -1,7 +1,13 @@ export const APP_NAME = "NeonLink"; -export const VERSION = "1.0.0"; +export const VERSION = "1.1.0"; export const DEF_MAX_ITEMS = 20; export const DEF_COLUMNS = 3; -export const CARD_HEADER_STYLE = ["default", "transparent", "borderless"]; +export const CARD_HEADER_STYLE = [ + "default", + "solid", + "transparent", + "borderless", +]; +export const CARD_VERTICAL_ALIGMENT = ["top", "center", "bottom"]; export const DEF_OPEN_LINK_IN_NEW_TAB = true; export const DEF_USE_NEON_SHADOW = true; diff --git a/frontend/src/pages/dashboard/components/group.jsx b/frontend/src/pages/dashboard/components/group.jsx index ad88799..991aac1 100644 --- a/frontend/src/pages/dashboard/components/group.jsx +++ b/frontend/src/pages/dashboard/components/group.jsx @@ -19,6 +19,7 @@ export default function Group({ category }) { let transparentHeader = cardHeaderStyle === "transparent"; let borderless = cardHeaderStyle === "borderless"; + let solid = cardHeaderStyle === "solid"; useEffect(() => { setIsLoading(true); @@ -30,12 +31,16 @@ export default function Group({ category }) { } }; fetch(); - }, []); + }, [category.id]); return (
{isLoading === true ? ( - [...Array(3)].map((i) => ( -
+ [...Array(3)].map((value, idx) => ( +
diff --git a/frontend/src/pages/dashboard/index.jsx b/frontend/src/pages/dashboard/index.jsx index 3f48b8f..83a247c 100644 --- a/frontend/src/pages/dashboard/index.jsx +++ b/frontend/src/pages/dashboard/index.jsx @@ -4,14 +4,29 @@ import GroupList from "./components/groupList"; import { useInterfaceSettings } from "../../context/interfaceSettingsContext"; export default function Dashboard() { - const { bgUrl, useImageAsBg } = useInterfaceSettings(); + const { bgUrl, cardVerticalAligment, useImageAsBg } = useInterfaceSettings(); + let aligmentClass = ""; + switch (cardVerticalAligment) { + case "top": + aligmentClass = ""; + break; + case "center": + aligmentClass = "justify-center"; + break; + case "bottom": + aligmentClass = "justify-end"; + break; + default: + aligmentClass = ""; + break; + } return (
-
+
From a001d0f0d6738ff04d211c1e960c63f000808287 Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Wed, 17 Aug 2022 15:38:31 +0300 Subject: [PATCH 15/17] add modal --- frontend/src/components/Modal.jsx | 95 +++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 frontend/src/components/Modal.jsx diff --git a/frontend/src/components/Modal.jsx b/frontend/src/components/Modal.jsx new file mode 100644 index 0000000..4df8685 --- /dev/null +++ b/frontend/src/components/Modal.jsx @@ -0,0 +1,95 @@ +import { XIcon } from "@heroicons/react/outline"; +import React, { useContext } from "react"; +import { useRef } from "react"; +import { useEffect } from "react"; +import { useState } from "react"; +import { createContext } from "react"; + +const ModalContext = createContext(); + +function useModalContext() { + return useContext(ModalContext); +} + +function ModalContextProvider({ children, onClose }) { + const [visible, setVisible] = useState(false); + useEffect(() => { + if (visible === false) onClose(); + }, [visible]); + + return ( + + {children} + + ); +} + +function Modal({ children, show = false, onClose }) { + return ( + + {children} + + ); +} + +function BaseModal({ children, show }) { + const { visible, setVisible } = useModalContext(); + const backdrop = useRef(null); + useEffect(() => { + setVisible(show); + }, [show]); + + function handleMouseDown(e) { + let label = e.target; + if (label === backdrop.current) { + setVisible(false); + } + } + + return ( +
handleMouseDown(e)} + className={ + visible === false + ? "hidden" + : "fixed top-0 left-0 z-10 w-screen h-screen flex justify-center items-center backdrop-blur bg-black/10" + } + > +
+ {children} +
+
+ ); +} + +function Header({ children, closeButton = false }) { + const { setVisible } = useModalContext(); + return ( +
+
{children}
+ {closeButton && ( +
setVisible(false)} + className="w-6 h-6 cursor-pointer p-1 rounded-full hover:bg-black/10 dark:hover:bg-white/10" + > + +
+ )} +
+ ); +} + +function Body({ children }) { + return
{children}
; +} + +function Footer({ children }) { + return
{children}
; +} + +Modal.Body = Body; +Modal.Header = Header; +Modal.Footer = Footer; + +export default Modal; From 4bb4ab1d767a6bb5dea546f557d4dcc47ec80412 Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Wed, 17 Aug 2022 16:14:19 +0300 Subject: [PATCH 16/17] remove craco --- frontend/craco.config.js | 10 - frontend/package-lock.json | 532 ++++++++----------------------------- frontend/package.json | 4 +- 3 files changed, 116 insertions(+), 430 deletions(-) delete mode 100644 frontend/craco.config.js diff --git a/frontend/craco.config.js b/frontend/craco.config.js deleted file mode 100644 index 7a425e0..0000000 --- a/frontend/craco.config.js +++ /dev/null @@ -1,10 +0,0 @@ -const BundleAnalyzerPlugin = - require("webpack-bundle-analyzer").BundleAnalyzerPlugin; - -module.exports = function () { - return { - webpack: { - plugins: [new BundleAnalyzerPlugin({ analyzerMode: "server" })], - }, - }; -}; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f88113d..6bdddb9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -26,11 +26,9 @@ "web-vitals": "^2.1.4" }, "devDependencies": { - "@craco/craco": "^6.4.5", "autoprefixer": "^10.4.4", "postcss": "^8.4.12", - "tailwindcss": "^3.0.23", - "webpack-bundle-analyzer": "^4.5.0" + "tailwindcss": "^3.0.23" } }, "node_modules/@ampproject/remapping": { @@ -1855,34 +1853,12 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, - "node_modules/@craco/craco": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-6.4.5.tgz", - "integrity": "sha512-8F2rIAao8sEh0FPP52ViEvDM9GjJ7acq0knu1c8UgI+EuZMD5/ZB270ol6jV4iNY7it9Umg/RoGBvNRUNr8U8w==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.1", - "cosmiconfig-typescript-loader": "^1.0.0", - "cross-spawn": "^7.0.0", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "webpack-merge": "^4.2.2" - }, - "bin": { - "craco": "bin/craco.js" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "react-scripts": "^4.0.0" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2925,12 +2901,6 @@ "node": ">= 8" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -3476,25 +3446,29 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "optional": true, + "peer": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "optional": true, + "peer": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "optional": true, + "peer": true }, "node_modules/@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "optional": true, + "peer": true }, "node_modules/@types/aria-query": { "version": "4.2.2", @@ -5538,30 +5512,12 @@ "node": ">=10" } }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz", - "integrity": "sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7", - "ts-node": "^10.7.0" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "typescript": ">=3" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "optional": true, + "peer": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -6175,7 +6131,8 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.3.1" } @@ -10991,7 +10948,8 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "optional": true, + "peer": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -11208,15 +11166,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -13772,15 +13721,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -16402,20 +16342,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -17222,15 +17148,6 @@ "node": ">=0.6" } }, - "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", @@ -17272,7 +17189,8 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "optional": true, + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -17315,7 +17233,8 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -17324,7 +17243,8 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "optional": true, + "peer": true }, "node_modules/tsconfig-paths": { "version": "3.14.1", @@ -17578,7 +17498,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "optional": true, + "peer": true }, "node_modules/v8-to-istanbul": { "version": "8.1.1", @@ -17715,117 +17636,6 @@ } } }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", - "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", - "dev": true, - "dependencies": { - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack-bundle-analyzer/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/webpack-bundle-analyzer/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/webpack-bundle-analyzer/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/webpack-bundle-analyzer/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/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-bundle-analyzer/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/webpack-bundle-analyzer/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/webpack-dev-middleware": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", @@ -18051,15 +17861,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -18627,7 +18428,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -19871,25 +19673,12 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, - "@craco/craco": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-6.4.5.tgz", - "integrity": "sha512-8F2rIAao8sEh0FPP52ViEvDM9GjJ7acq0knu1c8UgI+EuZMD5/ZB270ol6jV4iNY7it9Umg/RoGBvNRUNr8U8w==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.1", - "cosmiconfig-typescript-loader": "^1.0.0", - "cross-spawn": "^7.0.0", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "webpack-merge": "^4.2.2" - } - }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "optional": true, + "peer": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" } @@ -20048,7 +19837,8 @@ "@heroicons/react": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-1.0.6.tgz", - "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==" + "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==", + "requires": {} }, "@humanwhocodes/config-array": { "version": "0.9.5", @@ -20614,12 +20404,6 @@ } } }, - "@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -20972,25 +20756,29 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "optional": true, + "peer": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "optional": true, + "peer": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "optional": true, + "peer": true }, "@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "optional": true, + "peer": true }, "@types/aria-query": { "version": "4.2.2", @@ -21603,12 +21391,14 @@ "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} }, "acorn-node": { "version": "1.8.2", @@ -21694,7 +21484,8 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "ansi-escapes": { "version": "4.3.2", @@ -21978,7 +21769,8 @@ "babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "requires": {} }, "babel-plugin-polyfill-corejs2": { "version": "0.3.1", @@ -22572,21 +22364,12 @@ "yaml": "^1.10.0" } }, - "cosmiconfig-typescript-loader": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz", - "integrity": "sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==", - "dev": true, - "requires": { - "cosmiconfig": "^7", - "ts-node": "^10.7.0" - } - }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "optional": true, + "peer": true }, "cross-spawn": { "version": "7.0.3", @@ -22631,7 +22414,8 @@ "css-declaration-sorter": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==" + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "requires": {} }, "css-has-pseudo": { "version": "3.0.4", @@ -22714,7 +22498,8 @@ "css-prefers-color-scheme": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==" + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "requires": {} }, "css-select": { "version": "4.3.0", @@ -22818,7 +22603,8 @@ "cssnano-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "requires": {} }, "csso": { "version": "4.2.0", @@ -23016,7 +22802,8 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true + "optional": true, + "peer": true }, "diff-sequences": { "version": "27.5.1", @@ -23669,7 +23456,8 @@ "eslint-plugin-react-hooks": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", - "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==" + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==", + "requires": {} }, "eslint-plugin-testing-library": { "version": "5.2.1", @@ -24580,7 +24368,8 @@ "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} }, "idb": { "version": "6.1.5", @@ -25622,7 +25411,8 @@ "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "requires": {} }, "jest-regex-util": { "version": "27.5.1", @@ -26486,7 +26276,8 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "optional": true, + "peer": true }, "makeerror": { "version": "1.0.12", @@ -26642,12 +26433,6 @@ "minimist": "^1.2.6" } }, - "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -28376,12 +28161,6 @@ "is-wsl": "^2.2.0" } }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -28654,7 +28433,8 @@ "postcss-browser-comments": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "requires": {} }, "postcss-calc": { "version": "8.2.4", @@ -28719,7 +28499,8 @@ "postcss-custom-media": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==" + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "requires": {} }, "postcss-custom-properties": { "version": "12.1.6", @@ -28748,22 +28529,26 @@ "postcss-discard-comments": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", - "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==" + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", + "requires": {} }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "requires": {} }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "requires": {} }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "requires": {} }, "postcss-double-position-gradients": { "version": "3.1.1", @@ -28785,7 +28570,8 @@ "postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "requires": {} }, "postcss-focus-visible": { "version": "6.0.4", @@ -28806,12 +28592,14 @@ "postcss-font-variant": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "requires": {} }, "postcss-gap-properties": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==" + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "requires": {} }, "postcss-image-set-function": { "version": "4.0.6", @@ -28824,7 +28612,8 @@ "postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "requires": {} }, "postcss-js": { "version": "4.0.0", @@ -28865,12 +28654,14 @@ "postcss-logical": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==" + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "requires": {} }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "requires": {} }, "postcss-merge-longhand": { "version": "5.1.4", @@ -28931,7 +28722,8 @@ "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -28988,7 +28780,8 @@ "postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "requires": {} }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -29073,12 +28866,14 @@ "postcss-overflow-shorthand": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==" + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "requires": {} }, "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "requires": {} }, "postcss-place": { "version": "7.0.4", @@ -29166,7 +28961,8 @@ "postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "requires": {} }, "postcss-selector-not": { "version": "5.0.0", @@ -30137,17 +29933,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "dev": true, - "requires": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - } - }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -30411,7 +30196,8 @@ "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==" + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "requires": {} }, "stylehacks": { "version": "5.1.0", @@ -30740,12 +30526,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, - "totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "dev": true - }, "tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", @@ -30780,7 +30560,8 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "optional": true, + "peer": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -30801,13 +30582,15 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true + "optional": true, + "peer": true }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "optional": true, + "peer": true } } }, @@ -31003,7 +30786,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "optional": true, + "peer": true }, "v8-to-istanbul": { "version": "8.1.1", @@ -31125,86 +30909,6 @@ } } }, - "webpack-bundle-analyzer": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", - "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", - "dev": true, - "requires": { - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "webpack-dev-middleware": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", @@ -31328,7 +31032,8 @@ "ws": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==" + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "requires": {} } } }, @@ -31357,15 +31062,6 @@ } } }, - "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -31771,7 +31467,8 @@ "ws": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "requires": {} }, "xml-name-validator": { "version": "3.0.0", @@ -31821,7 +31518,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "optional": true, + "peer": true }, "yocto-queue": { "version": "0.1.0", diff --git a/frontend/package.json b/frontend/package.json index a8a9489..2ffa84b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -46,10 +46,8 @@ ] }, "devDependencies": { - "@craco/craco": "^6.4.5", "autoprefixer": "^10.4.4", "postcss": "^8.4.12", - "tailwindcss": "^3.0.23", - "webpack-bundle-analyzer": "^4.5.0" + "tailwindcss": "^3.0.23" } } From c180927ff0473f5c6d45e292beba9fdc7c36202c Mon Sep 17 00:00:00 2001 From: AlexSciFier <66871322+AlexSciFier@users.noreply.github.com> Date: Wed, 17 Aug 2022 16:36:49 +0300 Subject: [PATCH 17/17] fix dependecies --- frontend/package-lock.json | 289 ++++--------------------------------- frontend/package.json | 5 +- 2 files changed, 29 insertions(+), 265 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 6bdddb9..1e2fc0e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "neonlink-frontend", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "neonlink-frontend", - "version": "1.0.0", + "version": "1.1.0", "dependencies": { "@dnd-kit/core": "^6.0.5", "@dnd-kit/sortable": "^7.0.1", @@ -1853,19 +1853,6 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@csstools/normalize.css": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", @@ -2799,9 +2786,9 @@ "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -3442,34 +3429,6 @@ "node": ">=10.13.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "optional": true, - "peer": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "optional": true, - "peer": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "optional": true, - "peer": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "optional": true, - "peer": true - }, "node_modules/@types/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", @@ -5512,13 +5471,6 @@ "node": ">=10" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "optional": true, - "peer": true - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -6127,16 +6079,6 @@ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -10944,13 +10886,6 @@ "semver": "bin/semver.js" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "optional": true, - "peer": true - }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -17185,67 +17120,6 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "optional": true, - "peer": true - }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -17350,6 +17224,19 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -17494,13 +17381,6 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "optional": true, - "peer": true - }, "node_modules/v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", @@ -18424,16 +18304,6 @@ "node": ">=10" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -19673,16 +19543,6 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "optional": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, "@csstools/normalize.css": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", @@ -20345,9 +20205,9 @@ "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -20752,34 +20612,6 @@ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "optional": true, - "peer": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "optional": true, - "peer": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "optional": true, - "peer": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "optional": true, - "peer": true - }, "@types/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", @@ -22364,13 +22196,6 @@ "yaml": "^1.10.0" } }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "optional": true, - "peer": true - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -22798,13 +22623,6 @@ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "optional": true, - "peer": true - }, "diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -26272,13 +26090,6 @@ } } }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "optional": true, - "peer": true - }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -30556,44 +30367,6 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "optional": true, - "peer": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "optional": true, - "peer": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "optional": true, - "peer": true - } - } - }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -30675,6 +30448,12 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "peer": true + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -30782,13 +30561,6 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "optional": true, - "peer": true - }, "v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", @@ -31514,13 +31286,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "optional": true, - "peer": true - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 2ffa84b..76f352e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "neonlink-frontend", - "version": "1.0.0", + "version": "1.1.0", "private": true, "dependencies": { "@dnd-kit/core": "^6.0.5", @@ -24,8 +24,7 @@ "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", - "eject": "react-scripts eject", - "analyze": "craco build" + "eject": "react-scripts eject" }, "eslintConfig": { "extends": [