From 904599ecdc1670c2b86eadf4a997977e12eecdb7 Mon Sep 17 00:00:00 2001 From: flytam Date: Sat, 1 Apr 2023 23:20:26 +0800 Subject: [PATCH] feat: persist stoage into file & bundle preload --- .gitignore | 1 + package.json | 8 + pnpm-lock.yaml | 835 +++++++++++++++++++++++- preload/clipboard-event.ts | 57 ++ preload/config.ts | 4 + preload/preload.ts | 33 + public/clipboard-event/index.js | 48 -- public/plugin.json | 2 +- public/preload.js | 14 - src/components/ClipBoardItemContent.tsx | 1 - src/components/ClipBoardList.tsx | 19 +- src/global.d.ts | 10 +- src/hooks/useClipboardData.ts | 32 +- src/hooks/useLocalDb.ts | 65 ++ src/hooks/usePluginLifecycle.ts | 42 ++ src/utils/downloadClipboard.ts | 4 +- tsconfig.json | 22 +- tsconfig.preload.json | 12 + utoolPlugin.ts | 89 ++- 19 files changed, 1199 insertions(+), 99 deletions(-) create mode 100644 preload/clipboard-event.ts create mode 100644 preload/config.ts create mode 100644 preload/preload.ts delete mode 100644 public/clipboard-event/index.js delete mode 100644 public/preload.js create mode 100644 src/hooks/useLocalDb.ts create mode 100644 src/hooks/usePluginLifecycle.ts create mode 100644 tsconfig.preload.json diff --git a/.gitignore b/.gitignore index a547bf3..b2f1e4c 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ dist-ssr *.njsproj *.sln *.sw? +.rollup.cache diff --git a/package.json b/package.json index fc616dd..5923a8e 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "axios": "^1.3.4", "clipboard-event": "^1.6.0", "dayjs": "^1.11.7", + "lodash-es": "^4.17.21", "observe-element-in-viewport": "^0.0.15", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -25,7 +26,11 @@ "vconsole": "^3.15.0" }, "devDependencies": { + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-node-resolve": "^15.0.1", + "@rollup/plugin-typescript": "^11.0.0", "@types/fs-extra": "^11.0.1", + "@types/lodash-es": "^4.17.7", "@types/node": "^18.15.3", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", @@ -37,6 +42,9 @@ "postcss": "^8.4.21", "prettier": "^2.8.4", "pretty-quick": "^3.1.3", + "rollup": "^3.20.2", + "rollup-plugin-node-builtins": "^2.1.2", + "rollup-plugin-node-globals": "^1.4.0", "tailwindcss": "^3.2.7", "typescript": "^4.9.3", "utools-api-types": "^3.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7a4786e..a909200 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,11 @@ specifiers: '@emotion/styled': ^11.10.6 '@mui/icons-material': ^5.11.11 '@mui/material': ^5.11.13 + '@rollup/plugin-commonjs': ^24.0.1 + '@rollup/plugin-node-resolve': ^15.0.1 + '@rollup/plugin-typescript': ^11.0.0 '@types/fs-extra': ^11.0.1 + '@types/lodash-es': ^4.17.7 '@types/node': ^18.15.3 '@types/react': ^18.0.28 '@types/react-dom': ^18.0.11 @@ -18,6 +22,7 @@ specifiers: electron: ^23.1.4 fs-extra: ^11.1.0 husky: ^8.0.0 + lodash-es: ^4.17.21 observe-element-in-viewport: ^0.0.15 postcss: ^8.4.21 prettier: ^2.8.4 @@ -25,6 +30,9 @@ specifiers: react: ^18.2.0 react-dom: ^18.2.0 react-photo-view: ^1.2.3 + rollup: ^3.20.2 + rollup-plugin-node-builtins: ^2.1.2 + rollup-plugin-node-globals: ^1.4.0 tailwindcss: ^3.2.7 typescript: ^4.9.3 utools-api-types: ^3.0.0 @@ -40,6 +48,7 @@ dependencies: axios: 1.3.4 clipboard-event: 1.6.0 dayjs: 1.11.7 + lodash-es: 4.17.21 observe-element-in-viewport: 0.0.15 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -47,7 +56,11 @@ dependencies: vconsole: 3.15.0 devDependencies: + '@rollup/plugin-commonjs': 24.0.1_rollup@3.20.2 + '@rollup/plugin-node-resolve': 15.0.1_rollup@3.20.2 + '@rollup/plugin-typescript': 11.0.0_e7tciabaay7z2i5ycjdzz3zl6i '@types/fs-extra': 11.0.1 + '@types/lodash-es': 4.17.7 '@types/node': 18.15.3 '@types/react': 18.0.28 '@types/react-dom': 18.0.11 @@ -59,6 +72,9 @@ devDependencies: postcss: 8.4.21 prettier: 2.8.4 pretty-quick: 3.1.3_prettier@2.8.4 + rollup: 3.20.2 + rollup-plugin-node-builtins: 2.1.2 + rollup-plugin-node-globals: 1.4.0 tailwindcss: 3.2.7_postcss@8.4.21 typescript: 4.9.5 utools-api-types: 3.0.0 @@ -446,6 +462,10 @@ packages: dev: true optional: true + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + /@mui/base/5.0.0-alpha.121_zula6vjvt3wdocc4mwcxqa6nzi: resolution: {integrity: sha512-8nJRY76UqlJV+q/Yzo0tgGfPWEOa+4N9rjO81fMmcJqP0I6m54hLDXsjvMg4tvelY5eKHXUK6Tb7en+GHfTqZA==} engines: {node: '>=12.0.0'} @@ -646,6 +666,76 @@ packages: resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} dev: false + /@rollup/plugin-commonjs/24.0.1_rollup@3.20.2: + resolution: {integrity: sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2_rollup@3.20.2 + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.27.0 + rollup: 3.20.2 + dev: true + + /@rollup/plugin-node-resolve/15.0.1_rollup@3.20.2: + resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2_rollup@3.20.2 + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.1 + rollup: 3.20.2 + dev: true + + /@rollup/plugin-typescript/11.0.0_e7tciabaay7z2i5ycjdzz3zl6i: + resolution: {integrity: sha512-goPyCWBiimk1iJgSTgsehFD5OOFHiAknrRJjqFCudcW8JtWiBlK284Xnn4flqMqg6YAjVG/EE+3aVzrL5qNSzQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2_rollup@3.20.2 + resolve: 1.22.1 + rollup: 3.20.2 + typescript: 4.9.5 + dev: true + + /@rollup/pluginutils/5.0.2_rollup@3.20.2: + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.0 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.20.2 + dev: true + /@sindresorhus/is/4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -778,6 +868,10 @@ packages: '@types/responselike': 1.0.0 dev: true + /@types/estree/1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + dev: true + /@types/fs-extra/11.0.1: resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} dependencies: @@ -805,6 +899,16 @@ packages: '@types/node': 18.15.3 dev: true + /@types/lodash-es/4.17.7: + resolution: {integrity: sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==} + dependencies: + '@types/lodash': 4.14.192 + dev: true + + /@types/lodash/4.14.192: + resolution: {integrity: sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A==} + dev: true + /@types/minimatch/3.0.5: resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} dev: true @@ -849,6 +953,10 @@ packages: '@types/scheduler': 0.16.2 csstype: 3.1.1 + /@types/resolve/1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: true + /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: @@ -875,6 +983,12 @@ packages: vite: 4.2.0_@types+node@18.15.3 dev: true + /abstract-leveldown/0.12.4: + resolution: {integrity: sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==} + dependencies: + xtend: 3.0.0 + dev: true + /acorn-node/1.8.2: resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} dependencies: @@ -888,6 +1002,12 @@ packages: engines: {node: '>=0.4.0'} dev: true + /acorn/5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /acorn/7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} @@ -957,6 +1077,15 @@ packages: engines: {node: '>=8'} dev: true + /asn1.js/5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + dev: true + /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false @@ -1005,6 +1134,20 @@ packages: engines: {node: '>=8'} dev: true + /bl/0.8.2: + resolution: {integrity: sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==} + dependencies: + readable-stream: 1.0.34 + dev: true + + /bn.js/4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: true + + /bn.js/5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: true + /boolean/3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} dev: true @@ -1017,6 +1160,12 @@ packages: concat-map: 0.0.1 dev: true + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -1024,6 +1173,67 @@ packages: fill-range: 7.0.1 dev: true + /brorand/1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: true + + /browserify-aes/1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-cipher/1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: true + + /browserify-des/1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + dependencies: + cipher-base: 1.0.4 + des.js: 1.0.1 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-fs/1.0.0: + resolution: {integrity: sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==} + dependencies: + level-filesystem: 1.2.0 + level-js: 2.2.4 + levelup: 0.18.6 + dev: true + + /browserify-rsa/4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + dev: true + + /browserify-sign/4.2.1: + resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + /browserslist/4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1039,6 +1249,23 @@ packages: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true + /buffer-es6/4.9.3: + resolution: {integrity: sha512-Ibt+oXxhmeYJSsCkODPqNpPmyegefiD8rfutH1NYGhMZQhSp95Rz7haemgnJ6dxa6LT+JLLbtgOMORRluwKktw==} + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer-xor/1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + dev: true + + /builtin-modules/3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + /cacheable-lookup/5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -1103,6 +1330,13 @@ packages: fsevents: 2.3.2 dev: true + /cipher-base/1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + /clipboard-event/1.6.0: resolution: {integrity: sha512-a69QYimd43xM+5hcHkucs0V/QoiZz1fqEFRTnewOITVQOtypRLbCx76Q91Djn6h7O24817dQw44sFUxRYWIuYA==} dev: false @@ -1113,6 +1347,10 @@ packages: mimic-response: 1.0.1 dev: true + /clone/0.1.19: + resolution: {integrity: sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==} + dev: true + /clsx/1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -1146,10 +1384,24 @@ packages: delayed-stream: 1.0.0 dev: false + /commondir/1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true + /concat-stream/1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: true + /convert-source-map/1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: false @@ -1164,6 +1416,10 @@ packages: requiresBuild: true dev: false + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + /cosmiconfig/7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -1175,6 +1431,34 @@ packages: yaml: 1.10.2 dev: false + /create-ecdh/4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + dev: true + + /create-hash/1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: true + + /create-hmac/1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1184,6 +1468,22 @@ packages: which: 2.0.2 dev: true + /crypto-browserify/3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.1 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: true + /cssesc/3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -1216,11 +1516,22 @@ packages: mimic-response: 3.1.0 dev: true + /deepmerge/4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + /defer-to-connect/2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} dev: true + /deferred-leveldown/0.2.0: + resolution: {integrity: sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==} + dependencies: + abstract-leveldown: 0.12.4 + dev: true + /define-properties/1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} @@ -1239,6 +1550,13 @@ packages: engines: {node: '>=0.4.0'} dev: false + /des.js/1.0.1: + resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + /detect-node/2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true @@ -1258,6 +1576,14 @@ packages: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true + /diffie-hellman/5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: true + /dlv/1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: true @@ -1286,6 +1612,18 @@ packages: - supports-color dev: true + /elliptic/6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + /end-of-stream/1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -1297,6 +1635,13 @@ packages: engines: {node: '>=6'} dev: true + /errno/0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + dependencies: + prr: 1.0.1 + dev: true + /error-ex/1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -1352,6 +1697,25 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + /estree-walker/0.5.2: + resolution: {integrity: sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==} + dev: true + + /estree-walker/0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: true + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /evp_bytestokey/1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: true + /execa/4.1.0: resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} engines: {node: '>=10'} @@ -1433,6 +1797,10 @@ packages: optional: true dev: false + /foreach/2.0.6: + resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} + dev: true + /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -1464,6 +1832,10 @@ packages: universalify: 0.1.2 dev: true + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1475,6 +1847,12 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /fwd-stream/1.0.4: + resolution: {integrity: sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==} + dependencies: + readable-stream: 1.0.34 + dev: true + /get-intrinsic/1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: @@ -1505,6 +1883,17 @@ packages: is-glob: 4.0.3 dev: true + /glob/8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + /global-agent/3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} @@ -1577,6 +1966,30 @@ packages: dependencies: function-bind: 1.1.1 + /hash-base/3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /hash.js/1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /hmac-drbg/1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + /hoist-non-react-statics/3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: @@ -1606,6 +2019,10 @@ packages: hasBin: true dev: true + /idb-wrapper/1.7.2: + resolution: {integrity: sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==} + dev: true + /ignore/5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -1619,6 +2036,21 @@ packages: resolve-from: 4.0.0 dev: false + /indexof/0.0.1: + resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + /intersection-observer/0.12.2: resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} dev: false @@ -1634,6 +2066,13 @@ packages: binary-extensions: 2.2.0 dev: true + /is-builtin-module/3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + /is-core-module/2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: @@ -1651,16 +2090,46 @@ packages: is-extglob: 2.1.1 dev: true + /is-module/1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true + /is-object/0.1.2: + resolution: {integrity: sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==} + dev: true + + /is-reference/1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.0 + dev: true + /is-stream/2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true + /is/0.2.7: + resolution: {integrity: sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==} + dev: true + + /isarray/0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: true + + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isbuffer/0.0.0: + resolution: {integrity: sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==} + dev: true + /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true @@ -1706,6 +2175,82 @@ packages: json-buffer: 3.0.1 dev: true + /level-blobs/0.1.7: + resolution: {integrity: sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==} + dependencies: + level-peek: 1.0.6 + once: 1.4.0 + readable-stream: 1.1.14 + dev: true + + /level-filesystem/1.2.0: + resolution: {integrity: sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==} + dependencies: + concat-stream: 1.6.2 + errno: 0.1.8 + fwd-stream: 1.0.4 + level-blobs: 0.1.7 + level-peek: 1.0.6 + level-sublevel: 5.2.3 + octal: 1.0.0 + once: 1.4.0 + xtend: 2.2.0 + dev: true + + /level-fix-range/1.0.2: + resolution: {integrity: sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==} + dev: true + + /level-fix-range/2.0.0: + resolution: {integrity: sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==} + dependencies: + clone: 0.1.19 + dev: true + + /level-hooks/4.5.0: + resolution: {integrity: sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==} + dependencies: + string-range: 1.2.2 + dev: true + + /level-js/2.2.4: + resolution: {integrity: sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==} + dependencies: + abstract-leveldown: 0.12.4 + idb-wrapper: 1.7.2 + isbuffer: 0.0.0 + ltgt: 2.2.1 + typedarray-to-buffer: 1.0.4 + xtend: 2.1.2 + dev: true + + /level-peek/1.0.6: + resolution: {integrity: sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==} + dependencies: + level-fix-range: 1.0.2 + dev: true + + /level-sublevel/5.2.3: + resolution: {integrity: sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==} + dependencies: + level-fix-range: 2.0.0 + level-hooks: 4.5.0 + string-range: 1.2.2 + xtend: 2.0.6 + dev: true + + /levelup/0.18.6: + resolution: {integrity: sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==} + dependencies: + bl: 0.8.2 + deferred-leveldown: 0.2.0 + errno: 0.1.8 + prr: 0.0.0 + readable-stream: 1.0.34 + semver: 2.3.2 + xtend: 3.0.0 + dev: true + /lilconfig/2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -1722,6 +2267,10 @@ packages: p-locate: 4.1.0 dev: true + /lodash-es/4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: false @@ -1746,6 +2295,23 @@ packages: dev: true optional: true + /ltgt/2.2.1: + resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} + dev: true + + /magic-string/0.22.5: + resolution: {integrity: sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==} + dependencies: + vlq: 0.2.3 + dev: true + + /magic-string/0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + /matcher/3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -1754,6 +2320,14 @@ packages: dev: true optional: true + /md5.js/1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -1771,6 +2345,14 @@ packages: picomatch: 2.3.1 dev: true + /miller-rabin/4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + dev: true + /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -1798,12 +2380,27 @@ packages: engines: {node: '>=10'} dev: true + /minimalistic-assert/1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimalistic-crypto-utils/1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: true + /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true + /minimatch/5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true @@ -1874,6 +2471,19 @@ packages: engines: {node: '>= 6'} dev: true + /object-keys/0.2.0: + resolution: {integrity: sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==} + deprecated: Please update to the latest object-keys + dependencies: + foreach: 2.0.6 + indexof: 0.0.1 + is: 0.2.7 + dev: true + + /object-keys/0.4.0: + resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} + dev: true + /object-keys/1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -1884,6 +2494,10 @@ packages: resolution: {integrity: sha512-BaJGtCHp8XXxe8zFOnsbv93f4SRLb0W5P3okGJkLLKC9IM9aXvpKF4C8lFxivcS5eROlNkhOCnUOSk4tUnJnKQ==} dev: false + /octal/1.0.0: + resolution: {integrity: sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==} + dev: true + /once/1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -1928,6 +2542,16 @@ packages: callsites: 3.1.0 dev: false + /parse-asn1/5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + dev: true + /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -1956,6 +2580,17 @@ packages: engines: {node: '>=8'} dev: false + /pbkdf2/3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + /pend/1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true @@ -2066,6 +2701,14 @@ packages: prettier: 2.8.4 dev: true + /process-es6/0.11.6: + resolution: {integrity: sha512-GYBRQtL4v3wgigq10Pv58jmTbFXlIiTbSfgnNqZLY0ldUPqy1rRxDI5fCjoCpnM6TqmHQI8ydzTBXW86OYc0gA==} + dev: true + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -2083,6 +2726,25 @@ packages: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false + /prr/0.0.0: + resolution: {integrity: sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==} + dev: true + + /prr/1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + dev: true + + /public-encrypt/4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + /pump/3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: @@ -2099,6 +2761,19 @@ packages: engines: {node: '>=10'} dev: true + /randombytes/2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /randomfill/1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + /react-dom/18.2.0_react@18.2.0: resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -2154,6 +2829,45 @@ packages: pify: 2.3.0 dev: true + /readable-stream/1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: true + + /readable-stream/1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: true + + /readable-stream/2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream/3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -2197,6 +2911,13 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true + /ripemd160/2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: true + /roarr/2.15.4: resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} engines: {node: '>=8.0'} @@ -2210,8 +2931,34 @@ packages: dev: true optional: true - /rollup/3.19.1: - resolution: {integrity: sha512-lAbrdN7neYCg/8WaoWn/ckzCtz+jr70GFfYdlf50OF7387HTg+wiuiqJRFYawwSPpqfqDNYqK7smY/ks2iAudg==} + /rollup-plugin-node-builtins/2.1.2: + resolution: {integrity: sha512-bxdnJw8jIivr2yEyt8IZSGqZkygIJOGAWypXvHXnwKAbUcN4Q/dGTx7K0oAJryC/m6aq6tKutltSeXtuogU6sw==} + dependencies: + browserify-fs: 1.0.0 + buffer-es6: 4.9.3 + crypto-browserify: 3.12.0 + process-es6: 0.11.6 + dev: true + + /rollup-plugin-node-globals/1.4.0: + resolution: {integrity: sha512-xRkB+W/m1KLIzPUmG0ofvR+CPNcvuCuNdjVBVS7ALKSxr3EDhnzNceGkGi1m8MToSli13AzKFYH4ie9w3I5L3g==} + dependencies: + acorn: 5.7.4 + buffer-es6: 4.9.3 + estree-walker: 0.5.2 + magic-string: 0.22.5 + process-es6: 0.11.6 + rollup-pluginutils: 2.8.2 + dev: true + + /rollup-pluginutils/2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + dependencies: + estree-walker: 0.6.1 + dev: true + + /rollup/3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -2224,6 +2971,18 @@ packages: queue-microtask: 1.2.3 dev: true + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + /scheduler/0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: @@ -2240,6 +2999,11 @@ packages: dev: true optional: true + /semver/2.3.2: + resolution: {integrity: sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==} + hasBin: true + dev: true + /semver/6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true @@ -2262,6 +3026,14 @@ packages: dev: true optional: true + /sha.js/2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2293,6 +3065,26 @@ packages: dev: true optional: true + /string-range/1.2.2: + resolution: {integrity: sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==} + dev: true + + /string_decoder/0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: true + + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /strip-final-newline/2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -2385,6 +3177,14 @@ packages: dev: true optional: true + /typedarray-to-buffer/1.0.4: + resolution: {integrity: sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==} + dev: true + + /typedarray/0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + /typescript/4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -2458,11 +3258,15 @@ packages: esbuild: 0.17.12 postcss: 8.4.21 resolve: 1.22.1 - rollup: 3.19.1 + rollup: 3.20.2 optionalDependencies: fsevents: 2.3.2 dev: true + /vlq/0.2.3: + resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} + dev: true + /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2475,6 +3279,31 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /xtend/2.0.6: + resolution: {integrity: sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==} + engines: {node: '>=0.4'} + dependencies: + is-object: 0.1.2 + object-keys: 0.2.0 + dev: true + + /xtend/2.1.2: + resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==} + engines: {node: '>=0.4'} + dependencies: + object-keys: 0.4.0 + dev: true + + /xtend/2.2.0: + resolution: {integrity: sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==} + engines: {node: '>=0.4'} + dev: true + + /xtend/3.0.0: + resolution: {integrity: sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==} + engines: {node: '>=0.4'} + dev: true + /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} diff --git a/preload/clipboard-event.ts b/preload/clipboard-event.ts new file mode 100644 index 0000000..90b611c --- /dev/null +++ b/preload/clipboard-event.ts @@ -0,0 +1,57 @@ +import { chmodSync } from 'fs'; +import { homedir } from 'os'; +import { join } from 'path'; +import { EventEmitter } from 'events'; +import { execFile, ChildProcess } from 'child_process'; +import { dirPath } from './config'; + +class ClipboardEventListener extends EventEmitter { + private child: ChildProcess | null; + private listening: boolean; + + constructor() { + super(); + this.child = null; + this.listening = false; + } + +filePath = join( dirPath, "utool_clipboard"); + + public async startListening() { + const platform = process.platform; + if (platform === "win32") { + this.child = execFile(this.filePath); + } else if (platform === "linux" || platform === "darwin") { + chmodSync(this.filePath, 0o755); + this.child = execFile(this.filePath); + } else { + throw new Error("Not yet supported"); + } + + this.child.stdout.on("data", (data) => { + if (data.trim() === "CLIPBOARD_CHANGE") { + this.emit("change"); + } + }); + + this.child.stdout.on("close", () => { + this.emit("close"); + this.listening = false; + }); + + this.child.stdout.on("exit", () => { + this.emit("exit"); + this.listening = false; + }); + + this.listening = true; + } + + public stopListening() { + const res = this.child.kill(); + this.removeAllListeners(); + return res; + } +} + +export default new ClipboardEventListener(); \ No newline at end of file diff --git a/preload/config.ts b/preload/config.ts new file mode 100644 index 0000000..b409a8e --- /dev/null +++ b/preload/config.ts @@ -0,0 +1,4 @@ +import { join } from 'path'; +import { homedir } from 'os'; + +export const dirPath = join(homedir(), '.utool_clipboard'); diff --git a/preload/preload.ts b/preload/preload.ts new file mode 100644 index 0000000..03d258d --- /dev/null +++ b/preload/preload.ts @@ -0,0 +1,33 @@ +import { clipboard } from "electron"; +import { + existsSync, + createWriteStream, + writeFileSync, + readFileSync, + unlinkSync, + mkdirSync, + +} from "fs"; +import * as path from "path"; +import { dirPath } from "./config"; +import clipboardListener from "./clipboard-event"; + +if (!existsSync(dirPath)) { + mkdirSync(dirPath, { recursive: true }); +} + +window.utoolClipboard = { + clipboardListener, + clipboard, + writeFileBase64Sync: (path, data) => { + const stream = createWriteStream(path); + stream.write(Buffer.from(data, "base64")); + stream.close(); + }, + existsSync, + writeFileSync, + readFileSync, + unlinkSync, + path, + dirPath, +}; diff --git a/public/clipboard-event/index.js b/public/clipboard-event/index.js deleted file mode 100644 index 8f2ea61..0000000 --- a/public/clipboard-event/index.js +++ /dev/null @@ -1,48 +0,0 @@ -const { chmodSync } = require("fs"); -const { homedir } = require("os"); -const { join } = require("path"); -const { EventEmitter } = require("events"); -const { execFile } = require("child_process"); -class ClipboardEventListener extends EventEmitter { - constructor() { - super(); - this.child = null; - this.listening = false; - } - - filePath = join(homedir(), "utool_clipboard"); - - async startListening() { - const { platform } = process; - if (platform === "win32") { - this.child = execFile(this.filePath); - } else if (platform === "linux" || platform === "darwin") { - chmodSync(this.filePath, 0o755); - this.child = execFile(this.filePath); - } else { - throw "Not yet supported"; - } - this.child.stdout.on("data", (data) => { - if (data.trim() === "CLIPBOARD_CHANGE") { - this.emit("change"); - } - }); - this.child.stdout.on("close", () => { - this.emit("close"); - this.listening = false; - }); - this.child.stdout.on("exit", () => { - this.emit("exit"); - this.listening = false; - }); - this.listening = true; - } - stopListening() { - const res = this.child.kill(); - this.removeAllListeners(); - this.listening = false; - return res; - } -} - -module.exports = new ClipboardEventListener(); diff --git a/public/plugin.json b/public/plugin.json index fd6876c..1cc4cea 100644 --- a/public/plugin.json +++ b/public/plugin.json @@ -1,6 +1,6 @@ { "main": "http://127.0.0.1:3000/", - "preload": "preload.js", + "preload": "./preload.js", "logo": "logo.png", "features": [ { diff --git a/public/preload.js b/public/preload.js deleted file mode 100644 index a12bb1a..0000000 --- a/public/preload.js +++ /dev/null @@ -1,14 +0,0 @@ -const { clipboard } = require("electron"); -const { existsSync, createWriteStream } = require("fs"); -const clipboardListener = require("./clipboard-event/index"); - -window.utoolClipboard = { - clipboardListener, - clipboard, - writeFileBase64Sync: (path, data) => { - const stream = createWriteStream(path); - stream.write(Buffer.from(data, "base64")); - stream.close(); - }, - existsSync, -}; diff --git a/src/components/ClipBoardItemContent.tsx b/src/components/ClipBoardItemContent.tsx index cfb4e56..12f2ce5 100644 --- a/src/components/ClipBoardItemContent.tsx +++ b/src/components/ClipBoardItemContent.tsx @@ -27,7 +27,6 @@ export const ClipBoardItemContent: FC<{ const ref = useRef(); useEffect(() => { - console.log("hhhhh", ref.current?.offsetHeight, ref.current?.scrollHeight); if (ref.current && ref.current.offsetHeight < ref.current.scrollHeight) { setShowMoreButtonShow(); } else { diff --git a/src/components/ClipBoardList.tsx b/src/components/ClipBoardList.tsx index b2685ab..08ce112 100644 --- a/src/components/ClipBoardList.tsx +++ b/src/components/ClipBoardList.tsx @@ -5,10 +5,9 @@ import { ListItemText, colors, } from "@mui/material"; -import { useDocumentVisibility } from "ahooks"; import { forwardRef, useImperativeHandle, useMemo, useRef } from "react"; import { ClipBoardData } from "../hooks/useClipboardData"; -import { ClipBoardRawData } from "../utils/clipboard"; +import { usePluginEnterFn } from "../hooks/usePluginLifecycle"; import { timeAgo } from "../utils/format"; import { ClipBoardItemContent } from "./ClipBoardItemContent"; @@ -27,8 +26,6 @@ export const ClipBoardList = forwardRef( ({ clipBoardList, activeIndexList, onActiveChange }, ref) => { const containerRef = useRef(null); - const documentVisibility = useDocumentVisibility(); - useImperativeHandle(ref, () => ({ container: containerRef.current, getActiveItem() { @@ -36,15 +33,17 @@ export const ClipBoardList = forwardRef( }, })); - const formatClipBoardList = useMemo(() => { - if (documentVisibility !== "visible") { - return clipBoardList as (ClipBoardRawData & { ago?: number })[]; - } - return clipBoardList.map((x) => ({ + const formatClipBoardList = + usePluginEnterFn(() => { + return clipBoardList.map((x) => ({ + ...x, + ago: timeAgo(x.timestamp!), + })); + }) ?? + clipBoardList.map((x) => ({ ...x, ago: timeAgo(x.timestamp!), })); - }, [clipBoardList, documentVisibility]); return ( void; existsSync: typeof existsSync; + writeFileSync: typeof writeFileSync; + readFileSync: typeof readFileSync; + unlinkSync: typeof unlinkSync; + + path: typeof path; + // ~/.utool_clipboard/xxx + dirPath: string; } interface Window { diff --git a/src/hooks/useClipboardData.ts b/src/hooks/useClipboardData.ts index 215cd2c..417f92e 100644 --- a/src/hooks/useClipboardData.ts +++ b/src/hooks/useClipboardData.ts @@ -7,6 +7,8 @@ import { readClipBoard, } from "../utils/clipboard"; import { downloadClipboard } from "../utils/downloadClipboard"; +import { usePluginOut } from "./usePluginLifecycle"; +import { useLocalDb } from "./useLocalDb"; export type ClipBoardData = ClipBoardRawData; @@ -17,13 +19,12 @@ interface params { const MAX_SIZE = 100; export const useClipboardData = ({ filter }: params = {}) => { - // TODO: 本地持久化,使用写本地文件替代 - // const [clipBoardList, setClipBoardList] = useState([]); - const [clipBoardList, setClipBoardList] = useLocalStorageState< - ClipBoardData[] - >("clipBoardData", { - defaultValue: [], - }); + const [clipBoardList, setClipBoardList] = useLocalDb( + "clipBoardData", + { + defaultValue: [], + } + ); const [filterText, setFilterText] = useState(""); @@ -32,7 +33,6 @@ export const useClipboardData = ({ filter }: params = {}) => { window.utoolClipboard.clipboardListener.startListening(); window.utoolClipboard.clipboardListener.on("change", async () => { const item = await readClipBoard(); - console.log("Data from clipboard", item); if (item) { setClipBoardList((pre = []) => [ @@ -70,12 +70,24 @@ export const useClipboardData = ({ filter }: params = {}) => { [clipBoardList, filter, filterText] ); + usePluginOut((processExit) => { + if (processExit) { + window.utoolClipboard.unlinkSync( + window.utoolClipboard.clipboardListener.filePath + ); + } + }); + const clearAll = useMemoizedFn(() => setClipBoardList([])); - const clearOne = useMemoizedFn((timestamp: number) => setClipBoardList(pre => pre?.filter(x => x.timestamp !== timestamp) ?? [])) + const clearOne = useMemoizedFn((timestamp: number) => + setClipBoardList( + (pre) => pre?.filter((x) => x.timestamp !== timestamp) ?? [] + ) + ); return { clipBoardList: filteredList, clearAll, - clearOne + clearOne, }; }; diff --git a/src/hooks/useLocalDb.ts b/src/hooks/useLocalDb.ts new file mode 100644 index 0000000..f3ca4df --- /dev/null +++ b/src/hooks/useLocalDb.ts @@ -0,0 +1,65 @@ +import { useMemo, useState } from "react"; +import { useMemoizedFn } from "ahooks"; + +interface Options { + defaultValue?: T; + serializer?: (value: T) => string; + deserializer?: (value: string) => T; +} + +const defaultOptions: Options = { + defaultValue: undefined, + serializer: (v) => JSON.stringify(v), + deserializer: (v) => JSON.parse(v), +}; + +const { readFileSync, writeFileSync, existsSync } = window.utoolClipboard; + +export const useLocalDb = ( + key: string, + options: Options = {} +): [ + dbValue: T, + setDbValue: (value: T | ((previousState?: T) => T)) => void +] => { + options = { + ...defaultOptions, + ...options, + }; + + const dbPath = useMemo(() => { + return window.utoolClipboard.path.join( + window.utoolClipboard.dirPath, + `${key}.json` + ); + }, [key, window.utoolClipboard.dirPath]); + + const [state, setState] = useState(() => { + if (!existsSync(dbPath)) { + if (options.defaultValue) { + writeFileSync(dbPath, options.serializer!(options.defaultValue), { + flag: "wx", + }); + } + + return options.defaultValue as T; + } else { + const v = options.deserializer!( + readFileSync(dbPath, { encoding: "utf-8" }) + ); + return v; + } + }); + + const setDbValue = useMemoizedFn((v: T | ((previousState?: T) => T)) => { + writeFileSync( + dbPath, + options.serializer!( + typeof v === "function" ? (v as (previousState?: T) => T)(state) : v + ) + ); + setState(v); + }); + + return [state, setDbValue]; +}; diff --git a/src/hooks/usePluginLifecycle.ts b/src/hooks/usePluginLifecycle.ts new file mode 100644 index 0000000..46d73cb --- /dev/null +++ b/src/hooks/usePluginLifecycle.ts @@ -0,0 +1,42 @@ +import { useEffect, useRef, useState } from "react"; + +export const usePluginEnter: UToolsApi["onPluginEnter"] = (callback) => { + const fnRef = useRef(callback); + + fnRef.current = callback; + + useEffect(() => { + utools.onPluginEnter(fnRef.current); + }, []); +}; + +export const usePluginOut: UToolsApi["onPluginOut"] = (callback) => { + const fnRef = useRef(callback); + + fnRef.current = callback; + + useEffect(() => { + utools.onPluginOut(fnRef.current) + }, []) +} + +type PluginEnterFn = (...args: Parameters[0]>) => T + + +export const usePluginEnterFn= (callback: PluginEnterFn): T | undefined => { + const [retValue, setRetValue] = useState() + const fnRef = useRef>(); + + fnRef.current = function (...args) { + const ret = callback.call(this, ...args) + setRetValue(ret) + return ret + } + + useEffect(() => { + utools.onPluginEnter(fnRef.current!); + }, []); + + return retValue + }; + \ No newline at end of file diff --git a/src/utils/downloadClipboard.ts b/src/utils/downloadClipboard.ts index ae1527d..7fd861b 100644 --- a/src/utils/downloadClipboard.ts +++ b/src/utils/downloadClipboard.ts @@ -1,8 +1,6 @@ -import { arrayBufferToBase64 } from "./arraybuffer"; -import { darwin, win32, linux} from '../node-clipboard' +import { darwin } from '../node-clipboard' import { wait } from "./timer"; - export const downloadClipboard = async () => { if ( window.utoolClipboard.existsSync( diff --git a/tsconfig.json b/tsconfig.json index f5edb1b..c487945 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,11 @@ "compilerOptions": { "target": "ESNext", "useDefineForClassFields": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], "allowJs": false, "skipLibCheck": true, "esModuleInterop": false, @@ -16,6 +20,16 @@ "noEmit": true, "jsx": "react-jsx" }, - "include": ["src", "node_modules/utools-api-types"], - "references": [{ "path": "./tsconfig.node.json" }] -} + "include": [ + "src", + "node_modules/utools-api-types" + ], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.preload.json" + } + ] +} \ No newline at end of file diff --git a/tsconfig.preload.json b/tsconfig.preload.json new file mode 100644 index 0000000..d37babc --- /dev/null +++ b/tsconfig.preload.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "composite": true, + "module": "CommonJS", + "target": "ESNext", + "moduleResolution": "Node" + }, + "include": [ + "preload", + "src/global.d.ts" + ] +} \ No newline at end of file diff --git a/utoolPlugin.ts b/utoolPlugin.ts index 458c61b..f6fd4cc 100644 --- a/utoolPlugin.ts +++ b/utoolPlugin.ts @@ -1,17 +1,98 @@ -import { PluginOption } from "vite"; -import { readJSONSync, writeJsonSync, writeJSONSync } from "fs-extra"; -import path from "path"; +import { PluginOption, ResolvedConfig } from "vite"; +import { + readJSONSync, + writeJsonSync, + ensureDirSync, + copyFileSync, +} from "fs-extra"; +import path, { join, resolve } from "path"; +import { + InputOptions, + OutputOptions, + rollup, + RollupBuild, + watch, +} from "rollup"; +import globals from "rollup-plugin-node-globals"; +import typescript from "@rollup/plugin-typescript"; +import { nodeResolve } from "@rollup/plugin-node-resolve"; +import commonjs from "@rollup/plugin-commonjs"; + +async function bundleUtoolPreload(isDevelopment = false) { + const inputOptions: InputOptions = { + input: path.join(__dirname, "./preload/preload.ts"), + plugins: [ + // builtins(), + globals(), + typescript({ + // tsconfig: "tsconfig.preload.json" + tsconfig: false, + target: "ESNext", + importHelpers: false, + include: ["preload/**/*.ts", "src/global.d.ts"], + }), + nodeResolve(), + commonjs(), + ], + external: ["electron"], + }; + + const outputOptions: OutputOptions = { + format: "commonjs", + file: path.join(__dirname, "./dist", "preload.js"), + }; + + if (isDevelopment) { + watch({ + ...inputOptions, + output: outputOptions, + }).on("event", (event) => { + if (event.code === "START") { + console.log("Starting preload build..."); + } else if (event.code === "BUNDLE_END") { + console.log(`Preload build complete in ${event.duration}ms.`); + } else if (event.code === "ERROR") { + console.error("Error during preload build:", event.error); + } + }); + } else { + let bundle: RollupBuild; + bundle = await rollup(inputOptions); + + await bundle.write(outputOptions); + } +} export default function utoolPlugin(): PluginOption { + let config: ResolvedConfig; return { name: "utool-plugin", - writeBundle(options) { + + async writeBundle(options) { const outputDir = options.dir || path.dirname(options.file); const pluginJsonPath = path.join(outputDir, "./plugin.json"); const plugin = readJSONSync(pluginJsonPath); plugin.main = "./index.html"; + plugin.preload = "./preload.js"; writeJsonSync(pluginJsonPath, plugin); + await bundleUtoolPreload(false); + }, + configResolved(resolvedConfig) { + config = resolvedConfig; + }, + async buildStart(options) { + if (config.command === "serve") { + bundleUtoolPreload(true); + const files = ["logo.png", "plugin.json"]; + ensureDirSync(join(__dirname, "./dist")); + files.forEach((file) => { + copyFileSync( + join(__dirname, `./public/${file}`), + join(__dirname, `./dist/${file}`) + ); + }); + } }, }; }