From 1b86cbbee1ee74e46ed003e50033ca230a7d8881 Mon Sep 17 00:00:00 2001 From: qier222 Date: Wed, 30 Mar 2022 00:53:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8sqlite3=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2realm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 5 +- pnpm-lock.yaml | 588 ++------------------- scripts/build.main.mjs | 1 + src/main/cache.ts | 140 +++-- src/main/database.ts | 6 - src/main/db.ts | 88 +++ src/main/index.ts | 1 + src/main/preload.ts | 2 +- src/main/sentry.ts | 2 +- src/main/server.ts | 28 +- src/renderer/hooks/useAlbum.ts | 14 +- src/renderer/hooks/useArtist.ts | 14 +- src/renderer/hooks/useArtistAlbums.ts | 14 +- src/renderer/hooks/usePlaylist.ts | 14 +- src/renderer/hooks/useTracks.ts | 14 +- src/renderer/hooks/useUser.ts | 8 +- src/renderer/hooks/useUserLikedSongsIDs.ts | 14 +- src/renderer/hooks/useUserPlaylists.ts | 14 +- src/renderer/main.tsx | 2 +- src/renderer/pages/Home.tsx | 14 +- 20 files changed, 292 insertions(+), 691 deletions(-) create mode 100644 src/main/db.ts diff --git a/package.json b/package.json index fb0211c..d6605b6 100644 --- a/package.json +++ b/package.json @@ -27,15 +27,16 @@ "@sentry/node": "^6.19.2", "@sentry/tracing": "^6.19.2", "NeteaseCloudMusicApi": "^4.5.8", + "better-sqlite3": "^7.5.0", "change-case": "^4.1.2", "cookie-parser": "^1.4.6", "electron-log": "^4.4.6", "electron-store": "^8.0.1", - "express": "^4.17.3", - "realm": "^10.13.0" + "express": "^4.17.3" }, "devDependencies": { "@sentry/react": "^6.19.2", + "@types/better-sqlite3": "^7.5.0", "@types/cookie-parser": "^1.4.2", "@types/express": "^4.17.13", "@types/express-fileupload": "^1.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dab5f32..126bddd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,7 @@ specifiers: '@sentry/node': ^6.19.2 '@sentry/react': ^6.19.2 '@sentry/tracing': ^6.19.2 + '@types/better-sqlite3': ^7.5.0 '@types/cookie-parser': ^1.4.2 '@types/express': ^4.17.13 '@types/express-fileupload': ^1.2.2 @@ -18,9 +19,9 @@ specifiers: '@typescript-eslint/parser': ^5.15.0 '@vitejs/plugin-react': ^1.2.0 NeteaseCloudMusicApi: ^4.5.8 - ahooks: ^3.1.13 autoprefixer: ^10.4.4 axios: ^0.26.1 + better-sqlite3: ^7.5.0 change-case: ^4.1.2 classnames: ^2.3.1 color.js: ^1.2.0 @@ -61,7 +62,6 @@ specifiers: react-query: ^3.34.16 react-router-dom: ^6.2.2 react-use: ^17.3.2 - realm: ^10.13.0 rollup: ^2.70.1 rollup-plugin-visualizer: ^5.6.0 sass: ^1.49.9 @@ -79,15 +79,16 @@ dependencies: '@sentry/node': 6.19.2 '@sentry/tracing': 6.19.2 NeteaseCloudMusicApi: 4.5.8 + better-sqlite3: 7.5.0 change-case: 4.1.2 cookie-parser: 1.4.6 electron-log: 4.4.6 electron-store: 8.0.1 express: 4.17.3 - realm: 10.13.0 devDependencies: '@sentry/react': 6.19.2_react@17.0.2 + '@types/better-sqlite3': 7.5.0 '@types/cookie-parser': 1.4.2 '@types/express': 4.17.13 '@types/express-fileupload': 1.2.2 @@ -101,7 +102,6 @@ devDependencies: '@typescript-eslint/eslint-plugin': 5.15.0_f2c49ce7d0e93ebcfdb4b7d25b131b28 '@typescript-eslint/parser': 5.15.0_eslint@8.11.0+typescript@4.6.2 '@vitejs/plugin-react': 1.2.0 - ahooks: 3.1.13_react@17.0.2 autoprefixer: 10.4.4_postcss@8.4.12 axios: 0.26.1 classnames: 2.3.1 @@ -574,10 +574,6 @@ packages: fastq: 1.13.0 dev: true - /@realm.io/common/0.1.1: - resolution: {integrity: sha512-sXc7Ndhh39O9bm7/e0eeAx8keDBO83yoG7WfH04o6PqwVaIwm4T1uT0bhTO6OizP6ojhugZlVSu9HzgUVRE1Ag==} - dev: false - /@rollup/pluginutils/4.2.0: resolution: {integrity: sha512-2WUyJNRkyH5p487pGnn4tWAsxhEFKN/pT8CMgHshd5H+IXkOnKvKZwsz5ZWz+YCXkleZRAU5kwbfgF8CPfDRqA==} engines: {node: '>= 8.0.0'} @@ -719,6 +715,12 @@ packages: engines: {node: '>=10.13.0'} dev: true + /@types/better-sqlite3/7.5.0: + resolution: {integrity: sha512-G9ZbMjydW2yj1AgiPlUtdgF3a1qNpLJLudc9ynJCeJByS3XFWpmT9LT+VSHrKHFbxb31CvtYwetLTOvG9zdxdg==} + dependencies: + '@types/node': 14.18.10 + dev: true + /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: @@ -1078,13 +1080,6 @@ packages: - supports-color dev: false - /abort-controller/3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: false - /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -1130,13 +1125,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - /agent-base/4.3.0: - resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} - engines: {node: '>= 4.0.0'} - dependencies: - es6-promisify: 5.0.0 - dev: false - /agent-base/6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -1145,27 +1133,6 @@ packages: transitivePeerDependencies: - supports-color - /ahooks-v3-count/1.0.0: - resolution: {integrity: sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ==} - dev: true - - /ahooks/3.1.13_react@17.0.2: - resolution: {integrity: sha512-ZWwWRhikXCWuR+X+LxXK8sWu2KPU7nh7UfaTTB93NhmoeytzN8VODRfVjq8LbT2ow5Q7PuG13143OcW9nN1vBg==} - engines: {node: '>=8.0.0'} - peerDependencies: - react: ^16.8.6 || ^17.0 - dependencies: - '@types/js-cookie': 2.2.7 - ahooks-v3-count: 1.0.0 - dayjs: 1.11.0 - intersection-observer: 0.12.0 - js-cookie: 2.2.1 - lodash: 4.17.21 - react: 17.0.2 - resize-observer-polyfill: 1.5.1 - screenfull: 5.2.0 - dev: true - /ajv-formats/2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependenciesMeta: @@ -1190,6 +1157,7 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 + dev: true /ajv/8.10.0: resolution: {integrity: sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==} @@ -1316,11 +1284,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /array-back/3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} - dev: false - /array-flatten/1.1.1: resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} dev: false @@ -1355,10 +1318,6 @@ packages: es-abstract: 1.19.1 dev: true - /asap/2.0.6: - resolution: {integrity: sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=} - dev: false - /asar/3.1.0: resolution: {integrity: sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ==} engines: {node: '>=10.12.0'} @@ -1372,15 +1331,11 @@ packages: '@types/glob': 7.2.0 dev: true - /asn1/0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - dependencies: - safer-buffer: 2.1.2 - dev: false - /assert-plus/1.0.0: resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=} engines: {node: '>=0.8'} + dev: true + optional: true /assign-symbols/1.0.0: resolution: {integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=} @@ -1409,12 +1364,9 @@ packages: resolution: {integrity: sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=} dev: true - /async/1.5.2: - resolution: {integrity: sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=} - dev: false - /asynckit/0.4.0: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + dev: true /at-least-node/1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -1448,14 +1400,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /aws-sign2/0.7.0: - resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} - dev: false - - /aws4/1.11.0: - resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} - dev: false - /axios/0.24.0: resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} dependencies: @@ -1482,6 +1426,7 @@ packages: /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true /base/0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} @@ -1499,10 +1444,12 @@ packages: /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /bcrypt-pbkdf/1.0.2: - resolution: {integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=} + /better-sqlite3/7.5.0: + resolution: {integrity: sha512-6FdG9DoytYGDhLW7VWW1vxjEz7xHkqK6LnaUQYA8d6GHNgZhu9PFX2xwKEEnSBRoT1J4PjTUPeg217ShxNmuPg==} + requiresBuild: true dependencies: - tweetnacl: 0.14.5 + bindings: 1.5.0 + prebuild-install: 7.0.1 dev: false /big-integer/1.6.51: @@ -1606,6 +1553,7 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + dev: true /braces/2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} @@ -1667,13 +1615,6 @@ packages: picocolors: 1.0.0 dev: true - /bson/4.4.1: - resolution: {integrity: sha512-Uu4OCZa0jouQJCKOk1EmmyqtdWAP5HVLru4lQxTwzJzxT+sJ13lVpEZU/MATDxtHiekWMAL84oQY3Xn1LpJVSg==} - engines: {node: '>=6.9.0'} - dependencies: - buffer: 5.7.1 - dev: false - /buffer-alloc-unsafe/1.1.0: resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} dev: true @@ -1700,6 +1641,7 @@ packages: /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true /buffer-indexof-polyfill/1.0.2: resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} @@ -1802,6 +1744,7 @@ packages: dependencies: function-bind: 1.1.1 get-intrinsic: 1.1.1 + dev: true /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -1841,14 +1784,6 @@ packages: upper-case-first: 2.0.2 dev: false - /caseless/0.11.0: - resolution: {integrity: sha1-cVuW6phBWTzDMGeSP17GDr2k99c=} - dev: false - - /caseless/0.12.0: - resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=} - dev: false - /chainsaw/0.1.0: resolution: {integrity: sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=} dependencies: @@ -1927,11 +1862,6 @@ packages: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false - /chownr/2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: false - /chromium-pickle-js/0.2.0: resolution: {integrity: sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=} dev: true @@ -1944,15 +1874,6 @@ packages: resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} dev: true - /clang-format/1.6.0: - resolution: {integrity: sha512-W3/L7fWkA8DoLkz9UGjrRnNi+J5a5TuS2HDLqk6WsicpOzb66MBu4eY/EcXhicHriVnAXWQVyk5/VeHWY6w4ow==} - hasBin: true - dependencies: - async: 1.5.2 - glob: 7.2.0 - resolve: 1.22.0 - dev: false - /class-utils/0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} @@ -2073,16 +1994,7 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - - /command-line-args/5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} - dependencies: - array-back: 3.1.0 - find-replace: 3.0.0 - lodash.camelcase: 4.3.0 - typical: 4.0.0 - dev: false + dev: true /commander/2.9.0: resolution: {integrity: sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=} @@ -2112,6 +2024,7 @@ packages: /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + dev: true /concat-stream/1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} @@ -2121,6 +2034,7 @@ packages: inherits: 2.0.4 readable-stream: 2.3.7 typedarray: 0.0.6 + dev: true /concurrently/7.0.0: resolution: {integrity: sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==} @@ -2237,6 +2151,8 @@ packages: /core-util-is/1.0.2: resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} + dev: true + optional: true /core-util-is/1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -2339,13 +2255,6 @@ packages: resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} dev: true - /dashdash/1.14.1: - resolution: {integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - dev: false - /data-uri-to-buffer/3.0.1: resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} engines: {node: '>= 6'} @@ -2372,12 +2281,6 @@ packages: dependencies: ms: 2.0.0 - /debug/3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - dependencies: - ms: 2.1.3 - dev: false - /debug/4.3.3: resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} engines: {node: '>=6.0'} @@ -2419,11 +2322,6 @@ packages: /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - /deepmerge/2.1.0: - resolution: {integrity: sha512-Q89Z26KAfA3lpPGhbF6XMfYAm3jIV3avViy6KOJ2JLzFbeWHOvPQUu5aSJIWXap3gDZC2y1eF5HXEPI2wGqgvw==} - engines: {node: '>=0.10.0'} - dev: false - /defaults/1.0.3: resolution: {integrity: sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=} dependencies: @@ -2485,6 +2383,7 @@ packages: /delayed-stream/1.0.0: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} engines: {node: '>=0.4.0'} + dev: true /delegates/1.0.0: resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} @@ -2696,13 +2595,6 @@ packages: resolution: {integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=} dev: true - /ecc-jsbn/0.1.2: - resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=} - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - dev: false - /ee-first/1.1.1: resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} dev: false @@ -2888,16 +2780,6 @@ packages: dev: true optional: true - /es6-promise/4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: false - - /es6-promisify/5.0.0: - resolution: {integrity: sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=} - dependencies: - es6-promise: 4.2.8 - dev: false - /esbuild-android-64/0.14.28: resolution: {integrity: sha512-A52C3zq+9tNwCqZ+4kVLBxnk/WnrYM8P2+QNvNE9B6d2OVPs214lp3g6UyO+dKDhUdefhfPCuwkP8j2A/+szNA==} engines: {node: '>=12'} @@ -3304,11 +3186,6 @@ packages: resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} engines: {node: '>= 0.6'} - /event-target-shim/5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false - /expand-brackets/2.1.4: resolution: {integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI=} engines: {node: '>=0.10.0'} @@ -3384,10 +3261,6 @@ packages: is-extendable: 1.0.1 dev: true - /extend/3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false - /extglob/2.0.4: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} @@ -3412,14 +3285,11 @@ packages: yauzl: 2.10.0 dev: true - /extsprintf/1.3.0: - resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=} - engines: {'0': node >=0.6.0} - dev: false - /extsprintf/1.4.1: resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} engines: {'0': node >=0.6.0} + dev: true + optional: true /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3445,6 +3315,7 @@ packages: /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true /fast-levenshtein/2.0.6: resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} @@ -3529,13 +3400,6 @@ packages: unpipe: 1.0.0 dev: false - /find-replace/3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} - dependencies: - array-back: 3.1.0 - dev: false - /find-up/3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -3576,19 +3440,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /forever-agent/0.6.1: - resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} - dev: false - - /form-data/2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.34 - dev: false - /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -3632,14 +3483,6 @@ packages: universalify: 2.0.0 dev: true - /fs-extra/4.0.3: - resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} - dependencies: - graceful-fs: 4.2.9 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: false - /fs-extra/8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -3658,15 +3501,9 @@ packages: universalify: 2.0.0 dev: true - /fs-minipass/2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.1.6 - dev: false - /fs.realpath/1.0.0: resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + dev: true /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} @@ -3696,6 +3533,7 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true /functional-red-black-tree/1.0.1: resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} @@ -3729,6 +3567,7 @@ packages: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 + dev: true /get-stream/4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} @@ -3771,12 +3610,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /getpass/0.1.7: - resolution: {integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=} - dependencies: - assert-plus: 1.0.0 - dev: false - /github-from-package/0.0.0: resolution: {integrity: sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=} dev: false @@ -3804,6 +3637,7 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true /global-agent/3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} @@ -3902,20 +3736,6 @@ packages: resolution: {integrity: sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=} dev: true - /har-schema/2.0.0: - resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=} - engines: {node: '>=4'} - dev: false - - /har-validator/5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - dev: false - /has-ansi/2.0.0: resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} engines: {node: '>=0.10.0'} @@ -3945,6 +3765,7 @@ packages: /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + dev: true /has-tostringtag/1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} @@ -3998,6 +3819,7 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 + dev: true /he/1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} @@ -4045,14 +3867,6 @@ packages: readable-stream: 3.6.0 dev: true - /http-basic/2.5.1: - resolution: {integrity: sha1-jORHvbW2xXf4pj4/p4BW7Eu02/s=} - dependencies: - caseless: 0.11.0 - concat-stream: 1.6.2 - http-response-object: 1.1.0 - dev: false - /http-cache-semantics/4.1.0: resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} dev: true @@ -4090,27 +3904,6 @@ packages: - supports-color dev: true - /http-response-object/1.1.0: - resolution: {integrity: sha1-p8TnWq6C87tJBOT0P2FWc7TVGMM=} - dev: false - - /http-signature/1.2.0: - resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=} - engines: {node: '>=0.8', npm: '>=1.3.7'} - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.17.0 - dev: false - - /https-proxy-agent/2.2.4: - resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==} - engines: {node: '>= 4.5.0'} - dependencies: - agent-base: 4.3.0 - debug: 3.2.7 - dev: false - /https-proxy-agent/5.0.0: resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} engines: {node: '>= 6'} @@ -4193,6 +3986,7 @@ packages: dependencies: once: 1.4.0 wrappy: 1.0.2 + dev: true /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -4220,10 +4014,6 @@ packages: side-channel: 1.0.4 dev: true - /intersection-observer/0.12.0: - resolution: {integrity: sha512-2Vkz8z46Dv401zTWudDGwO7KiGHNDkMv417T5ItcNYfmvHR/1qCTVBO9vwH8zZmQ0WkA/1ARwpysR9bsnop4NQ==} - dev: true - /ip/1.1.5: resolution: {integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=} dev: false @@ -4298,6 +4088,7 @@ packages: resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} dependencies: has: 1.0.3 + dev: true /is-data-descriptor/0.1.4: resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} @@ -4470,6 +4261,7 @@ packages: /is-typedarray/1.0.0: resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} + dev: true /is-unicode-supported/1.2.0: resolution: {integrity: sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==} @@ -4533,10 +4325,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /isstream/0.1.2: - resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=} - dev: false - /jake/10.8.2: resolution: {integrity: sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==} hasBin: true @@ -4576,6 +4364,7 @@ packages: /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true /js-yaml/4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} @@ -4584,10 +4373,6 @@ packages: argparse: 2.0.1 dev: true - /jsbn/0.1.1: - resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} - dev: false - /jsesc/2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -4604,6 +4389,7 @@ packages: /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true /json-schema-traverse/1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -4613,16 +4399,14 @@ packages: resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} dev: false - /json-schema/0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - dev: false - /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} dev: true /json-stringify-safe/5.0.1: resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=} + dev: true + optional: true /json5/1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} @@ -4652,16 +4436,6 @@ packages: graceful-fs: 4.2.9 dev: true - /jsprim/1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - dev: false - /jsx-ast-utils/3.2.1: resolution: {integrity: sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==} engines: {node: '>=4.0'} @@ -4787,10 +4561,6 @@ packages: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} dev: true - /lodash.camelcase/4.3.0: - resolution: {integrity: sha1-soqmKIorn8ZRA1x3EfZathkDMaY=} - dev: false - /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -4812,6 +4582,7 @@ packages: hasBin: true dependencies: js-tokens: 4.0.0 + dev: true /lower-case/2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -5003,25 +4774,11 @@ packages: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 + dev: true /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} - /minipass/3.1.6: - resolution: {integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: false - - /minizlib/2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.1.6 - yallist: 4.0.0 - dev: false - /mixin-deep/1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} @@ -5041,12 +4798,6 @@ packages: minimist: 1.2.6 dev: true - /mkdirp/1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: false - /ms/2.0.0: resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} @@ -5155,26 +4906,6 @@ packages: dev: true optional: true - /node-addon-api/4.2.0: - resolution: {integrity: sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q==} - dev: false - - /node-fetch/2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - - /node-machine-id/1.1.12: - resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - dev: false - /node-releases/2.0.2: resolution: {integrity: sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==} dev: true @@ -5223,10 +4954,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /oauth-sign/0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - dev: false - /object-assign/4.1.1: resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} engines: {node: '>=0.10.0'} @@ -5247,6 +4974,7 @@ packages: /object-inspect/1.12.0: resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} + dev: true /object-keys/1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -5509,6 +5237,7 @@ packages: /path-is-absolute/1.0.1: resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} engines: {node: '>=0.10.0'} + dev: true /path-key/3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} @@ -5517,6 +5246,7 @@ packages: /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true /path-to-regexp/0.1.7: resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=} @@ -5539,10 +5269,6 @@ packages: resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} dev: true - /performance-now/2.1.0: - resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} - dev: false - /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -5745,12 +5471,7 @@ packages: /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - - /promise/7.3.1: - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} - dependencies: - asap: 2.0.6 - dev: false + dev: true /prop-types/15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -5758,6 +5479,7 @@ packages: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 + dev: true /proto-list/1.2.4: resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} @@ -5776,10 +5498,6 @@ packages: resolution: {integrity: sha512-wapJ3h/w8fRSyPEG0y2WMV+tf9xwvj3nxM6aHVuPEOwKs/t5xLSKZb44ubNTiqq2T6lmEMHEWGMTaU2L6ddaFA==} dev: true - /psl/1.8.0: - resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} - dev: false - /pump/3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: @@ -5807,18 +5525,6 @@ packages: pngjs: 5.0.0 yargs: 15.4.1 - /qs/6.10.3: - resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: false - - /qs/6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} - dev: false - /qs/6.9.7: resolution: {integrity: sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==} engines: {node: '>=0.6'} @@ -5832,10 +5538,6 @@ packages: strict-uri-encode: 1.1.0 dev: true - /querystringify/2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -5896,6 +5598,7 @@ packages: /react-is/16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true /react-query/3.34.16_react-dom@17.0.2+react@17.0.2: resolution: {integrity: sha512-7FvBvjgEM4YQ8nPfmAr+lJfbW95uyW/TVjFoi2GwCkF33/S8ajx45tuPHPFGWs4qYwPy1mzwxD4IQfpUDrefNQ==} @@ -6036,50 +5739,6 @@ packages: picomatch: 2.3.1 dev: true - /realm-network-transport/0.7.1: - resolution: {integrity: sha512-ZKGJVk6hzVeLE/cme9H4MyVnfpPlCTMheQdnMHWkLMhvNUqgyPFkgSCB+B5IsnGns2l5g2rmKeTNPoUFHi+Khw==} - dependencies: - abort-controller: 3.0.0 - node-fetch: 2.6.7 - transitivePeerDependencies: - - encoding - dev: false - - /realm/10.13.0: - resolution: {integrity: sha512-MgvGTXNfMTzl6BsAk53espuEjIyoneXeoZ1Yk335AjzlQ36RvVCli8siOn/Ub8jCIOnkQoHi/EJsSnM/Nw1zzQ==} - engines: {node: '>=10', npm: '>=7'} - requiresBuild: true - peerDependencies: - react-native: '>=0.60' - peerDependenciesMeta: - react-native: - optional: true - dependencies: - '@realm.io/common': 0.1.1 - bindings: 1.5.0 - bson: 4.4.1 - clang-format: 1.6.0 - command-line-args: 5.2.1 - deepmerge: 2.1.0 - fs-extra: 4.0.3 - https-proxy-agent: 2.2.4 - ini: 1.3.8 - node-addon-api: 4.2.0 - node-fetch: 2.6.7 - node-machine-id: 1.1.12 - prebuild-install: 7.0.1 - progress: 2.0.3 - prop-types: 15.8.1 - realm-network-transport: 0.7.1 - request: 2.88.2 - stream-counter: 1.0.0 - sync-request: 3.0.1 - tar: 6.1.11 - url-parse: 1.5.10 - transitivePeerDependencies: - - encoding - dev: false - /regenerator-runtime/0.13.9: resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} dev: true @@ -6133,33 +5792,6 @@ packages: engines: {node: '>=0.10'} dev: true - /request/2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - dependencies: - aws-sign2: 0.7.0 - aws4: 1.11.0 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.34 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.3 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - dev: false - /require-directory/2.1.1: resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} engines: {node: '>=0.10.0'} @@ -6172,10 +5804,6 @@ packages: /require-main-filename/2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - /requires-port/1.0.0: - resolution: {integrity: sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=} - dev: false - /resize-observer-polyfill/1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} dev: true @@ -6197,6 +5825,7 @@ packages: is-core-module: 2.8.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: true /resolve/2.0.0-next.3: resolution: {integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==} @@ -6473,6 +6102,7 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.1.1 object-inspect: 1.12.0 + dev: true /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -6631,22 +6261,6 @@ packages: dev: true optional: true - /sshpk/1.17.0: - resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - dev: false - /stable/0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} dev: true @@ -6694,11 +6308,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /stream-counter/1.0.0: - resolution: {integrity: sha1-kc8lac5NxQYf6816yyY5SloRR1E=} - engines: {node: '>=0.10.20'} - dev: false - /streamsearch/0.1.2: resolution: {integrity: sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=} engines: {node: '>=0.8.0'} @@ -6845,6 +6454,7 @@ packages: /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + dev: true /svg-baker/1.7.0: resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} @@ -6878,14 +6488,6 @@ packages: stable: 0.1.8 dev: true - /sync-request/3.0.1: - resolution: {integrity: sha1-yqEjWq+Im6UBB2oYNMQ2gwqC+3M=} - dependencies: - concat-stream: 1.6.2 - http-response-object: 1.1.0 - then-request: 2.2.0 - dev: false - /tailwindcss/3.0.23_autoprefixer@10.4.4: resolution: {integrity: sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==} engines: {node: '>=12.13.0'} @@ -6939,18 +6541,6 @@ packages: readable-stream: 3.6.0 dev: false - /tar/6.1.11: - resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} - engines: {node: '>= 10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 3.1.6 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: false - /temp-file/3.4.0: resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} dependencies: @@ -6962,17 +6552,6 @@ packages: resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} dev: true - /then-request/2.2.0: - resolution: {integrity: sha1-ZnizL6DKIY/laZgbvYhxtZQGDYE=} - dependencies: - caseless: 0.11.0 - concat-stream: 1.6.2 - http-basic: 2.5.1 - http-response-object: 1.1.0 - promise: 7.3.1 - qs: 6.10.3 - dev: false - /throttle-debounce/3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} engines: {node: '>=10'} @@ -7049,18 +6628,6 @@ packages: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - /tough-cookie/2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - dependencies: - psl: 1.8.0 - punycode: 2.1.1 - dev: false - - /tr46/0.0.3: - resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} - dev: false - /traverse/0.3.9: resolution: {integrity: sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=} dev: true @@ -7110,10 +6677,6 @@ packages: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - /tweetnacl/0.14.5: - resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=} - dev: false - /type-check/0.3.2: resolution: {integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=} engines: {node: '>= 0.8.0'} @@ -7160,6 +6723,7 @@ packages: /typedarray/0.0.6: resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} + dev: true /typescript/4.6.2: resolution: {integrity: sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==} @@ -7167,11 +6731,6 @@ packages: hasBin: true dev: true - /typical/4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} - dev: false - /unbox-primitive/1.0.1: resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} dependencies: @@ -7345,13 +6904,6 @@ packages: prepend-http: 2.0.0 dev: true - /url-parse/1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} @@ -7369,12 +6921,6 @@ packages: engines: {node: '>= 0.4.0'} dev: false - /uuid/3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: false - /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true @@ -7421,15 +6967,6 @@ packages: resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} engines: {node: '>= 0.8'} - /verror/1.10.0: - resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.1 - dev: false - /verror/1.10.1: resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} engines: {node: '>=0.6.0'} @@ -7516,21 +7053,10 @@ packages: defaults: 1.0.3 dev: true - /webidl-conversions/3.0.1: - resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} - dev: false - /webpack-virtual-modules/0.4.3: resolution: {integrity: sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw==} dev: true - /whatwg-url/5.0.0: - resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: diff --git a/scripts/build.main.mjs b/scripts/build.main.mjs index b284698..c98b78f 100644 --- a/scripts/build.main.mjs +++ b/scripts/build.main.mjs @@ -25,6 +25,7 @@ const options = { ), 'electron', 'NeteaseCloudMusicApi', + 'better-sqlite3', ], } diff --git a/src/main/cache.ts b/src/main/cache.ts index 2b4c002..9ec57e4 100644 --- a/src/main/cache.ts +++ b/src/main/cache.ts @@ -1,5 +1,5 @@ -import { db, ModelNames, realm } from './database' -import type { FetchTracksResponse } from '../renderer/src/api/track' +import { db, Tables } from './db' +import type { FetchTracksResponse } from '../renderer/api/track' import { app, ipcMain } from 'electron' import { Request, Response } from 'express' import logger from './logger' @@ -8,86 +8,82 @@ import * as musicMetadata from 'music-metadata' export async function setCache(api: string, data: any, query: any) { switch (api) { + case 'user/playlist': case 'user/account': case 'personalized': + case 'recommend/resource': case 'likelist': { if (!data) return - db.set(ModelNames.ACCOUNT_DATA, api, data) - break - } - case 'user/playlist': { - if (!data.playlist) return - db.set(ModelNames.USER_PLAYLISTS, Number(query.uid), data) + console.log(api) + db.upsert(Tables.ACCOUNT_DATA, { + id: api, + json: JSON.stringify(data), + updateAt: Date.now(), + }) break } case 'song/detail': { + console.log('dsdadasdas') if (!data.songs) return - const tracks = (data as FetchTracksResponse).songs - db.batchSet( - ModelNames.TRACK, - tracks.map(t => ({ - id: t.id, - json: JSON.stringify(t), - updateAt: Date.now(), - })) - ) + const tracks = (data as FetchTracksResponse).songs.map(t => ({ + id: t.id, + json: JSON.stringify(t), + updatedAt: Date.now(), + })) + db.upsertMany(Tables.TRACK, tracks) break } case 'album': { if (!data.album) return data.album.songs = (data as FetchTracksResponse).songs - db.set(ModelNames.ALBUM, Number(data.album.id), data) + db.upsert(Tables.ALBUM, { + id: data.album.id, + json: JSON.stringify(data), + updatedAt: Date.now(), + }) break } case 'playlist/detail': { if (!data.playlist) return - db.set(ModelNames.PLAYLIST, Number(data.playlist.id), data) + db.upsert(Tables.PLAYLIST, { + id: data.playlist.id, + json: JSON.stringify(data), + updatedAt: Date.now(), + }) break } case 'artists': { if (!data.artist) return - db.set(ModelNames.ARTIST, Number(data.artist.id), data) + db.upsert(Tables.ARTIST, { + id: data.artist.id, + json: JSON.stringify(data), + updatedAt: Date.now(), + }) break } case 'artist/album': { if (!data.hotAlbums) return - db.set(ModelNames.ARTIST_ALBUMS, Number(data.artist.id), data) + db.upsert(Tables.ARTIST_ALBUMS, { + id: data.artist.id, + json: JSON.stringify(data), + updatedAt: Date.now(), + }) break } } } -/** - * Check if the cache is expired - * @param updateAt from database, milliseconds - * @param staleTime minutes - */ -const isCacheExpired = (updateAt: number, staleTime: number) => { - return Date.now() - updateAt > staleTime * 1000 * 60 -} - -export function getCache( - api: string, - query: any, - checkIsExpired: boolean = false -): any { +export function getCache(api: string, query: any): any { switch (api) { case 'user/account': + case 'user/playlist': case 'personalized': + case 'recommend/resource': case 'likelist': { - const data = db.get(ModelNames.ACCOUNT_DATA, api) as any + const data = db.find(Tables.ACCOUNT_DATA, api) if (data?.json) return JSON.parse(data.json) break } - case 'user/playlist': { - if (isNaN(Number(query.uid))) return - const userPlaylists = db.get( - ModelNames.USER_PLAYLISTS, - Number(query?.uid) - ) as any - if (userPlaylists?.json) return JSON.parse(userPlaylists.json) - break - } case 'song/detail': { const ids: string[] = query?.ids.split(',') if (ids.length === 0) return @@ -98,10 +94,8 @@ export function getCache( }) if (!isIDsValid) return - const idsQuery = ids.map(id => `id = ${id}`).join(' OR ') - const tracksRaw = realm - .objects(ModelNames.TRACK) - .filtered(`(${idsQuery})`) + const tracksRaw = db.findMany(Tables.TRACK, ids) + if (tracksRaw.length !== ids.length) { return } @@ -118,33 +112,27 @@ export function getCache( } case 'album': { if (isNaN(Number(query?.id))) return - const album = db.get(ModelNames.ALBUM, Number(query?.id)) as any - if (checkIsExpired && isCacheExpired(album?.updateAt, 24 * 60)) return - if (album?.json) return JSON.parse(album.json) + const data = db.find(Tables.ALBUM, query.id) + console.log(data) + if (data?.json) return JSON.parse(data.json) break } case 'playlist/detail': { if (isNaN(Number(query?.id))) return - const playlist = db.get(ModelNames.PLAYLIST, Number(query?.id)) as any - if (checkIsExpired && isCacheExpired(playlist?.updateAt, 10)) return - if (playlist?.json) return JSON.parse(playlist.json) + const data = db.find(Tables.PLAYLIST, query.id) + if (data?.json) return JSON.parse(data.json) break } case 'artists': { if (isNaN(Number(query?.id))) return - const artist = db.get(ModelNames.ARTIST, Number(query?.id)) as any - if (checkIsExpired && isCacheExpired(artist?.updateAt, 30)) return - if (artist?.json) return JSON.parse(artist.json) + const data = db.find(Tables.ARTIST, query.id) + if (data?.json) return JSON.parse(data.json) break } case 'artist/album': { if (isNaN(Number(query?.id))) return - const artistAlbums = db.get( - ModelNames.ARTIST_ALBUMS, - Number(query?.id) - ) as any - if (checkIsExpired && isCacheExpired(artistAlbums?.updateAt, 30)) return - if (artistAlbums?.json) return JSON.parse(artistAlbums.json) + const data = db.find(Tables.ARTIST_ALBUMS, query.id) + if (data?.json) return JSON.parse(data.json) break } } @@ -162,7 +150,7 @@ export async function getCacheForExpress(api: string, req: Request) { // Get audio cache if API is song/detail if (api === 'song/url') { - const cache = db.get(ModelNames.AUDIO, Number(req.query.id)) as any + const cache = db.find(Tables.AUDIO, Number(req.query.id)) if (!cache) return const audioFileName = `${cache.id}-${cache.br}.${cache.type}` @@ -224,7 +212,7 @@ export function getAudioCache(fileName: string, res: Response) { const path = `${app.getPath('userData')}/audio_cache/${fileName}` const audio = fs.readFileSync(path) if (audio.byteLength === 0) { - db.delete(ModelNames.AUDIO, Number(id)) + db.delete(Tables.AUDIO, id) fs.unlinkSync(path) return res.status(404).send({ error: 'Audio not found' }) } @@ -263,18 +251,12 @@ export async function cacheAudio( } logger.info(`Audio file ${id}-${br}.${type} cached!`) - realm.write(() => { - realm.create( - ModelNames.AUDIO, - { - id: Number(id), - type, - br, - source, - updateAt: Date.now(), - }, - 'modified' - ) + db.upsert(Tables.AUDIO, { + id, + br, + type, + source, + updateAt: Date.now(), }) logger.info(`[cache] cacheAudio ${id}-${br}.${type}`) @@ -283,6 +265,6 @@ export async function cacheAudio( ipcMain.on('getApiCacheSync', (event, args) => { const { api, query } = args - const data = getCache(api, query, false) + const data = getCache(api, query) event.returnValue = data }) diff --git a/src/main/database.ts b/src/main/database.ts index 0b5d9d7..61b3f9b 100644 --- a/src/main/database.ts +++ b/src/main/database.ts @@ -122,10 +122,4 @@ ipcMain.on('test', () => { console.log('The file was saved!') }) }) - - // realm.write(() => { - // realm.deleteAll() - // }) - - realm.compact() }) diff --git a/src/main/db.ts b/src/main/db.ts new file mode 100644 index 0000000..ae17991 --- /dev/null +++ b/src/main/db.ts @@ -0,0 +1,88 @@ +import path from 'path' +import { app, ipcMain } from 'electron' +import fs from 'fs' +import SQLite3 from 'better-sqlite3' + +export enum Tables { + TRACK = 'track', + ALBUM = 'album', + ARTIST = 'artist', + PLAYLIST = 'playlist', + ARTIST_ALBUMS = 'artist_album', + USER_PLAYLISTS = 'user_playlist', + + // Special tables + ACCOUNT_DATA = 'account_data', + AUDIO = 'audio', +} + +const sqlite = new SQLite3( + path.resolve(app.getPath('userData'), './api_cache/db.sqlite') +) + +export const db = { + find: (table: Tables, key: number | string) => { + return sqlite + .prepare(`SELECT * FROM ${table} WHERE id = ? LIMIT 1`) + .get(key) + }, + findMany: (table: Tables, keys: number[] | string[]) => { + const idsQuery = keys.map(key => `id = ${key}`).join(' OR ') + return sqlite.prepare(`SELECT * FROM ${table} WHERE ${idsQuery}`).all() + }, + findAll: (table: Tables) => { + return sqlite.prepare(`SELECT * FROM ${table}`).all() + }, + upsert: (table: Tables, data: any) => { + const valuesQuery = Object.keys(data) + .map(key => `:${key}`) + .join(', ') + return sqlite + .prepare(`INSERT OR REPLACE INTO ${table} VALUES (${valuesQuery})`) + .run(data) + }, + upsertMany: (table: Tables, data: any[]) => { + const valuesQuery = Object.keys(data[0]) + .map(key => `:${key}`) + .join(', ') + const upsert = sqlite.prepare( + `INSERT OR REPLACE INTO ${table} VALUES (${valuesQuery})` + ) + const upsertMany = sqlite.transaction((rows: any[]) => { + rows.forEach((row: any) => upsert.run(row)) + }) + upsertMany(data) + }, + delete: (table: Tables, key: number | string) => { + return sqlite.prepare(`DELETE FROM ${table} WHERE id = ?`).run(key) + }, + deleteMany: (table: Tables, keys: number[] | string[]) => { + const idsQuery = keys.map(key => `id = ${key}`).join(' OR ') + return sqlite.prepare(`DELETE FROM ${table} WHERE ${idsQuery}`).run() + }, + truncate: (table: Tables) => { + return sqlite.prepare(`DELETE FROM ${table}`).run() + }, +} + +ipcMain.on('db-export-json', () => { + const tables = [ + Tables.ARTIST_ALBUMS, + Tables.PLAYLIST, + Tables.ALBUM, + Tables.TRACK, + Tables.ARTIST, + Tables.AUDIO, + Tables.ACCOUNT_DATA, + ] + tables.forEach(table => { + const data = db.findAll(table) + + fs.writeFile(`./tmp/${table}.json`, JSON.stringify(data), function (err) { + if (err) { + return console.log(err) + } + console.log('The file was saved!') + }) + }) +}) diff --git a/src/main/index.ts b/src/main/index.ts index cb53d4f..a489b29 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -12,6 +12,7 @@ import path, { join } from 'path' import logger from './logger' import './server' // import './database' +import './db' const isWindows = process.platform === 'win32' const isMac = process.platform === 'darwin' diff --git a/src/main/preload.ts b/src/main/preload.ts index 8dbf322..ae978f4 100644 --- a/src/main/preload.ts +++ b/src/main/preload.ts @@ -3,7 +3,7 @@ import path from 'path' import { app } from 'electron' import fs from 'fs' -const isDev = !app.isPackaged +const isDev = process.env.NODE_ENV === 'development' if (isDev) { const devUserDataPath = path.resolve(process.cwd(), './tmp/userData') diff --git a/src/main/sentry.ts b/src/main/sentry.ts index 22a542a..55d9c79 100644 --- a/src/main/sentry.ts +++ b/src/main/sentry.ts @@ -8,7 +8,7 @@ logger.info(`[sentry] init sentry`) Sentry.init({ dsn: 'https://2aaaa67f1c3d4d6baefafa5d58fcf340@o436528.ingest.sentry.io/6274637', release: `yesplaymusic@${pkg.version}`, - // environment: import.meta.env.MODE, + environment: process.env.NODE_ENV, // Set tracesSampleRate to 1.0 to capture 100% // of transactions for performance monitoring. diff --git a/src/main/server.ts b/src/main/server.ts index 3a109e8..7042723 100644 --- a/src/main/server.ts +++ b/src/main/server.ts @@ -2,12 +2,12 @@ import { pathCase } from 'change-case' import cookieParser from 'cookie-parser' import express, { Request, Response } from 'express' import logger from './logger' -// import { -// setCache, -// getCacheForExpress, -// cacheAudio, -// getAudioCache, -// } from './cache' +import { + setCache, + getCacheForExpress, + cacheAudio, + getAudioCache, +} from './cache' import fileUpload from 'express-fileupload' // eslint-disable-next-line @typescript-eslint/no-var-requires @@ -26,8 +26,8 @@ Object.entries(neteaseApi).forEach(([name, handler]) => { logger.info(`[server] Handling request: ${req.path}`) // Get from cache - // const cache = await getCacheForExpress(name, req) - // if (cache) return res.json(cache) + const cache = await getCacheForExpress(name, req) + if (cache) return res.json(cache) // Request netease api try { @@ -36,7 +36,7 @@ Object.entries(neteaseApi).forEach(([name, handler]) => { cookie: `MUSIC_U=${req.cookies['MUSIC_U']}`, }) - // setCache(name, result.body, req.query) + setCache(name, result.body, req.query) return res.send(result.body) } catch (error) { return res.status(500).send(error) @@ -51,7 +51,7 @@ Object.entries(neteaseApi).forEach(([name, handler]) => { app.get( '/yesplaymusic/audio/:filename', async (req: Request, res: Response) => { - // getAudioCache(req.params.filename, res) + getAudioCache(req.params.filename, res) } ) app.post('/yesplaymusic/audio/:id', async (req: Request, res: Response) => { @@ -72,10 +72,10 @@ app.post('/yesplaymusic/audio/:id', async (req: Request, res: Response) => { } try { - // await cacheAudio(req.files.file.data, { - // id: id, - // source: 'netease', - // }) + await cacheAudio(req.files.file.data, { + id: id, + source: 'netease', + }) res.status(200).send('Audio cached!') } catch (error) { res.status(500).send({ error }) diff --git a/src/renderer/hooks/useAlbum.ts b/src/renderer/hooks/useAlbum.ts index b1d7118..2dfd298 100644 --- a/src/renderer/hooks/useAlbum.ts +++ b/src/renderer/hooks/useAlbum.ts @@ -18,13 +18,13 @@ export default function useAlbum(params: FetchAlbumParams, noCache?: boolean) { { enabled: !!params.id, staleTime: 24 * 60 * 60 * 1000, // 24 hours - // placeholderData: (): FetchAlbumResponse => - // window.ipcRenderer.sendSync('getApiCacheSync', { - // api: 'album', - // query: { - // id: params.id, - // }, - // }), + placeholderData: (): FetchAlbumResponse => + window.ipcRenderer?.sendSync('getApiCacheSync', { + api: 'album', + query: { + id: params.id, + }, + }), } ) } diff --git a/src/renderer/hooks/useArtist.ts b/src/renderer/hooks/useArtist.ts index 71bd06c..e79be59 100644 --- a/src/renderer/hooks/useArtist.ts +++ b/src/renderer/hooks/useArtist.ts @@ -12,13 +12,13 @@ export default function useArtist( { enabled: !!params.id && params.id > 0 && !isNaN(Number(params.id)), staleTime: 5 * 60 * 1000, // 5 mins - // placeholderData: (): FetchArtistResponse => - // window.ipcRenderer.sendSync('getApiCacheSync', { - // api: 'artists', - // query: { - // id: params.id, - // }, - // }), + placeholderData: (): FetchArtistResponse => + window.ipcRenderer?.sendSync('getApiCacheSync', { + api: 'artists', + query: { + id: params.id, + }, + }), } ) } diff --git a/src/renderer/hooks/useArtistAlbums.ts b/src/renderer/hooks/useArtistAlbums.ts index e550157..76fcd66 100644 --- a/src/renderer/hooks/useArtistAlbums.ts +++ b/src/renderer/hooks/useArtistAlbums.ts @@ -15,13 +15,13 @@ export default function useUserAlbums(params: FetchArtistAlbumsParams) { { enabled: !!params.id && params.id !== 0, staleTime: 3600000, - // placeholderData: (): FetchArtistAlbumsResponse => - // window.ipcRenderer.sendSync('getApiCacheSync', { - // api: 'artist/album', - // query: { - // id: params.id, - // }, - // }), + placeholderData: (): FetchArtistAlbumsResponse => + window.ipcRenderer?.sendSync('getApiCacheSync', { + api: 'artist/album', + query: { + id: params.id, + }, + }), } ) } diff --git a/src/renderer/hooks/usePlaylist.ts b/src/renderer/hooks/usePlaylist.ts index ed14298..f475ce3 100644 --- a/src/renderer/hooks/usePlaylist.ts +++ b/src/renderer/hooks/usePlaylist.ts @@ -17,13 +17,13 @@ export default function usePlaylist( { enabled: !!(params.id && params.id > 0 && !isNaN(Number(params.id))), refetchOnWindowFocus: true, - // placeholderData: (): FetchPlaylistResponse | undefined => - // window.ipcRenderer.sendSync('getApiCacheSync', { - // api: 'playlist/detail', - // query: { - // id: params.id, - // }, - // }), + placeholderData: (): FetchPlaylistResponse | undefined => + window.ipcRenderer?.sendSync('getApiCacheSync', { + api: 'playlist/detail', + query: { + id: params.id, + }, + }), } ) } diff --git a/src/renderer/hooks/useTracks.ts b/src/renderer/hooks/useTracks.ts index 46d7ca2..1528341 100644 --- a/src/renderer/hooks/useTracks.ts +++ b/src/renderer/hooks/useTracks.ts @@ -16,13 +16,13 @@ export default function useTracks(params: FetchTracksParams) { enabled: params.ids.length !== 0, refetchInterval: false, staleTime: Infinity, - // initialData: (): FetchTracksResponse | undefined => - // window.ipcRenderer.sendSync('getApiCacheSync', { - // api: 'song/detail', - // query: { - // ids: params.ids.join(','), - // }, - // }), + initialData: (): FetchTracksResponse | undefined => + window.ipcRenderer?.sendSync('getApiCacheSync', { + api: 'song/detail', + query: { + ids: params.ids.join(','), + }, + }), } ) } diff --git a/src/renderer/hooks/useUser.ts b/src/renderer/hooks/useUser.ts index 1c33e5e..43d1fd3 100644 --- a/src/renderer/hooks/useUser.ts +++ b/src/renderer/hooks/useUser.ts @@ -4,9 +4,9 @@ import { UserApiNames } from '@/api/user' export default function useUser() { return useQuery(UserApiNames.FETCH_USER_ACCOUNT, fetchUserAccount, { refetchOnWindowFocus: true, - // placeholderData: (): fetchUserAccountResponse | undefined => - // window.ipcRenderer.sendSync('getApiCacheSync', { - // api: 'user/account', - // }), + placeholderData: (): fetchUserAccountResponse | undefined => + window.ipcRenderer?.sendSync('getApiCacheSync', { + api: 'user/account', + }), }) } diff --git a/src/renderer/hooks/useUserLikedSongsIDs.ts b/src/renderer/hooks/useUserLikedSongsIDs.ts index 1af5a59..47d9c10 100644 --- a/src/renderer/hooks/useUserLikedSongsIDs.ts +++ b/src/renderer/hooks/useUserLikedSongsIDs.ts @@ -13,13 +13,13 @@ export default function useUserLikedSongsIDs( { enabled: !!(params.uid && params.uid !== 0), refetchOnWindowFocus: true, - // placeholderData: (): FetchUserLikedSongsIDsResponse | undefined => - // window.ipcRenderer.sendSync('getApiCacheSync', { - // api: 'likelist', - // query: { - // uid: params.uid, - // }, - // }), + placeholderData: (): FetchUserLikedSongsIDsResponse | undefined => + window.ipcRenderer?.sendSync('getApiCacheSync', { + api: 'likelist', + query: { + uid: params.uid, + }, + }), } ) } diff --git a/src/renderer/hooks/useUserPlaylists.ts b/src/renderer/hooks/useUserPlaylists.ts index 2e24fbb..a1b6c32 100644 --- a/src/renderer/hooks/useUserPlaylists.ts +++ b/src/renderer/hooks/useUserPlaylists.ts @@ -17,13 +17,13 @@ export default function useUserPlaylists(params: FetchUserPlaylistsParams) { params.uid !== 0 && params.offset !== undefined ), - // placeholderData: (): FetchUserPlaylistsResponse => - // window.ipcRenderer.sendSync('getApiCacheSync', { - // api: 'user/playlist', - // query: { - // uid: params.uid, - // }, - // }), + placeholderData: (): FetchUserPlaylistsResponse => + window.ipcRenderer?.sendSync('getApiCacheSync', { + api: 'user/playlist', + query: { + uid: params.uid, + }, + }), } ) } diff --git a/src/renderer/main.tsx b/src/renderer/main.tsx index 2548ff8..1e0d8b3 100644 --- a/src/renderer/main.tsx +++ b/src/renderer/main.tsx @@ -12,7 +12,7 @@ Sentry.init({ dsn: 'https://7cc7879b42ba4bed9f66fb6752558475@o436528.ingest.sentry.io/6274630', integrations: [new BrowserTracing()], release: `yesplaymusic@${pkg.version}`, - // environment: import.meta.env.MODE, + environment: import.meta.env.MODE, // Set tracesSampleRate to 1.0 to capture 100% // of transactions for performance monitoring. diff --git a/src/renderer/pages/Home.tsx b/src/renderer/pages/Home.tsx index c9435a6..f1605dd 100644 --- a/src/renderer/pages/Home.tsx +++ b/src/renderer/pages/Home.tsx @@ -17,8 +17,10 @@ export default function Home() { return fetchRecommendedPlaylists({}) }, { - // placeholderData: () => - // window.ipcRenderer.sendSync('getApiCacheSync', { api: 'personalized' }), + placeholderData: () => + window.ipcRenderer?.sendSync('getApiCacheSync', { + api: 'personalized', + }), } ) @@ -27,7 +29,13 @@ export default function Home() { isLoading: isLoadingDailyRecommendPlaylists, } = useQuery( PlaylistApiNames.FETCH_DAILY_RECOMMEND_PLAYLISTS, - fetchDailyRecommendPlaylists + fetchDailyRecommendPlaylists, + { + placeholderData: () => + window.ipcRenderer?.sendSync('getApiCacheSync', { + api: 'recommend/resource', + }), + } ) const playlists = [