diff --git a/app.config.ts b/app.config.ts index 1f900fa..0e91cde 100644 --- a/app.config.ts +++ b/app.config.ts @@ -1,6 +1,6 @@ import { AppConfig } from 'nuxt/schema'; import { markRaw } from 'vue'; -import { IconDelete, IconExclamationCircle, IconMessage } from '@arco-design/web-vue/es/icon'; +import { IconDelete, IconExclamationCircle, IconMessage, IconTrophy } from '@arco-design/web-vue/es/icon'; const config: AppConfig = defineAppConfig({ version: undefined, // 在 ~/modules/changelog.ts 中注入 @@ -19,6 +19,10 @@ const config: AppConfig = defineAppConfig({ label: '风险检测', icon: markRaw(IconExclamationCircle), link: '/feature/audit', + }, { + label: '成员荣誉', + icon: markRaw(IconTrophy), + link: '/feature/credit', }], }, }); diff --git a/components/fb/bot-token-picker.vue b/components/fb/bot-token-picker.vue index 420347d..62a7564 100644 --- a/components/fb/bot-token-picker.vue +++ b/components/fb/bot-token-picker.vue @@ -44,7 +44,7 @@ const input = ref<{ }>({ token: '', }); -const selected: ShallowRef = shallowRef(); +const selected: Ref = shallowRef(); async function handleChange(v: string) { input.value = { token: v, help: '', status: 'validating' }; @@ -95,7 +95,7 @@ function handleClose() { :closable='showCancel' :ok-button-props='{ disabled: !selected }' :esc-to-close='false' - @update:visible='(v) => emit("update:visible", v)' + @update:visible='(v: boolean) => emit("update:visible", v)' @ok='() => emit("ok", selected!)' @cancel='() => emit("cancel")' @close='handleClose' diff --git a/components/fb/credit.vue b/components/fb/credit.vue new file mode 100644 index 0000000..9a2b268 --- /dev/null +++ b/components/fb/credit.vue @@ -0,0 +1,120 @@ + + + + + + + + diff --git a/components/fb/credit/authority.vue b/components/fb/credit/authority.vue new file mode 100644 index 0000000..3b12cf6 --- /dev/null +++ b/components/fb/credit/authority.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/components/fb/credit/op-buttons.vue b/components/fb/credit/op-buttons.vue new file mode 100644 index 0000000..345d598 --- /dev/null +++ b/components/fb/credit/op-buttons.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/components/fb/credit/slot.vue b/components/fb/credit/slot.vue new file mode 100644 index 0000000..477c8b3 --- /dev/null +++ b/components/fb/credit/slot.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/components/fb/guild-picker.vue b/components/fb/guild-picker.vue index dcaf2db..b2566fa 100644 --- a/components/fb/guild-picker.vue +++ b/components/fb/guild-picker.vue @@ -14,14 +14,14 @@ export interface Props { /** 是否隐藏取消按钮。 @default true */ showCancel?: boolean; } -export type Events = { - 'update:visible': [value: boolean]; +export interface Events { + (ev: 'update:visible', value: boolean): void; /** 关闭选择器。 */ - close: []; + (ev: 'close'): void; /** 确认选择。 */ - ok: [value: Guild]; + (ev: 'ok', value: Guild): void; /** 取消选择。 */ - cancel: []; + (ev: 'cancel'): void; } withDefaults(defineProps(), { @@ -78,7 +78,7 @@ function handleBadInput() { :closable='showCancel' :ok-button-props='{ disabled: !selected }' :esc-to-close='false' - @update:visible='(v) => emit("update:visible", v)' + @update:visible='(v: boolean) => emit("update:visible", v)' @ok='() => emit("ok", selected!)' @cancel='() => emit("cancel")' @close='handleClose' diff --git a/components/fb/user-input.vue b/components/fb/user-input.vue new file mode 100644 index 0000000..32e90c4 --- /dev/null +++ b/components/fb/user-input.vue @@ -0,0 +1,40 @@ + + + diff --git a/package.json b/package.json index 1fe2552..2e777f9 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@vitejs/plugin-legacy": "^4.1.1", "@vueuse/core": "^10.3.0", "@vueuse/nuxt": "^10.3.0", - "fanbook-api-node-sdk": "^0.3.0", + "fanbook-api-node-sdk": "^0.4.3", "husky": "^8.0.3", "lodash-es": "^4.17.9", "nprogress": "^0.2.0", diff --git a/pages/feature/credit.vue b/pages/feature/credit.vue new file mode 100644 index 0000000..d74acfc --- /dev/null +++ b/pages/feature/credit.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9665d7..9fd92ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,7 +3,7 @@ lockfileVersion: '6.0' devDependencies: '@arco-design/web-vue': specifier: ^2.51.0 - version: 2.51.1(vue@3.3.4) + version: 2.51.1(vue@3.3.6) '@commitlint/cli': specifier: ^17.6.7 version: 17.7.1 @@ -15,7 +15,7 @@ devDependencies: version: 17.4.4 '@nuxtjs/tailwindcss': specifier: ^6.8.0 - version: 6.8.0(ts-node@10.9.1)(webpack@5.88.2) + version: 6.8.0(ts-node@10.9.1)(webpack@5.89.0) '@types/lodash-es': specifier: ^4.17.9 version: 4.17.9 @@ -27,16 +27,16 @@ devDependencies: version: 0.2.0 '@vitejs/plugin-legacy': specifier: ^4.1.1 - version: 4.1.1(terser@5.19.4)(vite@4.4.9) + version: 4.1.1(terser@5.22.0)(vite@4.5.0) '@vueuse/core': specifier: ^10.3.0 - version: 10.4.1(vue@3.3.4) + version: 10.4.1(vue@3.3.6) '@vueuse/nuxt': specifier: ^10.3.0 - version: 10.4.1(nuxt@3.7.1)(vue@3.3.4) + version: 10.4.1(nuxt@3.7.1)(vue@3.3.6) fanbook-api-node-sdk: - specifier: ^0.3.0 - version: 0.3.0 + specifier: ^0.4.3 + version: 0.4.3 husky: specifier: ^8.0.3 version: 8.0.3 @@ -48,13 +48,13 @@ devDependencies: version: 0.2.0 nuxt: specifier: ^3.7.1 - version: 3.7.1(@types/node@18.17.15)(terser@5.19.4)(typescript@5.2.2) + version: 3.7.1(@types/node@18.17.15)(terser@5.22.0)(typescript@5.2.2) simple-git: specifier: ^3.19.1 version: 3.19.1 unplugin-vue-components: specifier: ^0.25.1 - version: 0.25.2(vue@3.3.4) + version: 0.25.2(vue@3.3.6) packages: @@ -81,7 +81,7 @@ packages: color: 3.2.1 dev: true - /@arco-design/web-vue@2.51.1(vue@3.3.4): + /@arco-design/web-vue@2.51.1(vue@3.3.6): resolution: {integrity: sha512-YsNF1hrl700rshZPrJ7haNEN6pc3dQwpLbYzpE49jrLdF0mALGU9aP2A8q0FNPH2Rt4rxvxkw1o0gsL7my8H+Q==} peerDependencies: vue: ^3.1.0 @@ -94,7 +94,7 @@ packages: number-precision: 1.6.0 resize-observer-polyfill: 1.5.1 scroll-into-view-if-needed: 2.2.31 - vue: 3.3.4 + vue: 3.3.6(typescript@5.2.2) dev: true /@babel/code-frame@7.22.13: @@ -328,6 +328,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-option@7.22.15: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} @@ -370,6 +375,14 @@ packages: '@babel/types': 7.22.17 dev: true + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 + dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.22.17): resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} engines: {node: '>=6.9.0'} @@ -1289,6 +1302,15 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + /@cloudflare/kv-asset-handler@0.3.0: resolution: {integrity: sha512-9CB/MKf/wdvbfkUdfrj+OkEwZ5b7rws0eogJ4293h+7b6KX5toPwym+VQKmILafNB9YiehqY0DlNrDcDhdWHSQ==} dependencies: @@ -1941,6 +1963,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -2064,15 +2093,15 @@ packages: - supports-color dev: true - /@nuxt/postcss8@1.1.3(webpack@5.88.2): + /@nuxt/postcss8@1.1.3(webpack@5.89.0): resolution: {integrity: sha512-CdHtErhvQwueNZPBOmlAAKrNCK7aIpZDYhtS7TzXlSgPHHox1g3cSlf+Ke9oB/8t4mNNjdB+prclme2ibuCOEA==} dependencies: autoprefixer: 10.4.15(postcss@8.4.29) - css-loader: 5.2.7(webpack@5.88.2) + css-loader: 5.2.7(webpack@5.89.0) defu: 3.2.2 postcss: 8.4.29 postcss-import: 13.0.0(postcss@8.4.29) - postcss-loader: 4.3.0(postcss@8.4.29)(webpack@5.88.2) + postcss-loader: 4.3.0(postcss@8.4.29)(webpack@5.89.0) postcss-url: 10.1.3(postcss@8.4.29) semver: 7.5.4 transitivePeerDependencies: @@ -2131,7 +2160,7 @@ packages: resolution: {integrity: sha512-5gc02Pu1HycOVUWJ8aYsWeeXcSTPe8iX8+KIrhyEtEoOSkY0eMBuo0ssljB8wALuEmepv31DlYe5gpiRwkjESA==} dev: true - /@nuxt/vite-builder@3.7.1(@types/node@18.17.15)(terser@5.19.4)(typescript@5.2.2)(vue@3.3.4): + /@nuxt/vite-builder@3.7.1(@types/node@18.17.15)(terser@5.22.0)(typescript@5.2.2)(vue@3.3.4): resolution: {integrity: sha512-/DJZNJ8al8P+O5GrmmgpUmtlaDKZfrm1bfGnjpsDR8VBN6dgxTvAYi5bCkxTLCbaJyXs4XcbYrAXCNSlsRrl3Q==} engines: {node: ^14.18.0 || >=16.10.0} peerDependencies: @@ -2168,8 +2197,8 @@ packages: strip-literal: 1.3.0 ufo: 1.3.0 unplugin: 1.4.0 - vite: 4.4.9(@types/node@18.17.15)(terser@5.19.4) - vite-node: 0.33.0(@types/node@18.17.15)(terser@5.19.4) + vite: 4.4.9(@types/node@18.17.15)(terser@5.22.0) + vite-node: 0.33.0(@types/node@18.17.15)(terser@5.22.0) vite-plugin-checker: 0.6.2(typescript@5.2.2)(vite@4.4.9) vue: 3.3.4 vue-bundle-renderer: 2.0.0 @@ -2193,11 +2222,11 @@ packages: - vue-tsc dev: true - /@nuxtjs/tailwindcss@6.8.0(ts-node@10.9.1)(webpack@5.88.2): + /@nuxtjs/tailwindcss@6.8.0(ts-node@10.9.1)(webpack@5.89.0): resolution: {integrity: sha512-jzuvD1nfA2BPnSbHtKK0aiI51ndMa7lNGL1iDEFuEPsltzilZ9ED7zOP6niGTrImg0n5Yt4GEJpixi6yWwp9Hw==} dependencies: '@nuxt/kit': 3.7.1 - '@nuxt/postcss8': 1.1.3(webpack@5.88.2) + '@nuxt/postcss8': 1.1.3(webpack@5.89.0) autoprefixer: 10.4.15(postcss@8.4.29) chokidar: 3.5.3 clear-module: 4.1.2 @@ -2533,24 +2562,28 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@types/eslint-scope@3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + /@types/eslint-scope@3.7.6: + resolution: {integrity: sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==} dependencies: - '@types/eslint': 8.44.2 - '@types/estree': 1.0.1 + '@types/eslint': 8.44.6 + '@types/estree': 1.0.3 dev: true - /@types/eslint@8.44.2: - resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} + /@types/eslint@8.44.6: + resolution: {integrity: sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==} dependencies: - '@types/estree': 1.0.1 - '@types/json-schema': 7.0.12 + '@types/estree': 1.0.3 + '@types/json-schema': 7.0.14 dev: true /@types/estree@1.0.1: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} dev: true + /@types/estree@1.0.3: + resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} + dev: true + /@types/http-proxy@1.17.11: resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} dependencies: @@ -2561,6 +2594,10 @@ packages: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true + /@types/json-schema@7.0.14: + resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} + dev: true + /@types/lodash-es@4.17.9: resolution: {integrity: sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ==} dependencies: @@ -2663,7 +2700,7 @@ packages: - supports-color dev: true - /@vitejs/plugin-legacy@4.1.1(terser@5.19.4)(vite@4.4.9): + /@vitejs/plugin-legacy@4.1.1(terser@5.22.0)(vite@4.5.0): resolution: {integrity: sha512-um3gbVouD2Q/g19C0qpDfHwveXDCAHzs8OC3e9g6aXpKoD1H14himgs7wkMnhAynBJy7QqUoZNAXDuqN8zLR2g==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -2677,8 +2714,8 @@ packages: magic-string: 0.30.3 regenerator-runtime: 0.13.11 systemjs: 6.14.2 - terser: 5.19.4 - vite: 4.4.9(@types/node@18.17.15)(terser@5.19.4) + terser: 5.22.0 + vite: 4.5.0(@types/node@18.17.15)(terser@5.22.0) transitivePeerDependencies: - supports-color dev: true @@ -2693,7 +2730,7 @@ packages: '@babel/core': 7.22.17 '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.22.17) '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.22.17) - vite: 4.4.9(@types/node@18.17.15)(terser@5.19.4) + vite: 4.4.9(@types/node@18.17.15)(terser@5.22.0) vue: 3.3.4 transitivePeerDependencies: - supports-color @@ -2706,7 +2743,7 @@ packages: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.4.9(@types/node@18.17.15)(terser@5.19.4) + vite: 4.4.9(@types/node@18.17.15)(terser@5.22.0) vue: 3.3.4 dev: true @@ -2762,6 +2799,15 @@ packages: source-map-js: 1.0.2 dev: true + /@vue/compiler-core@3.3.6: + resolution: {integrity: sha512-2JNjemwaNwf+MkkatATVZi7oAH1Hx0B04DdPH3ZoZ8vKC1xZVP7nl4HIsk8XYd3r+/52sqqoz9TWzYc3yE9dqA==} + dependencies: + '@babel/parser': 7.23.0 + '@vue/shared': 3.3.6 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: true + /@vue/compiler-dom@3.3.4: resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} dependencies: @@ -2769,6 +2815,13 @@ packages: '@vue/shared': 3.3.4 dev: true + /@vue/compiler-dom@3.3.6: + resolution: {integrity: sha512-1MxXcJYMHiTPexjLAJUkNs/Tw2eDf2tY3a0rL+LfuWyiKN2s6jvSwywH3PWD8bKICjfebX3GWx2Os8jkRDq3Ng==} + dependencies: + '@vue/compiler-core': 3.3.6 + '@vue/shared': 3.3.6 + dev: true + /@vue/compiler-sfc@3.3.4: resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} dependencies: @@ -2784,6 +2837,21 @@ packages: source-map-js: 1.0.2 dev: true + /@vue/compiler-sfc@3.3.6: + resolution: {integrity: sha512-/Kms6du2h1VrXFreuZmlvQej8B1zenBqIohP0690IUBkJjsFvJxY0crcvVRJ0UhMgSR9dewB+khdR1DfbpArJA==} + dependencies: + '@babel/parser': 7.23.0 + '@vue/compiler-core': 3.3.6 + '@vue/compiler-dom': 3.3.6 + '@vue/compiler-ssr': 3.3.6 + '@vue/reactivity-transform': 3.3.6 + '@vue/shared': 3.3.6 + estree-walker: 2.0.2 + magic-string: 0.30.5 + postcss: 8.4.31 + source-map-js: 1.0.2 + dev: true + /@vue/compiler-ssr@3.3.4: resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} dependencies: @@ -2791,6 +2859,13 @@ packages: '@vue/shared': 3.3.4 dev: true + /@vue/compiler-ssr@3.3.6: + resolution: {integrity: sha512-QTIHAfDCHhjXlYGkUg5KH7YwYtdUM1vcFl/FxFDlD6d0nXAmnjizka3HITp8DGudzHndv2PjKVS44vqqy0vP4w==} + dependencies: + '@vue/compiler-dom': 3.3.6 + '@vue/shared': 3.3.6 + dev: true + /@vue/devtools-api@6.5.0: resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} dev: true @@ -2805,12 +2880,28 @@ packages: magic-string: 0.30.3 dev: true + /@vue/reactivity-transform@3.3.6: + resolution: {integrity: sha512-RlJl4dHfeO7EuzU1iJOsrlqWyJfHTkJbvYz/IOJWqu8dlCNWtxWX377WI0VsbAgBizjwD+3ZjdnvSyyFW1YVng==} + dependencies: + '@babel/parser': 7.23.0 + '@vue/compiler-core': 3.3.6 + '@vue/shared': 3.3.6 + estree-walker: 2.0.2 + magic-string: 0.30.5 + dev: true + /@vue/reactivity@3.3.4: resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} dependencies: '@vue/shared': 3.3.4 dev: true + /@vue/reactivity@3.3.6: + resolution: {integrity: sha512-gtChAumfQz5lSy5jZXfyXbKrIYPf9XEOrIr6rxwVyeWVjFhJwmwPLtV6Yis+M9onzX++I5AVE9j+iPH60U+B8Q==} + dependencies: + '@vue/shared': 3.3.6 + dev: true + /@vue/runtime-core@3.3.4: resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} dependencies: @@ -2818,6 +2909,13 @@ packages: '@vue/shared': 3.3.4 dev: true + /@vue/runtime-core@3.3.6: + resolution: {integrity: sha512-qp7HTP1iw1UW2ZGJ8L3zpqlngrBKvLsDAcq5lA6JvEXHmpoEmjKju7ahM9W2p/h51h0OT5F2fGlP/gMhHOmbUA==} + dependencies: + '@vue/reactivity': 3.3.6 + '@vue/shared': 3.3.6 + dev: true + /@vue/runtime-dom@3.3.4: resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} dependencies: @@ -2826,6 +2924,14 @@ packages: csstype: 3.1.2 dev: true + /@vue/runtime-dom@3.3.6: + resolution: {integrity: sha512-AoX3Cp8NqMXjLbIG9YR6n/pPLWE9TiDdk6wTJHFnl2GpHzDFH1HLBC9wlqqQ7RlnvN3bVLpzPGAAH00SAtOxHg==} + dependencies: + '@vue/runtime-core': 3.3.6 + '@vue/shared': 3.3.6 + csstype: 3.1.2 + dev: true + /@vue/server-renderer@3.3.4(vue@3.3.4): resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} peerDependencies: @@ -2836,17 +2942,31 @@ packages: vue: 3.3.4 dev: true + /@vue/server-renderer@3.3.6(vue@3.3.6): + resolution: {integrity: sha512-kgLoN43W4ERdZ6dpyy+gnk2ZHtcOaIr5Uc/WUP5DRwutgvluzu2pudsZGoD2b7AEJHByUVMa9k6Sho5lLRCykw==} + peerDependencies: + vue: 3.3.6 + dependencies: + '@vue/compiler-ssr': 3.3.6 + '@vue/shared': 3.3.6 + vue: 3.3.6(typescript@5.2.2) + dev: true + /@vue/shared@3.3.4: resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} dev: true - /@vueuse/core@10.4.1(vue@3.3.4): + /@vue/shared@3.3.6: + resolution: {integrity: sha512-Xno5pEqg8SVhomD0kTSmfh30ZEmV/+jZtyh39q6QflrjdJCXah5lrnOLi9KB6a5k5aAHXMXjoMnxlzUkCNfWLQ==} + dev: true + + /@vueuse/core@10.4.1(vue@3.3.6): resolution: {integrity: sha512-DkHIfMIoSIBjMgRRvdIvxsyboRZQmImofLyOHADqiVbQVilP8VVHDhBX2ZqoItOgu7dWa8oXiNnScOdPLhdEXg==} dependencies: '@types/web-bluetooth': 0.0.17 '@vueuse/metadata': 10.4.1 - '@vueuse/shared': 10.4.1(vue@3.3.4) - vue-demi: 0.14.6(vue@3.3.4) + '@vueuse/shared': 10.4.1(vue@3.3.6) + vue-demi: 0.14.6(vue@3.3.6) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -2856,17 +2976,17 @@ packages: resolution: {integrity: sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg==} dev: true - /@vueuse/nuxt@10.4.1(nuxt@3.7.1)(vue@3.3.4): + /@vueuse/nuxt@10.4.1(nuxt@3.7.1)(vue@3.3.6): resolution: {integrity: sha512-tJ25KCkozZaQEy0qli4Ta8WXlbMIjSD7gPnVfLScZ2DpSSgImMB5R66PQEkrbSg4GfFj0OuoYc4+vCHQ/FqTsw==} peerDependencies: nuxt: ^3.0.0 dependencies: '@nuxt/kit': 3.7.1 - '@vueuse/core': 10.4.1(vue@3.3.4) + '@vueuse/core': 10.4.1(vue@3.3.6) '@vueuse/metadata': 10.4.1 local-pkg: 0.4.3 - nuxt: 3.7.1(@types/node@18.17.15)(terser@5.19.4)(typescript@5.2.2) - vue-demi: 0.14.6(vue@3.3.4) + nuxt: 3.7.1(@types/node@18.17.15)(terser@5.22.0)(typescript@5.2.2) + vue-demi: 0.14.6(vue@3.3.6) transitivePeerDependencies: - '@vue/composition-api' - rollup @@ -2874,10 +2994,10 @@ packages: - vue dev: true - /@vueuse/shared@10.4.1(vue@3.3.4): + /@vueuse/shared@10.4.1(vue@3.3.6): resolution: {integrity: sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg==} dependencies: - vue-demi: 0.14.6(vue@3.3.4) + vue-demi: 0.14.6(vue@3.3.6) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -3234,10 +3354,10 @@ packages: postcss-value-parser: 4.2.0 dev: true - /axios@1.5.0: - resolution: {integrity: sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==} + /axios@1.5.1: + resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.3 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -3350,6 +3470,17 @@ packages: update-browserslist-db: 1.0.11(browserslist@4.21.10) dev: true + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001553 + electron-to-chromium: 1.4.563 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: true + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true @@ -3401,11 +3532,12 @@ packages: ylru: 1.3.2 dev: true - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 dev: true /callsites@3.1.0: @@ -3450,6 +3582,10 @@ packages: resolution: {integrity: sha512-9aY/b05NKU4Yl2sbcJhn4A7MsGwR1EPfW/nrqsnqVA0Oq50wpmPaGI+R1Z0UKlUl96oxUkGEOILWtOHck0eCWw==} dev: true + /caniuse-lite@1.0.30001553: + resolution: {integrity: sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==} + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3811,7 +3947,7 @@ packages: postcss: 8.4.29 dev: true - /css-loader@5.2.7(webpack@5.88.2): + /css-loader@5.2.7(webpack@5.89.0): resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -3827,7 +3963,7 @@ packages: postcss-value-parser: 4.2.0 schema-utils: 3.3.0 semver: 7.5.4 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /css-select@5.1.0: @@ -4010,6 +4146,15 @@ packages: engines: {node: '>=0.10.0'} dev: true + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -4149,6 +4294,10 @@ packages: resolution: {integrity: sha512-VTq6vjk3kCfG2qdzQRd/i9dIyVVm0dbtZIgFzrLgfB73mXDQT2HPKVRc1EoZcAVUv9XhXAu08DWqJuababdGGg==} dev: true + /electron-to-chromium@1.4.563: + resolution: {integrity: sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -4370,16 +4519,16 @@ packages: ufo: 1.3.0 dev: true - /fanbook-api-node-sdk@0.3.0: - resolution: {integrity: sha512-ctYONtUi8+ejjmIIyofm5xxd6umAkdZi4nl9Fc9rzEVlYvFpIA0GEqHzVhahQHla3PTC5dwelYwF7wOHHyCyfw==} + /fanbook-api-node-sdk@0.4.3: + resolution: {integrity: sha512-I2pVCg3arZqhmLvYD7a5PjlPWAQWxEP9yKCyEmp2BzyUbCZhvCsZQZq1QUwhJ3hR8aQPpYmbTK6YVS4cdOnEEg==} dependencies: - axios: 1.5.0 + axios: 1.5.1 js-base64: 3.7.5 json-bigint: 1.0.0 mitt: 3.0.1 qs: 6.11.2 uuid: 9.0.1 - ws: 8.14.1 + ws: 8.14.2 transitivePeerDependencies: - bufferutil - debug @@ -4455,8 +4604,8 @@ packages: hasBin: true dev: true - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -4528,8 +4677,8 @@ packages: dev: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true /gauge@3.0.2: @@ -4557,13 +4706,13 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: - function-bind: 1.1.1 - has: 1.0.3 + function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 + hasown: 2.0.0 dev: true /get-port-please@3.1.1: @@ -4699,6 +4848,12 @@ packages: slash: 4.0.0 dev: true + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true @@ -4738,6 +4893,12 @@ packages: engines: {node: '>=8'} dev: true + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: true + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} @@ -4763,13 +4924,20 @@ packages: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 dev: true /hash-sum@2.0.0: resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} dev: true + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} dev: true @@ -5421,6 +5589,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -5901,7 +6076,7 @@ packages: fsevents: 2.3.3 dev: true - /nuxt@3.7.1(@types/node@18.17.15)(terser@5.19.4)(typescript@5.2.2): + /nuxt@3.7.1(@types/node@18.17.15)(terser@5.22.0)(typescript@5.2.2): resolution: {integrity: sha512-y8so6b11dDnuOkjqls3WZToyKODmHFaEYVB/RitjMrkNCez68qGDBFtG+VLaO34I2IdsbugTzByXktEk4dbs9w==} engines: {node: ^14.18.0 || >=16.10.0} hasBin: true @@ -5919,7 +6094,7 @@ packages: '@nuxt/schema': 3.7.1 '@nuxt/telemetry': 2.4.1 '@nuxt/ui-templates': 1.3.1 - '@nuxt/vite-builder': 3.7.1(@types/node@18.17.15)(terser@5.19.4)(typescript@5.2.2)(vue@3.3.4) + '@nuxt/vite-builder': 3.7.1(@types/node@18.17.15)(terser@5.22.0)(typescript@5.2.2)(vue@3.3.4) '@types/node': 18.17.15 '@unhead/dom': 1.6.2 '@unhead/ssr': 1.6.2 @@ -6022,8 +6197,8 @@ packages: engines: {node: '>= 6'} dev: true - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true /ofetch@1.3.3: @@ -6401,7 +6576,7 @@ packages: yaml: 2.3.2 dev: true - /postcss-loader@4.3.0(postcss@8.4.29)(webpack@5.88.2): + /postcss-loader@4.3.0(postcss@8.4.29)(webpack@5.89.0): resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -6414,7 +6589,7 @@ packages: postcss: 8.4.29 schema-utils: 3.3.0 semver: 7.5.4 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /postcss-merge-longhand@6.0.0(postcss@8.4.29): @@ -6724,6 +6899,15 @@ packages: source-map-js: 1.0.2 dev: true + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} @@ -7019,6 +7203,14 @@ packages: fsevents: 2.3.3 dev: true + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -7119,6 +7311,16 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} dev: true @@ -7142,9 +7344,9 @@ packages: /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 dev: true /signal-exit@3.0.7: @@ -7474,7 +7676,7 @@ packages: yallist: 4.0.0 dev: true - /terser-webpack-plugin@5.3.9(webpack@5.88.2): + /terser-webpack-plugin@5.3.9(webpack@5.89.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -7490,12 +7692,12 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.20 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.19.4 - webpack: 5.88.2 + terser: 5.22.0 + webpack: 5.89.0 dev: true /terser@5.19.4: @@ -7509,6 +7711,17 @@ packages: source-map-support: 0.5.21 dev: true + /terser@5.22.0: + resolution: {integrity: sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + /text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} @@ -7739,7 +7952,7 @@ packages: engines: {node: '>= 10.0.0'} dev: true - /unplugin-vue-components@0.25.2(vue@3.3.4): + /unplugin-vue-components@0.25.2(vue@3.3.6): resolution: {integrity: sha512-OVmLFqILH6w+eM8fyt/d/eoJT9A6WO51NZLf1vC5c1FZ4rmq2bbGxTy8WP2Jm7xwFdukaIdv819+UI7RClPyCA==} engines: {node: '>=14'} peerDependencies: @@ -7762,7 +7975,7 @@ packages: minimatch: 9.0.3 resolve: 1.22.4 unplugin: 1.4.0 - vue: 3.3.4 + vue: 3.3.6(typescript@5.2.2) transitivePeerDependencies: - rollup - supports-color @@ -7892,6 +8105,17 @@ packages: picocolors: 1.0.0 dev: true + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} dev: true @@ -7931,7 +8155,7 @@ packages: engines: {node: '>= 0.8'} dev: true - /vite-node@0.33.0(@types/node@18.17.15)(terser@5.19.4): + /vite-node@0.33.0(@types/node@18.17.15)(terser@5.22.0): resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} engines: {node: '>=v14.18.0'} hasBin: true @@ -7941,7 +8165,7 @@ packages: mlly: 1.4.2 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@18.17.15)(terser@5.19.4) + vite: 4.4.9(@types/node@18.17.15)(terser@5.22.0) transitivePeerDependencies: - '@types/node' - less @@ -7998,14 +8222,14 @@ packages: strip-ansi: 6.0.1 tiny-invariant: 1.3.1 typescript: 5.2.2 - vite: 4.4.9(@types/node@18.17.15)(terser@5.19.4) + vite: 4.4.9(@types/node@18.17.15)(terser@5.22.0) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.8 vscode-uri: 3.0.7 dev: true - /vite@4.4.9(@types/node@18.17.15)(terser@5.19.4): + /vite@4.4.9(@types/node@18.17.15)(terser@5.22.0): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -8037,7 +8261,44 @@ packages: esbuild: 0.18.20 postcss: 8.4.29 rollup: 3.29.1 - terser: 5.19.4 + terser: 5.22.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vite@4.5.0(@types/node@18.17.15)(terser@5.22.0): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.17.15 + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 + terser: 5.22.0 optionalDependencies: fsevents: 2.3.3 dev: true @@ -8088,7 +8349,7 @@ packages: ufo: 1.3.0 dev: true - /vue-demi@0.14.6(vue@3.3.4): + /vue-demi@0.14.6(vue@3.3.6): resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} engines: {node: '>=12'} hasBin: true @@ -8100,7 +8361,7 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.3.4 + vue: 3.3.6(typescript@5.2.2) dev: true /vue-devtools-stub@0.1.0: @@ -8126,6 +8387,22 @@ packages: '@vue/shared': 3.3.4 dev: true + /vue@3.3.6(typescript@5.2.2): + resolution: {integrity: sha512-jJIDETeWJnoY+gfn4ZtMPMS5KtbP4ax+CT4dcQFhTnWEk8xMupFyQ0JxL28nvT/M4+p4a0ptxaV2WY0LiIxvRg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/compiler-dom': 3.3.6 + '@vue/compiler-sfc': 3.3.6 + '@vue/runtime-dom': 3.3.6 + '@vue/server-renderer': 3.3.6(vue@3.3.6) + '@vue/shared': 3.3.6 + typescript: 5.2.2 + dev: true + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -8152,8 +8429,8 @@ packages: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} dev: true - /webpack@5.88.2: - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + /webpack@5.89.0: + resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -8162,14 +8439,14 @@ packages: webpack-cli: optional: true dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 + '@types/eslint-scope': 3.7.6 + '@types/estree': 1.0.3 '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 acorn: 8.10.0 acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.10 + browserslist: 4.22.1 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.3.1 @@ -8183,7 +8460,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(webpack@5.89.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -8226,8 +8503,8 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /ws@8.14.1: - resolution: {integrity: sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==} + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 diff --git a/utils/biz/image-selector.tsx b/utils/biz/image-selector.tsx new file mode 100644 index 0000000..0ecb6c7 --- /dev/null +++ b/utils/biz/image-selector.tsx @@ -0,0 +1,49 @@ +import { FormItem, Input, Modal } from '@arco-design/web-vue'; + +const VALIDATE_REGEXP = /^http(s)?:\/\/[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:[0-9]{1,5})?[-a-zA-Z0-9()@:%_\\\+\.~#?&//=]*$/; +const MAX_LENGTH = 8182; + +export interface SelectImageOptions { + /** 弹窗标题。 */ + title?: string; +} + +/** + * 选择图片。 + * @param options 选项 + * @returns 图片地址 + */ +export function selectImage(options?: SelectImageOptions): Promise { + return new Promise((resolve) => { + const input = ref(''); + const status: Ref<'error' | undefined> = ref(undefined); + + function handleInput() { + if (VALIDATE_REGEXP.test(input.value)) status.value = undefined; + else status.value = 'error'; + } + + Modal.open({ + title: options?.title ?? '选择图片', + content: () => ( + status.value === 'error' ? '请输入正确的图片链接' : undefined + }} + > + input.value = v} + onChange={handleInput} + /> + + ), + onCancel: () => resolve(undefined), + onOk: () => resolve(input.value), + }); + }); +} diff --git a/utils/biz/user-selector.tsx b/utils/biz/user-selector.tsx new file mode 100644 index 0000000..333149e --- /dev/null +++ b/utils/biz/user-selector.tsx @@ -0,0 +1,60 @@ +import { Button, FormItem, InputNumber, Modal } from '@arco-design/web-vue'; +import { ChatMember, Guild } from 'fanbook-api-node-sdk'; +import FbGuildPicker from '~/components/fb/guild-picker.vue'; + +export interface SelectUserOptions { + /** 弹窗标题。 */ + title?: string; + /** 默认的服务器。 */ + defaultGuild?: Guild; + /** 是否隐藏服务器选择器。 */ + hideGuild?: boolean; +} + +export function selectUser(options?: SelectUserOptions): Promise { + return new Promise((resolve) => { + const guild = ref(options?.defaultGuild); + const selectingGuild = ref(false); + const id: Ref = ref(); + const user: Ref = ref(); + + async function handleIdChange(value?: number) { + if (!value || !guild.value) { + user.value = undefined; + return; + } + [user.value] = await getCurrentBot().getMembersByShortIds( + BigInt(guild.value.guild_id), + [value], + ); + } + + Modal.open({ + title: options?.title ?? '选择用户', + content: () => (<> + {!options?.hideGuild && guild ? `已选择:${guild.value?.name}` : '', + }}> + guild.value = v} onClose={() => selectingGuild.value = false} /> + + } + + '#', + }} + /> + + ), + onOk: () => resolve(user.value), + onCancel: () => resolve(undefined), + }); + }); +} diff --git a/utils/component.ts b/utils/component.ts deleted file mode 100644 index 2520e0e..0000000 --- a/utils/component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ComputedOptions, MethodOptions, render } from 'vue'; -import { RawChildren, RawProps, RawSlots } from '~/utils/util'; - -/** - * 渲染组件到 `document.body`。 - * @param comp 组件 - * @param props 传入的 props - * @param children 子组件、插槽 - * @returns 组件实例 - */ -export function renderComponent

( - comp: Component, - props?: (Component extends Component ? P : never)['$props'] | null, - children?: RawChildren | RawSlots, -) { - const el = h

(comp, props, children); - render(el, document.body); - return el; -} diff --git a/utils/feature/credit.ts b/utils/feature/credit.ts new file mode 100644 index 0000000..e69de29 diff --git a/utils/util.ts b/utils/util.ts index 9bfbfae..3ef3e95 100644 --- a/utils/util.ts +++ b/utils/util.ts @@ -1,27 +1,11 @@ /** 其他通用工具。 */ -import { VNodeArrayChildren, VNodeProps } from 'vue'; - -export type RawProps = VNodeProps & { - __v_isVNode?: never; - [Symbol.iterator]?: never; -} & Record; -export type RawSlots = { - [name: string]: unknown; - $stable?: boolean; - /* removed internal: _ctx */ - /* removed internal: _ */ -}; -export type RawChildren = string | number | boolean | VNode | VNodeArrayChildren | (() => any); - -/*** `interface` 转 `type`。 */ -export type ToType = { - [K in keyof T]: T[K]; -}; - /** 是否开发环境。 */ export const DEV = import.meta.env.DEV; +/** logo 图片地址。 */ +export const LOGO_URL = '/logo.png'; + /** * 尝试将字符串转为 `BigInt`,失败则返回 `undefined`。 * @param value 要转换的字符串