diff --git a/package.json b/package.json index c276125..649a500 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,10 @@ "@fortawesome/free-regular-svg-icons": "^6.2.1", "@fortawesome/free-solid-svg-icons": "^6.2.1", "@fortawesome/react-fontawesome": "^0.2.0", - "@mui/material": "^5.11.2", + "@mui/material": "^5.11.4", "@tauri-apps/api": "^1.2.0", "clsx": "^1.2.1", + "debug": "^4.3.4", "ramda": "^0.28.0", "react": "^18.2.0", "react-async-hook": "^4.0.0", @@ -29,6 +30,7 @@ "@emotion/babel-plugin-jsx-pragmatic": "^0.2.0", "@emotion/serialize": "^1.1.1", "@tauri-apps/cli": "^1.2.2", + "@types/debug": "^4.1.7", "@types/node": "^18.11.18", "@types/ramda": "^0.28.20", "@types/react": "^18.0.26", @@ -36,13 +38,13 @@ "@vitejs/plugin-react": "^2.2.0", "autoprefixer": "^10.4.13", "babel-plugin-macros": "^3.1.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.6.1", + "eslint-config-prettier": "^8.6.0", + "eslint-plugin-import": "^2.27.4", + "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-simple-import-sort": "^8.0.0", - "postcss": "^8.4.20", - "prettier": "^2.8.1", + "postcss": "^8.4.21", + "prettier": "^2.8.3", "tailwindcss": "^3.2.4", "twin.macro": "^3.1.0", "typescript": "^4.9.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d13e74..2e381a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,9 +10,10 @@ specifiers: '@fortawesome/free-regular-svg-icons': ^6.2.1 '@fortawesome/free-solid-svg-icons': ^6.2.1 '@fortawesome/react-fontawesome': ^0.2.0 - '@mui/material': ^5.11.2 + '@mui/material': ^5.11.4 '@tauri-apps/api': ^1.2.0 '@tauri-apps/cli': ^1.2.2 + '@types/debug': ^4.1.7 '@types/node': ^18.11.18 '@types/ramda': ^0.28.20 '@types/react': ^18.0.26 @@ -21,13 +22,14 @@ specifiers: autoprefixer: ^10.4.13 babel-plugin-macros: ^3.1.0 clsx: ^1.2.1 - eslint-config-prettier: ^8.5.0 - eslint-plugin-import: ^2.26.0 - eslint-plugin-jsx-a11y: ^6.6.1 + debug: ^4.3.4 + eslint-config-prettier: ^8.6.0 + eslint-plugin-import: ^2.27.4 + eslint-plugin-jsx-a11y: ^6.7.1 eslint-plugin-prettier: ^4.2.1 eslint-plugin-simple-import-sort: ^8.0.0 - postcss: ^8.4.20 - prettier: ^2.8.1 + postcss: ^8.4.21 + prettier: ^2.8.3 ramda: ^0.28.0 react: ^18.2.0 react-async-hook: ^4.0.0 @@ -44,9 +46,10 @@ dependencies: '@fortawesome/free-regular-svg-icons': 6.2.1 '@fortawesome/free-solid-svg-icons': 6.2.1 '@fortawesome/react-fontawesome': 0.2.0_z27bm67dtmuyyvss23ckjdrcuy - '@mui/material': 5.11.2_lskpmcsdi7ipu6qpuapyu56ihm + '@mui/material': 5.11.4_lskpmcsdi7ipu6qpuapyu56ihm '@tauri-apps/api': 1.2.0 clsx: 1.2.1 + debug: 4.3.4 ramda: 0.28.0 react: 18.2.0 react-async-hook: 4.0.0_react@18.2.0 @@ -57,21 +60,22 @@ devDependencies: '@emotion/babel-plugin-jsx-pragmatic': 0.2.0 '@emotion/serialize': 1.1.1 '@tauri-apps/cli': 1.2.2 + '@types/debug': 4.1.7 '@types/node': 18.11.18 '@types/ramda': 0.28.20 '@types/react': 18.0.26 '@types/react-dom': 18.0.10 '@vitejs/plugin-react': 2.2.0_vite@3.2.5 - autoprefixer: 10.4.13_postcss@8.4.20 + autoprefixer: 10.4.13_postcss@8.4.21 babel-plugin-macros: 3.1.0 - eslint-config-prettier: 8.5.0 - eslint-plugin-import: 2.26.0 - eslint-plugin-jsx-a11y: 6.6.1 - eslint-plugin-prettier: 4.2.1_oixrjny4ajrp742454blm2dh6q + eslint-config-prettier: 8.6.0 + eslint-plugin-import: 2.27.4 + eslint-plugin-jsx-a11y: 6.7.1 + eslint-plugin-prettier: 4.2.1_sf22gp4h4llr342kfjdanueldy eslint-plugin-simple-import-sort: 8.0.0 - postcss: 8.4.20 - prettier: 2.8.1 - tailwindcss: 3.2.4_postcss@8.4.20 + postcss: 8.4.21 + prettier: 2.8.3 + tailwindcss: 3.2.4_postcss@8.4.21 twin.macro: 3.1.0_tailwindcss@3.2.4 typescript: 4.9.4 vite: 3.2.5_@types+node@18.11.18 @@ -97,19 +101,19 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.20.7: - resolution: {integrity: sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==} + /@babel/core/7.20.12: + resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 '@babel/generator': 7.20.7 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 '@babel/helper-module-transforms': 7.20.11 '@babel/helpers': 7.20.7 '@babel/parser': 7.20.7 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.10 + '@babel/traverse': 7.20.12 '@babel/types': 7.20.7 convert-source-map: 1.9.0 debug: 4.3.4 @@ -136,14 +140,14 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.7: + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.12: resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/compat-data': 7.20.10 - '@babel/core': 7.20.7 + '@babel/core': 7.20.12 '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.4 lru-cache: 5.1.1 @@ -186,7 +190,7 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.10 + '@babel/traverse': 7.20.12 '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color @@ -228,7 +232,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.20.7 - '@babel/traverse': 7.20.10 + '@babel/traverse': 7.20.12 '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color @@ -258,43 +262,43 @@ packages: dependencies: '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.7: + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.7 + '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.7: + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.7 - '@babel/plugin-transform-react-jsx': 7.20.7_@babel+core@7.20.7 + '@babel/core': 7.20.12 + '@babel/plugin-transform-react-jsx': 7.20.7_@babel+core@7.20.12 dev: true - /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.20.7: + /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.7 + '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.20.7: + /@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.20.12: resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.7 + '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -311,28 +315,20 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/plugin-transform-react-jsx/7.20.7_@babel+core@7.20.7: + /@babel/plugin-transform-react-jsx/7.20.7_@babel+core@7.20.12: resolution: {integrity: sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.7 + '@babel/core': 7.20.12 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.12 '@babel/types': 7.20.7 dev: true - /@babel/runtime-corejs3/7.20.7: - resolution: {integrity: sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==} - engines: {node: '>=6.9.0'} - dependencies: - core-js-pure: 3.27.1 - regenerator-runtime: 0.13.11 - dev: true - /@babel/runtime/7.20.7: resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==} engines: {node: '>=6.9.0'} @@ -348,8 +344,8 @@ packages: '@babel/types': 7.20.7 dev: true - /@babel/traverse/7.20.10: - resolution: {integrity: sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==} + /@babel/traverse/7.20.12: + resolution: {integrity: sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 @@ -599,8 +595,8 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@mui/base/5.0.0-alpha.112_ib3m5ricvtkl2cll7qpr2f6lvq: - resolution: {integrity: sha512-KPwb1iYPXsV/P8uu0SNQrj7v7YU6wdN4Eccc2lZQyRDW+f6PJYjHBuFUTYKc408B98Jvs1XbC/z5MN45a2DWrQ==} + /@mui/base/5.0.0-alpha.113_ib3m5ricvtkl2cll7qpr2f6lvq: + resolution: {integrity: sha512-XSjvyQWATM8uk+EJZvYna8D21kOXC42lwb3q4K70btuGieKlCIQLaHTTDV2OfD4+JfT4o3NJy3I4Td2co31RZA==} engines: {node: '>=12.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 @@ -623,12 +619,12 @@ packages: react-is: 18.2.0 dev: false - /@mui/core-downloads-tracker/5.11.2: - resolution: {integrity: sha512-ztLQELdSSuJFXezng8g5eCzy8mogtzMM8JcfG3HIGgUJ2RlAiBXI2Qe0adKmrJlF4FMat8vTaTeoiRNBZH4t1Q==} + /@mui/core-downloads-tracker/5.11.4: + resolution: {integrity: sha512-jWVwGM3vG4O0sXcW0VcIl+njCWbGCBF5vvjRpuKJajrz51AD7D6+fP1SkInZXVk5pRHf6Bnk/Yj9Of9gXxb/hA==} dev: false - /@mui/material/5.11.2_lskpmcsdi7ipu6qpuapyu56ihm: - resolution: {integrity: sha512-PeraRDsghnDLzejorfe9ps1syxlB8UrGs+UKwg9GGlndv5Tghm+9nwuibrP2TCDC14mlryF+u2WlAOYaPPMwGA==} + /@mui/material/5.11.4_lskpmcsdi7ipu6qpuapyu56ihm: + resolution: {integrity: sha512-ZL/czK9ynrQJ6uyDwQgK+j7m1iKA1XKPON+rEPupwAu/bJ1XJxD+H/H2bkMM8UpOkzaucx/WuMbJJGQ60l7gBg==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -647,9 +643,9 @@ packages: '@babel/runtime': 7.20.7 '@emotion/react': 11.10.5_kzbn2opkn2327fwg5yzwzya5o4 '@emotion/styled': 11.10.5_qvatmowesywn4ye42qoh247szu - '@mui/base': 5.0.0-alpha.112_ib3m5ricvtkl2cll7qpr2f6lvq - '@mui/core-downloads-tracker': 5.11.2 - '@mui/system': 5.11.2_ogriz7mfahdh34qnfautfro5yu + '@mui/base': 5.0.0-alpha.113_ib3m5ricvtkl2cll7qpr2f6lvq + '@mui/core-downloads-tracker': 5.11.4 + '@mui/system': 5.11.4_ogriz7mfahdh34qnfautfro5yu '@mui/types': 7.2.3_@types+react@18.0.26 '@mui/utils': 5.11.2_react@18.2.0 '@types/react': 18.0.26 @@ -702,8 +698,8 @@ packages: react: 18.2.0 dev: false - /@mui/system/5.11.2_ogriz7mfahdh34qnfautfro5yu: - resolution: {integrity: sha512-PPkYhrcP2MkhscX6SauIl0wPgra0w1LGPtll+hIKc2Z2JbGRSrUCFif93kxejB7I1cAoCay9jWW4mnNhsOqF/g==} + /@mui/system/5.11.4_ogriz7mfahdh34qnfautfro5yu: + resolution: {integrity: sha512-fE2Ts33V5zh7ouciwXgMm/a6sLvjIj9OMeojuHNYY7BStTxparC/Fp9CNUZNJwt76U6ZJC59aYScFSRQKbW08g==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -884,10 +880,20 @@ packages: '@tauri-apps/cli-win32-x64-msvc': 1.2.2 dev: true + /@types/debug/4.1.7: + resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} + dependencies: + '@types/ms': 0.7.31 + dev: true + /@types/json5/0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true + /@types/ms/0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: true + /@types/node/18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} dev: true @@ -938,11 +944,11 @@ packages: peerDependencies: vite: ^3.0.0 dependencies: - '@babel/core': 7.20.7 - '@babel/plugin-transform-react-jsx': 7.20.7_@babel+core@7.20.7 - '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.7 - '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.7 - '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.7 + '@babel/core': 7.20.12 + '@babel/plugin-transform-react-jsx': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.12 magic-string: 0.26.7 react-refresh: 0.14.0 vite: 3.2.5_@types+node@18.11.18 @@ -994,12 +1000,10 @@ packages: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} dev: true - /aria-query/4.2.2: - resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} - engines: {node: '>=6.0'} + /aria-query/5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} dependencies: - '@babel/runtime': 7.20.7 - '@babel/runtime-corejs3': 7.20.7 + deep-equal: 2.2.0 dev: true /array-includes/3.1.6: @@ -1008,7 +1012,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.5 + es-abstract: 1.21.1 get-intrinsic: 1.1.3 is-string: 1.0.7 dev: true @@ -1019,7 +1023,17 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.5 + es-abstract: 1.21.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap/1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.21.1 es-shim-unscopables: 1.0.0 dev: true @@ -1027,7 +1041,7 @@ packages: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: true - /autoprefixer/10.4.13_postcss@8.4.20: + /autoprefixer/10.4.13_postcss@8.4.21: resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -1035,21 +1049,28 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.21.4 - caniuse-lite: 1.0.30001441 + caniuse-lite: 1.0.30001445 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /axe-core/4.6.1: - resolution: {integrity: sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w==} + /available-typed-arrays/1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /axe-core/4.6.2: + resolution: {integrity: sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg==} engines: {node: '>=4'} dev: true - /axobject-query/2.2.0: - resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} + /axobject-query/3.1.1: + resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + dependencies: + deep-equal: 2.2.0 dev: true /babel-plugin-macros/3.1.0: @@ -1088,7 +1109,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001441 + caniuse-lite: 1.0.30001445 electron-to-chromium: 1.4.284 node-releases: 2.0.8 update-browserslist-db: 1.0.10_browserslist@4.21.4 @@ -1110,8 +1131,8 @@ packages: engines: {node: '>= 6'} dev: true - /caniuse-lite/1.0.30001441: - resolution: {integrity: sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==} + /caniuse-lite/1.0.30001445: + resolution: {integrity: sha512-8sdQIdMztYmzfTMO6KfLny878Ln9c2M0fc7EH60IjlP4Dc4PiCy7K2Vl3ITmWgOyPgVQKa5x+UP/KqFsxj4mBg==} dev: true /chalk/2.4.2: @@ -1176,11 +1197,6 @@ packages: /convert-source-map/1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - /core-js-pure/3.27.1: - resolution: {integrity: sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==} - requiresBuild: true - dev: true - /cosmiconfig/7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -1204,17 +1220,6 @@ packages: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true - /debug/2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - /debug/3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1236,6 +1241,27 @@ packages: optional: true dependencies: ms: 2.1.2 + + /deep-equal/2.2.0: + resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} + dependencies: + call-bind: 1.0.2 + es-get-iterator: 1.1.3 + get-intrinsic: 1.1.3 + is-arguments: 1.1.1 + is-array-buffer: 3.0.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.9 dev: true /define-properties/1.1.4: @@ -1295,35 +1321,66 @@ packages: dependencies: is-arrayish: 0.2.1 - /es-abstract/1.20.5: - resolution: {integrity: sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==} + /es-abstract/1.21.1: + resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} engines: {node: '>= 0.4'} dependencies: + available-typed-arrays: 1.0.5 call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 function-bind: 1.1.1 function.prototype.name: 1.1.5 get-intrinsic: 1.1.3 get-symbol-description: 1.0.0 + globalthis: 1.0.3 gopd: 1.0.1 has: 1.0.3 has-property-descriptors: 1.0.0 + has-proto: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.4 + is-array-buffer: 3.0.1 is-callable: 1.2.7 is-negative-zero: 2.0.2 is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 + is-typed-array: 1.1.10 is-weakref: 1.0.2 - object-inspect: 1.12.2 + object-inspect: 1.12.3 object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.4.3 safe-regex-test: 1.0.0 string.prototype.trimend: 1.0.6 string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + + /es-get-iterator/1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true + + /es-set-tostringtag/2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.1.3 + has: 1.0.3 + has-tostringtag: 1.0.0 dev: true /es-shim-unscopables/1.0.0: @@ -1565,23 +1622,24 @@ packages: engines: {node: '>=10'} dev: false - /eslint-config-prettier/8.5.0: - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + /eslint-config-prettier/8.6.0: + resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dev: true - /eslint-import-resolver-node/0.3.6: - resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} + /eslint-import-resolver-node/0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7 + is-core-module: 2.11.0 resolve: 1.22.1 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils/2.7.4_ulu2225r2ychl26a37c6o2rfje: + /eslint-module-utils/2.7.4_sgsp5urgqm477dupjnxj5zkyya: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -1603,13 +1661,13 @@ packages: optional: true dependencies: debug: 3.2.7 - eslint-import-resolver-node: 0.3.6 + eslint-import-resolver-node: 0.3.7 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import/2.26.0: - resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} + /eslint-plugin-import/2.27.4: + resolution: {integrity: sha512-Z1jVt1EGKia1X9CnBCkpAOhWy8FgQ7OmJ/IblEkT82yrFU/xJaxwujaTzLWqigewwynRQ9mmHfX9MtAfhxm0sA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1620,16 +1678,18 @@ packages: dependencies: array-includes: 3.1.6 array.prototype.flat: 1.3.1 - debug: 2.6.9 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 doctrine: 2.1.0 - eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.4_ulu2225r2ychl26a37c6o2rfje + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4_sgsp5urgqm477dupjnxj5zkyya has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 minimatch: 3.1.2 object.values: 1.1.6 resolve: 1.22.1 + semver: 6.3.0 tsconfig-paths: 3.14.1 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -1637,28 +1697,31 @@ packages: - supports-color dev: true - /eslint-plugin-jsx-a11y/6.6.1: - resolution: {integrity: sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==} + /eslint-plugin-jsx-a11y/6.7.1: + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: '@babel/runtime': 7.20.7 - aria-query: 4.2.2 + aria-query: 5.1.3 array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 ast-types-flow: 0.0.7 - axe-core: 4.6.1 - axobject-query: 2.2.0 + axe-core: 4.6.2 + axobject-query: 3.1.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 has: 1.0.3 jsx-ast-utils: 3.3.3 - language-tags: 1.0.7 + language-tags: 1.0.5 minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 semver: 6.3.0 dev: true - /eslint-plugin-prettier/4.2.1_oixrjny4ajrp742454blm2dh6q: + /eslint-plugin-prettier/4.2.1_sf22gp4h4llr342kfjdanueldy: resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1669,8 +1732,8 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint-config-prettier: 8.5.0 - prettier: 2.8.1 + eslint-config-prettier: 8.6.0 + prettier: 2.8.3 prettier-linter-helpers: 1.0.0 dev: true @@ -1717,6 +1780,12 @@ packages: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: false + /for-each/0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + /fraction.js/4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: true @@ -1738,7 +1807,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.5 + es-abstract: 1.21.1 functions-have-names: 1.2.3 dev: true @@ -1786,6 +1855,13 @@ packages: engines: {node: '>=4'} dev: true + /globalthis/1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.1.4 + dev: true + /gopd/1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -1811,6 +1887,11 @@ packages: get-intrinsic: 1.1.3 dev: true + /has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} @@ -1851,6 +1932,22 @@ packages: side-channel: 1.0.4 dev: true + /is-arguments/1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-array-buffer/3.0.1: + resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + is-typed-array: 1.1.10 + dev: true + /is-arrayish/0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -1904,6 +2001,10 @@ packages: is-extglob: 2.1.1 dev: true + /is-map/2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -1929,6 +2030,10 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-set/2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + /is-shared-array-buffer/1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: @@ -1949,12 +2054,38 @@ packages: has-symbols: 1.0.3 dev: true + /is-typed-array/1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /is-weakmap/2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + /is-weakref/1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true + /is-weakset/2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + dev: true + + /isarray/2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1992,8 +2123,8 @@ packages: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} dev: true - /language-tags/1.0.7: - resolution: {integrity: sha512-bSytju1/657hFjgUzPAPqszxH62ouE8nQFoFaVlIQfne4wO/wXC9A4+m8jYve7YBBvi59eq0SUpcshvG8h5Usw==} + /language-tags/1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} dependencies: language-subtag-registry: 0.3.22 dev: true @@ -2057,13 +2188,8 @@ packages: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} dev: true - /ms/2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2099,8 +2225,16 @@ packages: engines: {node: '>= 6'} dev: true - /object-inspect/1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + /object-inspect/1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: true + + /object-is/1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 dev: true /object-keys/1.1.1: @@ -2118,13 +2252,31 @@ packages: object-keys: 1.1.1 dev: true + /object.entries/1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.21.1 + dev: true + + /object.fromentries/2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.21.1 + dev: true + /object.values/1.1.6: resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.5 + es-abstract: 1.21.1 dev: true /parent-module/1.0.1: @@ -2163,29 +2315,29 @@ packages: engines: {node: '>=0.10.0'} dev: true - /postcss-import/14.1.0_postcss@8.4.20: + /postcss-import/14.1.0_postcss@8.4.21: resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.1 dev: true - /postcss-js/4.0.0_postcss@8.4.20: + /postcss-js/4.0.0_postcss@8.4.21: resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.3.3 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.20 + postcss: 8.4.21 dev: true - /postcss-load-config/3.1.4_postcss@8.4.20: + /postcss-load-config/3.1.4_postcss@8.4.21: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -2198,17 +2350,17 @@ packages: optional: true dependencies: lilconfig: 2.0.6 - postcss: 8.4.20 + postcss: 8.4.21 yaml: 1.10.2 dev: true - /postcss-nested/6.0.0_postcss@8.4.20: + /postcss-nested/6.0.0_postcss@8.4.21: resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true @@ -2224,8 +2376,8 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true - /postcss/8.4.20: - resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==} + /postcss/8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.4 @@ -2240,8 +2392,8 @@ packages: fast-diff: 1.2.0 dev: true - /prettier/2.8.1: - resolution: {integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==} + /prettier/2.8.3: + resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -2400,7 +2552,7 @@ packages: dependencies: call-bind: 1.0.2 get-intrinsic: 1.1.3 - object-inspect: 1.12.2 + object-inspect: 1.12.3 dev: true /source-map-js/1.0.2: @@ -2418,12 +2570,19 @@ packages: deprecated: Please use @jridgewell/sourcemap-codec instead dev: true + /stop-iteration-iterator/1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.4 + dev: true + /string.prototype.trimend/1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.5 + es-abstract: 1.21.1 dev: true /string.prototype.trimstart/1.0.6: @@ -2431,7 +2590,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.5 + es-abstract: 1.21.1 dev: true /strip-bom/3.0.0: @@ -2460,7 +2619,7 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /tailwindcss/3.2.4_postcss@8.4.20: + /tailwindcss/3.2.4_postcss@8.4.21: resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==} engines: {node: '>=12.13.0'} hasBin: true @@ -2481,11 +2640,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.20 - postcss-import: 14.1.0_postcss@8.4.20 - postcss-js: 4.0.0_postcss@8.4.20 - postcss-load-config: 3.1.4_postcss@8.4.20 - postcss-nested: 6.0.0_postcss@8.4.20 + postcss: 8.4.21 + postcss-import: 14.1.0_postcss@8.4.21 + postcss-js: 4.0.0_postcss@8.4.21 + postcss-load-config: 3.1.4_postcss@8.4.21 + postcss-nested: 6.0.0_postcss@8.4.21 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 @@ -2530,7 +2689,15 @@ packages: lodash.get: 4.4.2 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.11 - tailwindcss: 3.2.4_postcss@8.4.20 + tailwindcss: 3.2.4_postcss@8.4.21 + dev: true + + /typed-array-length/1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 dev: true /typescript/4.9.4: @@ -2590,7 +2757,7 @@ packages: dependencies: '@types/node': 18.11.18 esbuild: 0.15.18 - postcss: 8.4.20 + postcss: 8.4.21 resolve: 1.22.1 rollup: 2.79.1 optionalDependencies: @@ -2607,6 +2774,27 @@ packages: is-symbol: 1.0.4 dev: true + /which-collection/1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-typed-array/1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + is-typed-array: 1.1.10 + dev: true + /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} diff --git a/src-tauri/src/picker/config/display_config.rs b/src-tauri/src/picker/config/display_config.rs index 1bb664e..e6dda63 100644 --- a/src-tauri/src/picker/config/display_config.rs +++ b/src-tauri/src/picker/config/display_config.rs @@ -1,5 +1,13 @@ use serde::{Deserialize, Serialize}; +#[derive(Clone, Copy, Serialize, Deserialize, Debug)] +pub struct LedStripConfigOfBorders { + pub top: Option, + pub bottom: Option, + pub left: Option, + pub right: Option, +} + #[derive(Clone, Copy, Serialize, Deserialize, Debug)] pub struct LedStripConfig { pub index: usize, @@ -13,23 +21,33 @@ pub struct DisplayConfig { pub index_of_display: usize, pub display_width: usize, pub display_height: usize, - pub top_led_strip: Option, - pub bottom_led_strip: Option, - pub left_led_strip: Option, - pub right_led_strip: Option, + pub led_strip_of_borders: LedStripConfigOfBorders, +} + +impl LedStripConfigOfBorders { + pub fn default() -> Self { + Self { + top: None, + bottom: None, + left: None, + right: None, + } + } } impl DisplayConfig { - pub fn default(id: usize, index_of_display: usize, display_width: usize, display_height: usize) -> Self { + pub fn default( + id: usize, + index_of_display: usize, + display_width: usize, + display_height: usize, + ) -> Self { Self { id, index_of_display, display_width, display_height, - top_led_strip: None, - bottom_led_strip: None, - left_led_strip: None, - right_led_strip: None, + led_strip_of_borders: LedStripConfigOfBorders::default(), } } } diff --git a/src-tauri/src/picker/screenshot.rs b/src-tauri/src/picker/screenshot.rs index 0d336a5..563c22f 100644 --- a/src-tauri/src/picker/screenshot.rs +++ b/src-tauri/src/picker/screenshot.rs @@ -34,7 +34,7 @@ impl Screenshot { } fn get_sample_points(config: DisplayConfig) -> ScreenSamplePoints { - let top = match config.top_led_strip { + let top = match config.led_strip_of_borders.top { Some(led_strip_config) => Self::get_one_edge_sample_points( config.display_height / 8, config.display_width, @@ -48,7 +48,7 @@ impl Screenshot { } }; - let bottom: Vec = match config.bottom_led_strip { + let bottom: Vec = match config.led_strip_of_borders.bottom { Some(led_strip_config) => { let points = Self::get_one_edge_sample_points( config.display_height / 9, @@ -73,7 +73,7 @@ impl Screenshot { } }; - let left: Vec = match config.left_led_strip { + let left: Vec = match config.led_strip_of_borders.left { Some(led_strip_config) => { let points = Self::get_one_edge_sample_points( config.display_width / 16, @@ -95,7 +95,7 @@ impl Screenshot { } }; - let right: Vec = match config.right_led_strip { + let right: Vec = match config.led_strip_of_borders.right { Some(led_strip_config) => { let points = Self::get_one_edge_sample_points( config.display_width / 16, @@ -217,13 +217,13 @@ impl Screenshot { pub fn get_top_of_led_start_at(&self) -> usize { self.config - .top_led_strip + .led_strip_of_borders.top .and_then(|c| Some(c.global_start_position)) .unwrap_or(0) } pub fn get_top_of_led_end_at(&self) -> usize { self.config - .top_led_strip + .led_strip_of_borders.top .and_then(|c| Some(c.global_end_position)) .unwrap_or(0) } diff --git a/src/configurator/components/completed-led-strip.tsx b/src/configurator/components/completed-led-strip.tsx new file mode 100644 index 0000000..28f52a0 --- /dev/null +++ b/src/configurator/components/completed-led-strip.tsx @@ -0,0 +1,93 @@ +import { isNil, splitEvery } from 'ramda'; +import { FC, useMemo } from 'react'; +import tw, { css, styled } from 'twin.macro'; +import { borders } from '../../constants/border'; +import { DisplayConfig } from '../models/display-config'; +import { LedStripConfig } from '../models/led-strip-config'; +import { ScreenshotDto } from '../models/screenshot.dto'; +import { LedStrip } from './led-strip'; +import { StyledPixel } from './styled-pixel'; + +interface CompletedLedStripProps { + screenshots: ScreenshotDto[]; + onDisplayConfigChange?: (value: DisplayConfig) => void; +} + +type BorderLedStrip = { + pixels: [number, number, number][]; + config: LedStripConfig | null; +}; + +const StyledContainer = styled.section( + ({ rows, columns }: { rows: number; columns: number }) => [ + tw`grid m-4 pb-2`, + css` + grid-template-columns: repeat(${columns}, 1fr); + grid-template-rows: auto repeat(${rows}, 1fr); + `, + ], +); +const StyledCompletedContainer = styled.section( + tw`dark:bg-transparent shadow-xl border-gray-500 border rounded-full flex flex-wrap justify-around items-center mb-2`, + css` + grid-column: 1 / -1; + `, +); + +export const CompletedLedStrip: FC = ({ + screenshots, + onDisplayConfigChange, +}) => { + const borderLedStrips: BorderLedStrip[] = useMemo(() => { + return screenshots.flatMap((ss) => + borders.map((b) => ({ + pixels: splitEvery(3, Array.from(ss.colors[b])) as [number, number, number][], + config: ss.config.led_strip_of_borders[b], + })), + ); + }, [screenshots]); + const ledCount = useMemo( + () => borderLedStrips.reduce((prev, curr) => prev + curr.pixels.length, 0), + [borderLedStrips], + ); + + const completedPixels = useMemo(() => { + const completed: [number, number, number][] = new Array(ledCount).fill([0, 0, 0]); + borderLedStrips.forEach(({ pixels, config }) => { + if (isNil(config)) { + return; + } + if (config.global_start_position <= config.global_end_position) { + pixels.forEach((color, i) => { + completed[config.global_start_position + i] = color; + }); + } else { + pixels.forEach((color, i) => { + completed[config.global_start_position - i] = color; + }); + } + }); + + return completed.map((color) => ); + }, [ledCount, borderLedStrips]); + + const strips = useMemo(() => { + return borderLedStrips.map(({ config, pixels }, index) => ( + + )); + }, [borderLedStrips]); + return ( + + {completedPixels} + {strips} + + ); +}; diff --git a/src/configurator/components/display-with-led-strips.tsx b/src/configurator/components/display-with-led-strips.tsx index ed9f56e..f9eef3c 100644 --- a/src/configurator/components/display-with-led-strips.tsx +++ b/src/configurator/components/display-with-led-strips.tsx @@ -1,11 +1,15 @@ import { HTMLAttributes, useCallback, useMemo } from 'react'; import { FC } from 'react'; -import { DisplayConfig } from '../models/display-config'; +import { DisplayConfig, LedStripConfigOfBorders } from '../models/display-config'; import { LedStrip } from './led-strip'; import tw, { css, styled, theme } from 'twin.macro'; import { ScreenshotDto } from '../models/screenshot.dto'; import { LedStripEditor } from './led-strip-editor'; import { LedStripConfig } from '../models/led-strip-config'; +import debug from 'debug'; +import { lensPath, lensProp, set, view } from 'ramda'; + +const logger = debug('app:display-with-led-strips'); export interface DisplayWithLedStripsProps extends Omit, 'onChange'> { @@ -36,61 +40,60 @@ export const DisplayWithLedStrips: FC = ({ ); const onLedStripConfigChange = useCallback( - ( - position: - | 'top_led_strip' - | 'left_led_strip' - | 'right_led_strip' - | 'bottom_led_strip', - value: LedStripConfig | null, - ) => { - const c = { ...config, [position]: value }; + (position: keyof LedStripConfigOfBorders, value: LedStripConfig | null) => { + const xLens = lensPath< + DisplayConfig, + 'led_strip_of_borders', + keyof LedStripConfigOfBorders + >(['led_strip_of_borders', position]); + const c = set(xLens, value, config); + logger('on change. prev: %o, curr: %o', view(xLens, config), value); onChange?.(c); }, [config], ); return ( - + onLedStripConfigChange('top_led_strip', value)} + onChange={(value) => onLedStripConfigChange('top', value)} /> onLedStripConfigChange('left_led_strip', value)} + onChange={(value) => onLedStripConfigChange('left', value)} /> onLedStripConfigChange('right_led_strip', value)} + onChange={(value) => onLedStripConfigChange('right', value)} /> onLedStripConfigChange('bottom_led_strip', value)} + onChange={(value) => onLedStripConfigChange('bottom', value)} /> ); diff --git a/src/configurator/components/led-strip.tsx b/src/configurator/components/led-strip.tsx index 785d693..d6d2fa1 100644 --- a/src/configurator/components/led-strip.tsx +++ b/src/configurator/components/led-strip.tsx @@ -3,6 +3,7 @@ import { FC } from 'react'; import { LedStripConfig } from '../models/led-strip-config'; import tw, { css, styled } from 'twin.macro'; import { splitEvery } from 'ramda'; +import { StyledPixel } from './styled-pixel'; export interface LedStripProps extends HTMLAttributes { config: LedStripConfig | null; @@ -10,19 +11,10 @@ export interface LedStripProps extends HTMLAttributes { } const StyledContainer = styled.section( - tw`dark:bg-transparent shadow-xl border-gray-500 border rounded-full flex flex-wrap justify-around items-center`, + tw`dark:bg-transparent shadow-xl border-gray-500 border rounded-full flex flex-wrap justify-around items-center -mx-px -mt-px`, css``, ); -const StyledPixel = styled.span( - ({ rgb: [r, g, b] }: { rgb: [number, number, number] }) => [ - tw`rounded-full h-3 w-3 bg-current block border border-gray-700`, - css` - color: rgb(${r}, ${g}, ${b}); - `, - ], -); - export const LedStrip: FC = ({ config, colors, ...htmlAttrs }) => { const pixels = useMemo(() => { const pixels = splitEvery(3, Array.from(colors)) as Array<[number, number, number]>; diff --git a/src/configurator/components/styled-pixel.tsx b/src/configurator/components/styled-pixel.tsx new file mode 100644 index 0000000..c742021 --- /dev/null +++ b/src/configurator/components/styled-pixel.tsx @@ -0,0 +1,10 @@ +import tw, { css, styled } from 'twin.macro'; + +export const StyledPixel = styled.span( + ({ rgb: [r, g, b] }: { rgb: [number, number, number] }) => [ + tw`rounded-full h-3 w-3 bg-current block border border-gray-700`, + css` + color: rgb(${r}, ${g}, ${b}); + `, + ], +); diff --git a/src/configurator/configurator.tsx b/src/configurator/configurator.tsx index 8d61817..ec5ebc2 100644 --- a/src/configurator/configurator.tsx +++ b/src/configurator/configurator.tsx @@ -1,6 +1,6 @@ import { invoke } from '@tauri-apps/api'; import { FC, Fragment, useCallback, useEffect, useMemo, useState } from 'react'; -import tw from 'twin.macro'; +import tw, { styled } from 'twin.macro'; import { useAsync, useAsyncCallback } from 'react-async-hook'; import { DisplayWithLedStrips } from './components/display-with-led-strips'; import { PickerConfiguration } from './models/picker-configuration'; @@ -10,6 +10,7 @@ import { Alert, Snackbar } from '@mui/material'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faSpinner } from '@fortawesome/free-solid-svg-icons'; import { update } from 'ramda'; +import { CompletedLedStrip } from './components/completed-led-strip'; const getPickerConfig = () => invoke('get_picker_config'); const getScreenshotOfDisplays = () => @@ -26,6 +27,9 @@ const writePickerConfig = async (config: PickerConfiguration) => { config, }); }; +const StyledConfiguratorContainer = styled.section(tw`flex flex-col items-stretch`); + +const StyledDisplayContainer = styled.section(tw`overflow-auto`); export const Configurator: FC = () => { const { loading: pendingPickerConfig, result: savedPickerConfig } = useAsync( @@ -91,13 +95,14 @@ export const Configurator: FC = () => { } return ( - -
{displays}
; + + + {displays}; } sx={{ width: '100%' }}> This is a success message! -
+ ); }; diff --git a/src/configurator/models/display-config.ts b/src/configurator/models/display-config.ts index ef2ad54..3ce2b1f 100644 --- a/src/configurator/models/display-config.ts +++ b/src/configurator/models/display-config.ts @@ -1,10 +1,16 @@ -import { LedStripConfig } from './led-strip-config'; +import { Borders } from '../../constants/border'; +import { LedStripConfig } from "./led-strip-config"; +export class LedStripConfigOfBorders implements Record { + constructor( + public top: LedStripConfig | null = null, + public bottom: LedStripConfig | null = null, + public left: LedStripConfig | null = null, + public right: LedStripConfig | null = null, + ) {} +} export class DisplayConfig { - top_led_strip: LedStripConfig | null = null; - bottom_led_strip: LedStripConfig | null = null; - left_led_strip: LedStripConfig | null = null; - right_led_strip: LedStripConfig | null = null; + led_strip_of_borders = new LedStripConfigOfBorders(); constructor( public id: number, diff --git a/src/constants/border.ts b/src/constants/border.ts new file mode 100644 index 0000000..62db3c0 --- /dev/null +++ b/src/constants/border.ts @@ -0,0 +1,2 @@ +export const borders = ['top', 'right', 'bottom', 'left'] as const; +export type Borders = typeof borders[number]; \ No newline at end of file