Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
6a327b5d22 | |||
a97750a542 | |||
57bd8409cd | |||
c4464e1202 | |||
eca669d62a |
@ -2,14 +2,6 @@
|
|||||||
<html lang="zh-CN">
|
<html lang="zh-CN">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<title>AO3 Mirror</title>
|
|
||||||
<meta name="description" content="ArchiveOfOurOwn 镜像站, 使用 Vue 3 与 MDUI 2 重写界面, 优化 UI/UX" />
|
|
||||||
<meta name="author" content="UnknownMp" />
|
|
||||||
<meta property="og:title" content="AO3 Mirror">
|
|
||||||
<meta property="og:description" content="ArchiveOfOurOwn 镜像站">
|
|
||||||
<meta property="og:image" content="https://cdn.unknownmp.top/website/ao3mirror.svg">
|
|
||||||
<meta property="og:url" content="https://ao3.unknownmp.top">
|
|
||||||
<meta property="og:type" content="website">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<link rel="icon" type="image/svg" href="/favicon.svg" />
|
<link rel="icon" type="image/svg" href="/favicon.svg" />
|
||||||
<!--app-head-->
|
<!--app-head-->
|
||||||
|
493
package-lock.json
generated
493
package-lock.json
generated
@ -8,25 +8,25 @@
|
|||||||
"name": "ao3-mirror-ssr",
|
"name": "ao3-mirror-ssr",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mdui/icons": "^1.0.2",
|
"@mdui/icons": "^1.0.3",
|
||||||
"@vueuse/core": "^13.3.0",
|
"@vueuse/core": "^13.3.0",
|
||||||
"@vueuse/integrations": "^13.3.0",
|
"@vueuse/integrations": "^13.3.0",
|
||||||
"axios": "^1.9.0",
|
"axios": "^1.9.0",
|
||||||
"compress-json": "^3.1.1",
|
"compress-json": "^3.1.2",
|
||||||
"cookie-parser": "^1.4.7",
|
"cookie-parser": "^1.4.7",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"mdui": "^2.1.4",
|
"mdui": "^2.1.4",
|
||||||
"pinia": "^3.0.2",
|
"pinia": "^3.0.3",
|
||||||
"vue": "^3.5.15",
|
"vue": "^3.5.16",
|
||||||
"vue-router": "^4.5.1"
|
"vue-router": "^4.5.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vitejs/plugin-vue": "^5.2.4",
|
"@vitejs/plugin-vue": "^5.2.4",
|
||||||
"@vitejs/plugin-vue-jsx": "^4.1.2",
|
"@vitejs/plugin-vue-jsx": "^4.2.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"markdown-it-anchor": "^9.2.0",
|
"markdown-it-anchor": "^9.2.0",
|
||||||
"markdown-it-attrs": "^4.3.1",
|
"markdown-it-attrs": "^4.3.1",
|
||||||
"sass": "^1.89.0",
|
"sass": "^1.89.1",
|
||||||
"vite": "^6.3.5",
|
"vite": "^6.3.5",
|
||||||
"vite-plugin-md": "^0.21.5",
|
"vite-plugin-md": "^0.21.5",
|
||||||
"vite-plugin-vue-devtools": "^7.7.6"
|
"vite-plugin-vue-devtools": "^7.7.6"
|
||||||
@ -55,44 +55,44 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/code-frame": {
|
"node_modules/@babel/code-frame": {
|
||||||
"version": "7.26.2",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.26.2.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz",
|
||||||
"integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
|
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-validator-identifier": "^7.25.9",
|
"@babel/helper-validator-identifier": "^7.27.1",
|
||||||
"js-tokens": "^4.0.0",
|
"js-tokens": "^4.0.0",
|
||||||
"picocolors": "^1.0.0"
|
"picocolors": "^1.1.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/compat-data": {
|
"node_modules/@babel/compat-data": {
|
||||||
"version": "7.26.8",
|
"version": "7.27.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.26.8.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.27.5.tgz",
|
||||||
"integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
|
"integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/core": {
|
"node_modules/@babel/core": {
|
||||||
"version": "7.26.9",
|
"version": "7.27.4",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.26.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.27.4.tgz",
|
||||||
"integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
|
"integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ampproject/remapping": "^2.2.0",
|
"@ampproject/remapping": "^2.2.0",
|
||||||
"@babel/code-frame": "^7.26.2",
|
"@babel/code-frame": "^7.27.1",
|
||||||
"@babel/generator": "^7.26.9",
|
"@babel/generator": "^7.27.3",
|
||||||
"@babel/helper-compilation-targets": "^7.26.5",
|
"@babel/helper-compilation-targets": "^7.27.2",
|
||||||
"@babel/helper-module-transforms": "^7.26.0",
|
"@babel/helper-module-transforms": "^7.27.3",
|
||||||
"@babel/helpers": "^7.26.9",
|
"@babel/helpers": "^7.27.4",
|
||||||
"@babel/parser": "^7.26.9",
|
"@babel/parser": "^7.27.4",
|
||||||
"@babel/template": "^7.26.9",
|
"@babel/template": "^7.27.2",
|
||||||
"@babel/traverse": "^7.26.9",
|
"@babel/traverse": "^7.27.4",
|
||||||
"@babel/types": "^7.26.9",
|
"@babel/types": "^7.27.3",
|
||||||
"convert-source-map": "^2.0.0",
|
"convert-source-map": "^2.0.0",
|
||||||
"debug": "^4.1.0",
|
"debug": "^4.1.0",
|
||||||
"gensync": "^1.0.0-beta.2",
|
"gensync": "^1.0.0-beta.2",
|
||||||
@ -131,13 +131,13 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@babel/generator": {
|
"node_modules/@babel/generator": {
|
||||||
"version": "7.26.9",
|
"version": "7.27.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.26.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.27.5.tgz",
|
||||||
"integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==",
|
"integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/parser": "^7.26.9",
|
"@babel/parser": "^7.27.5",
|
||||||
"@babel/types": "^7.26.9",
|
"@babel/types": "^7.27.3",
|
||||||
"@jridgewell/gen-mapping": "^0.3.5",
|
"@jridgewell/gen-mapping": "^0.3.5",
|
||||||
"@jridgewell/trace-mapping": "^0.3.25",
|
"@jridgewell/trace-mapping": "^0.3.25",
|
||||||
"jsesc": "^3.0.2"
|
"jsesc": "^3.0.2"
|
||||||
@ -147,25 +147,25 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-annotate-as-pure": {
|
"node_modules/@babel/helper-annotate-as-pure": {
|
||||||
"version": "7.25.9",
|
"version": "7.27.3",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
|
||||||
"integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
|
"integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/types": "^7.25.9"
|
"@babel/types": "^7.27.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-compilation-targets": {
|
"node_modules/@babel/helper-compilation-targets": {
|
||||||
"version": "7.26.5",
|
"version": "7.27.2",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
|
||||||
"integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
|
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/compat-data": "^7.26.5",
|
"@babel/compat-data": "^7.27.2",
|
||||||
"@babel/helper-validator-option": "^7.25.9",
|
"@babel/helper-validator-option": "^7.27.1",
|
||||||
"browserslist": "^4.24.0",
|
"browserslist": "^4.24.0",
|
||||||
"lru-cache": "^5.1.1",
|
"lru-cache": "^5.1.1",
|
||||||
"semver": "^6.3.1"
|
"semver": "^6.3.1"
|
||||||
@ -175,17 +175,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-create-class-features-plugin": {
|
"node_modules/@babel/helper-create-class-features-plugin": {
|
||||||
"version": "7.26.9",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz",
|
||||||
"integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==",
|
"integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-annotate-as-pure": "^7.25.9",
|
"@babel/helper-annotate-as-pure": "^7.27.1",
|
||||||
"@babel/helper-member-expression-to-functions": "^7.25.9",
|
"@babel/helper-member-expression-to-functions": "^7.27.1",
|
||||||
"@babel/helper-optimise-call-expression": "^7.25.9",
|
"@babel/helper-optimise-call-expression": "^7.27.1",
|
||||||
"@babel/helper-replace-supers": "^7.26.5",
|
"@babel/helper-replace-supers": "^7.27.1",
|
||||||
"@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
|
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
|
||||||
"@babel/traverse": "^7.26.9",
|
"@babel/traverse": "^7.27.1",
|
||||||
"semver": "^6.3.1"
|
"semver": "^6.3.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@ -196,40 +196,40 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-member-expression-to-functions": {
|
"node_modules/@babel/helper-member-expression-to-functions": {
|
||||||
"version": "7.25.9",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz",
|
||||||
"integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
|
"integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/traverse": "^7.25.9",
|
"@babel/traverse": "^7.27.1",
|
||||||
"@babel/types": "^7.25.9"
|
"@babel/types": "^7.27.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-module-imports": {
|
"node_modules/@babel/helper-module-imports": {
|
||||||
"version": "7.25.9",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
|
||||||
"integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
|
"integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/traverse": "^7.25.9",
|
"@babel/traverse": "^7.27.1",
|
||||||
"@babel/types": "^7.25.9"
|
"@babel/types": "^7.27.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-module-transforms": {
|
"node_modules/@babel/helper-module-transforms": {
|
||||||
"version": "7.26.0",
|
"version": "7.27.3",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
|
||||||
"integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
|
"integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-module-imports": "^7.25.9",
|
"@babel/helper-module-imports": "^7.27.1",
|
||||||
"@babel/helper-validator-identifier": "^7.25.9",
|
"@babel/helper-validator-identifier": "^7.27.1",
|
||||||
"@babel/traverse": "^7.25.9"
|
"@babel/traverse": "^7.27.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@ -239,35 +239,35 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-optimise-call-expression": {
|
"node_modules/@babel/helper-optimise-call-expression": {
|
||||||
"version": "7.25.9",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
|
||||||
"integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
|
"integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/types": "^7.25.9"
|
"@babel/types": "^7.27.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-plugin-utils": {
|
"node_modules/@babel/helper-plugin-utils": {
|
||||||
"version": "7.26.5",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
|
||||||
"integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
|
"integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-replace-supers": {
|
"node_modules/@babel/helper-replace-supers": {
|
||||||
"version": "7.26.5",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz",
|
||||||
"integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
|
"integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-member-expression-to-functions": "^7.25.9",
|
"@babel/helper-member-expression-to-functions": "^7.27.1",
|
||||||
"@babel/helper-optimise-call-expression": "^7.25.9",
|
"@babel/helper-optimise-call-expression": "^7.27.1",
|
||||||
"@babel/traverse": "^7.26.5"
|
"@babel/traverse": "^7.27.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@ -277,13 +277,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
|
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
|
||||||
"version": "7.25.9",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
|
||||||
"integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
|
"integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/traverse": "^7.25.9",
|
"@babel/traverse": "^7.27.1",
|
||||||
"@babel/types": "^7.25.9"
|
"@babel/types": "^7.27.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@ -306,31 +306,31 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-validator-option": {
|
"node_modules/@babel/helper-validator-option": {
|
||||||
"version": "7.25.9",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
|
||||||
"integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
|
"integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helpers": {
|
"node_modules/@babel/helpers": {
|
||||||
"version": "7.26.9",
|
"version": "7.27.6",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.26.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.27.6.tgz",
|
||||||
"integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
|
"integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/template": "^7.26.9",
|
"@babel/template": "^7.27.2",
|
||||||
"@babel/types": "^7.26.9"
|
"@babel/types": "^7.27.6"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/parser": {
|
"node_modules/@babel/parser": {
|
||||||
"version": "7.27.3",
|
"version": "7.27.5",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.3.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.5.tgz",
|
||||||
"integrity": "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw==",
|
"integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/types": "^7.27.3"
|
"@babel/types": "^7.27.3"
|
||||||
},
|
},
|
||||||
@ -416,12 +416,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-syntax-typescript": {
|
"node_modules/@babel/plugin-syntax-typescript": {
|
||||||
"version": "7.25.9",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz",
|
||||||
"integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
|
"integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-plugin-utils": "^7.25.9"
|
"@babel/helper-plugin-utils": "^7.27.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@ -431,16 +431,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-transform-typescript": {
|
"node_modules/@babel/plugin-transform-typescript": {
|
||||||
"version": "7.26.8",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz",
|
||||||
"integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==",
|
"integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-annotate-as-pure": "^7.25.9",
|
"@babel/helper-annotate-as-pure": "^7.27.1",
|
||||||
"@babel/helper-create-class-features-plugin": "^7.25.9",
|
"@babel/helper-create-class-features-plugin": "^7.27.1",
|
||||||
"@babel/helper-plugin-utils": "^7.26.5",
|
"@babel/helper-plugin-utils": "^7.27.1",
|
||||||
"@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
|
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
|
||||||
"@babel/plugin-syntax-typescript": "^7.25.9"
|
"@babel/plugin-syntax-typescript": "^7.27.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@ -450,30 +450,30 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/template": {
|
"node_modules/@babel/template": {
|
||||||
"version": "7.26.9",
|
"version": "7.27.2",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.26.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz",
|
||||||
"integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
|
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.26.2",
|
"@babel/code-frame": "^7.27.1",
|
||||||
"@babel/parser": "^7.26.9",
|
"@babel/parser": "^7.27.2",
|
||||||
"@babel/types": "^7.26.9"
|
"@babel/types": "^7.27.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/traverse": {
|
"node_modules/@babel/traverse": {
|
||||||
"version": "7.26.9",
|
"version": "7.27.4",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.26.9.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.27.4.tgz",
|
||||||
"integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==",
|
"integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.26.2",
|
"@babel/code-frame": "^7.27.1",
|
||||||
"@babel/generator": "^7.26.9",
|
"@babel/generator": "^7.27.3",
|
||||||
"@babel/parser": "^7.26.9",
|
"@babel/parser": "^7.27.4",
|
||||||
"@babel/template": "^7.26.9",
|
"@babel/template": "^7.27.2",
|
||||||
"@babel/types": "^7.26.9",
|
"@babel/types": "^7.27.3",
|
||||||
"debug": "^4.3.1",
|
"debug": "^4.3.1",
|
||||||
"globals": "^11.1.0"
|
"globals": "^11.1.0"
|
||||||
},
|
},
|
||||||
@ -505,9 +505,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@babel/types": {
|
"node_modules/@babel/types": {
|
||||||
"version": "7.27.3",
|
"version": "7.27.6",
|
||||||
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.3.tgz",
|
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.6.tgz",
|
||||||
"integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==",
|
"integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-string-parser": "^7.27.1",
|
"@babel/helper-string-parser": "^7.27.1",
|
||||||
"@babel/helper-validator-identifier": "^7.27.1"
|
"@babel/helper-validator-identifier": "^7.27.1"
|
||||||
@ -1022,13 +1022,13 @@
|
|||||||
"integrity": "sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g=="
|
"integrity": "sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g=="
|
||||||
},
|
},
|
||||||
"node_modules/@mdui/icons": {
|
"node_modules/@mdui/icons": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmmirror.com/@mdui/icons/-/icons-1.0.2.tgz",
|
"resolved": "https://registry.npmmirror.com/@mdui/icons/-/icons-1.0.3.tgz",
|
||||||
"integrity": "sha512-2Ffhka9dbJIq0wQo+daUjG2CGLRStRE4ngf3Me8PVurQCQEd4QI2Qb9nblACOFoK0/ZYy+u77uYM9yuoDSvxXA==",
|
"integrity": "sha512-Jq9juUqIJMBvIRSTr0qBKiqnlbY5pVUzUP20EHSN8dT7GcqN7bq0AL8MASL5DxKs09kgcERq+z5bHJOkz/VDlA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mdui/shared": "^1.0.2",
|
"@mdui/shared": "^1.0.8",
|
||||||
"lit": "^3.0.0",
|
"lit": "^3.3.0",
|
||||||
"tslib": "^2.6.2"
|
"tslib": "^2.8.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@mdui/jq": {
|
"node_modules/@mdui/jq": {
|
||||||
@ -1389,6 +1389,12 @@
|
|||||||
"integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
|
"integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/@rolldown/pluginutils": {
|
||||||
|
"version": "1.0.0-beta.13",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.13.tgz",
|
||||||
|
"integrity": "sha512-/9TBv7Ir9ojO1mDlTy35X0GSGqvP+aRa44i2fciAK/EEJeimvJyL6eN2Ug2RwXEGFVumgZh231PeykYjo2WBtw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/@rollup/pluginutils": {
|
"node_modules/@rollup/pluginutils": {
|
||||||
"version": "5.1.4",
|
"version": "5.1.4",
|
||||||
"resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
|
"resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
|
||||||
@ -1752,14 +1758,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vitejs/plugin-vue-jsx": {
|
"node_modules/@vitejs/plugin-vue-jsx": {
|
||||||
"version": "4.1.2",
|
"version": "4.2.0",
|
||||||
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.1.2.tgz",
|
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.2.0.tgz",
|
||||||
"integrity": "sha512-4Rk0GdE0QCdsIkuMmWeg11gmM4x8UmTnZR/LWPm7QJ7+BsK4tq08udrN0isrrWqz5heFy9HLV/7bOLgFS8hUjA==",
|
"integrity": "sha512-DSTrmrdLp+0LDNF77fqrKfx7X0ErRbOcUAgJL/HbSesqQwoUvUQ4uYQqaex+rovqgGcoPqVk+AwUh3v9CuiYIw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/core": "^7.26.7",
|
"@babel/core": "^7.27.1",
|
||||||
"@babel/plugin-transform-typescript": "^7.26.7",
|
"@babel/plugin-transform-typescript": "^7.27.1",
|
||||||
"@vue/babel-plugin-jsx": "^1.2.5"
|
"@rolldown/pluginutils": "^1.0.0-beta.9",
|
||||||
|
"@vue/babel-plugin-jsx": "^1.4.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.0.0 || >=20.0.0"
|
"node": "^18.0.0 || >=20.0.0"
|
||||||
@ -1770,27 +1777,26 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/babel-helper-vue-transform-on": {
|
"node_modules/@vue/babel-helper-vue-transform-on": {
|
||||||
"version": "1.2.5",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.4.0.tgz",
|
||||||
"integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==",
|
"integrity": "sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@vue/babel-plugin-jsx": {
|
"node_modules/@vue/babel-plugin-jsx": {
|
||||||
"version": "1.2.5",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.4.0.tgz",
|
||||||
"integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==",
|
"integrity": "sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-module-imports": "^7.24.7",
|
"@babel/helper-module-imports": "^7.25.9",
|
||||||
"@babel/helper-plugin-utils": "^7.24.8",
|
"@babel/helper-plugin-utils": "^7.26.5",
|
||||||
"@babel/plugin-syntax-jsx": "^7.24.7",
|
"@babel/plugin-syntax-jsx": "^7.25.9",
|
||||||
"@babel/template": "^7.25.0",
|
"@babel/template": "^7.26.9",
|
||||||
"@babel/traverse": "^7.25.6",
|
"@babel/traverse": "^7.26.9",
|
||||||
"@babel/types": "^7.25.6",
|
"@babel/types": "^7.26.9",
|
||||||
"@vue/babel-helper-vue-transform-on": "1.2.5",
|
"@vue/babel-helper-vue-transform-on": "1.4.0",
|
||||||
"@vue/babel-plugin-resolve-type": "1.2.5",
|
"@vue/babel-plugin-resolve-type": "1.4.0",
|
||||||
"html-tags": "^3.3.1",
|
"@vue/shared": "^3.5.13"
|
||||||
"svg-tags": "^1.0.0"
|
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@babel/core": "^7.0.0-0"
|
"@babel/core": "^7.0.0-0"
|
||||||
@ -1802,52 +1808,55 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/babel-plugin-resolve-type": {
|
"node_modules/@vue/babel-plugin-resolve-type": {
|
||||||
"version": "1.2.5",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.4.0.tgz",
|
||||||
"integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==",
|
"integrity": "sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.24.7",
|
"@babel/code-frame": "^7.26.2",
|
||||||
"@babel/helper-module-imports": "^7.24.7",
|
"@babel/helper-module-imports": "^7.25.9",
|
||||||
"@babel/helper-plugin-utils": "^7.24.8",
|
"@babel/helper-plugin-utils": "^7.26.5",
|
||||||
"@babel/parser": "^7.25.6",
|
"@babel/parser": "^7.26.9",
|
||||||
"@vue/compiler-sfc": "^3.5.3"
|
"@vue/compiler-sfc": "^3.5.13"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sxzz"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@babel/core": "^7.0.0-0"
|
"@babel/core": "^7.0.0-0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/compiler-core": {
|
"node_modules/@vue/compiler-core": {
|
||||||
"version": "3.5.15",
|
"version": "3.5.16",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.15.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.16.tgz",
|
||||||
"integrity": "sha512-nGRc6YJg/kxNqbv/7Tg4juirPnjHvuVdhcmDvQWVZXlLHjouq7VsKmV1hIxM/8yKM0VUfwT/Uzc0lO510ltZqw==",
|
"integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/parser": "^7.27.2",
|
"@babel/parser": "^7.27.2",
|
||||||
"@vue/shared": "3.5.15",
|
"@vue/shared": "3.5.16",
|
||||||
"entities": "^4.5.0",
|
"entities": "^4.5.0",
|
||||||
"estree-walker": "^2.0.2",
|
"estree-walker": "^2.0.2",
|
||||||
"source-map-js": "^1.2.1"
|
"source-map-js": "^1.2.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/compiler-dom": {
|
"node_modules/@vue/compiler-dom": {
|
||||||
"version": "3.5.15",
|
"version": "3.5.16",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.15.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz",
|
||||||
"integrity": "sha512-ZelQd9n+O/UCBdL00rlwCrsArSak+YLZpBVuNDio1hN3+wrCshYZEDUO3khSLAzPbF1oQS2duEoMDUHScUlYjA==",
|
"integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/compiler-core": "3.5.15",
|
"@vue/compiler-core": "3.5.16",
|
||||||
"@vue/shared": "3.5.15"
|
"@vue/shared": "3.5.16"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/compiler-sfc": {
|
"node_modules/@vue/compiler-sfc": {
|
||||||
"version": "3.5.15",
|
"version": "3.5.16",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.15.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz",
|
||||||
"integrity": "sha512-3zndKbxMsOU6afQWer75Zot/aydjtxNj0T2KLg033rAFaQUn2PGuE32ZRe4iMhflbTcAxL0yEYsRWFxtPro8RQ==",
|
"integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/parser": "^7.27.2",
|
"@babel/parser": "^7.27.2",
|
||||||
"@vue/compiler-core": "3.5.15",
|
"@vue/compiler-core": "3.5.16",
|
||||||
"@vue/compiler-dom": "3.5.15",
|
"@vue/compiler-dom": "3.5.16",
|
||||||
"@vue/compiler-ssr": "3.5.15",
|
"@vue/compiler-ssr": "3.5.16",
|
||||||
"@vue/shared": "3.5.15",
|
"@vue/shared": "3.5.16",
|
||||||
"estree-walker": "^2.0.2",
|
"estree-walker": "^2.0.2",
|
||||||
"magic-string": "^0.30.17",
|
"magic-string": "^0.30.17",
|
||||||
"postcss": "^8.5.3",
|
"postcss": "^8.5.3",
|
||||||
@ -1855,12 +1864,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/compiler-ssr": {
|
"node_modules/@vue/compiler-ssr": {
|
||||||
"version": "3.5.15",
|
"version": "3.5.16",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.15.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz",
|
||||||
"integrity": "sha512-gShn8zRREZbrXqTtmLSCffgZXDWv8nHc/GhsW+mbwBfNZL5pI96e7IWcIq8XGQe1TLtVbu7EV9gFIVSmfyarPg==",
|
"integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/compiler-dom": "3.5.15",
|
"@vue/compiler-dom": "3.5.16",
|
||||||
"@vue/shared": "3.5.15"
|
"@vue/shared": "3.5.16"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/devtools-api": {
|
"node_modules/@vue/devtools-api": {
|
||||||
@ -1926,49 +1935,49 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/reactivity": {
|
"node_modules/@vue/reactivity": {
|
||||||
"version": "3.5.15",
|
"version": "3.5.16",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.15.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.16.tgz",
|
||||||
"integrity": "sha512-GaA5VUm30YWobCwpvcs9nvFKf27EdSLKDo2jA0IXzGS344oNpFNbEQ9z+Pp5ESDaxyS8FcH0vFN/XSe95BZtHQ==",
|
"integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/shared": "3.5.15"
|
"@vue/shared": "3.5.16"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/runtime-core": {
|
"node_modules/@vue/runtime-core": {
|
||||||
"version": "3.5.15",
|
"version": "3.5.16",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.15.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.16.tgz",
|
||||||
"integrity": "sha512-CZAlIOQ93nj0OPpWWOx4+QDLCMzBNY85IQR4Voe6vIID149yF8g9WQaWnw042f/6JfvLttK7dnyWlC1EVCRK8Q==",
|
"integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/reactivity": "3.5.15",
|
"@vue/reactivity": "3.5.16",
|
||||||
"@vue/shared": "3.5.15"
|
"@vue/shared": "3.5.16"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/runtime-dom": {
|
"node_modules/@vue/runtime-dom": {
|
||||||
"version": "3.5.15",
|
"version": "3.5.16",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.15.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz",
|
||||||
"integrity": "sha512-wFplHKzKO/v998up2iCW3RN9TNUeDMhdBcNYZgs5LOokHntrB48dyuZHspcahKZczKKh3v6i164gapMPxBTKNw==",
|
"integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/reactivity": "3.5.15",
|
"@vue/reactivity": "3.5.16",
|
||||||
"@vue/runtime-core": "3.5.15",
|
"@vue/runtime-core": "3.5.16",
|
||||||
"@vue/shared": "3.5.15",
|
"@vue/shared": "3.5.16",
|
||||||
"csstype": "^3.1.3"
|
"csstype": "^3.1.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/server-renderer": {
|
"node_modules/@vue/server-renderer": {
|
||||||
"version": "3.5.15",
|
"version": "3.5.16",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.15.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.16.tgz",
|
||||||
"integrity": "sha512-Gehc693kVTYkLt6QSYEjGvqvdK2zZ/gf/D5zkgmvBdeB30dNnVZS8yY7+IlBmHRd1rR/zwaqeu06Ij04ZxBscg==",
|
"integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/compiler-ssr": "3.5.15",
|
"@vue/compiler-ssr": "3.5.16",
|
||||||
"@vue/shared": "3.5.15"
|
"@vue/shared": "3.5.16"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"vue": "3.5.15"
|
"vue": "3.5.16"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/shared": {
|
"node_modules/@vue/shared": {
|
||||||
"version": "3.5.15",
|
"version": "3.5.16",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.15.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.16.tgz",
|
||||||
"integrity": "sha512-bKvgFJJL1ZX9KxMCTQY6xD9Dhe3nusd1OhyOb1cJYGqvAr0Vg8FIjHPMOEVbJ9GDT9HG+Bjdn4oS8ohKP8EvoA=="
|
"integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg=="
|
||||||
},
|
},
|
||||||
"node_modules/@vueuse/core": {
|
"node_modules/@vueuse/core": {
|
||||||
"version": "13.3.0",
|
"version": "13.3.0",
|
||||||
@ -2766,9 +2775,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/browserslist": {
|
"node_modules/browserslist": {
|
||||||
"version": "4.24.4",
|
"version": "4.25.0",
|
||||||
"resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.4.tgz",
|
"resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.25.0.tgz",
|
||||||
"integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
|
"integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -2785,10 +2794,10 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"caniuse-lite": "^1.0.30001688",
|
"caniuse-lite": "^1.0.30001718",
|
||||||
"electron-to-chromium": "^1.5.73",
|
"electron-to-chromium": "^1.5.160",
|
||||||
"node-releases": "^2.0.19",
|
"node-releases": "^2.0.19",
|
||||||
"update-browserslist-db": "^1.1.1"
|
"update-browserslist-db": "^1.1.3"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"browserslist": "cli.js"
|
"browserslist": "cli.js"
|
||||||
@ -2915,9 +2924,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001701",
|
"version": "1.0.30001721",
|
||||||
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz",
|
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz",
|
||||||
"integrity": "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==",
|
"integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -3004,9 +3013,9 @@
|
|||||||
"peer": true
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/compress-json": {
|
"node_modules/compress-json": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.2",
|
||||||
"resolved": "https://registry.npmmirror.com/compress-json/-/compress-json-3.1.1.tgz",
|
"resolved": "https://registry.npmmirror.com/compress-json/-/compress-json-3.1.2.tgz",
|
||||||
"integrity": "sha512-PfW4WPGnWXXfcT0mvT9Y92Jsw95aK+eIb+XWXJC45DX2KNYRXeq5kw/FRkkFTHinXm4IwleABsjS5LNHLaxk0Q=="
|
"integrity": "sha512-wj8WsM4qAMdGeNDvtqhm8Npk4JseNi+qx3oV8ez6+J66IaUQgrxC+3Ci59bUDR3hWsW9VA3tHtC2Abid8HigIw=="
|
||||||
},
|
},
|
||||||
"node_modules/content-disposition": {
|
"node_modules/content-disposition": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
@ -3223,9 +3232,9 @@
|
|||||||
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
|
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.5.109",
|
"version": "1.5.165",
|
||||||
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.109.tgz",
|
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz",
|
||||||
"integrity": "sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==",
|
"integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/encodeurl": {
|
"node_modules/encodeurl": {
|
||||||
@ -3858,18 +3867,6 @@
|
|||||||
"resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz",
|
"resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz",
|
||||||
"integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="
|
"integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="
|
||||||
},
|
},
|
||||||
"node_modules/html-tags": {
|
|
||||||
"version": "3.3.1",
|
|
||||||
"resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz",
|
|
||||||
"integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
|
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=8"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/http-errors": {
|
"node_modules/http-errors": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz",
|
||||||
@ -4632,9 +4629,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/pinia": {
|
"node_modules/pinia": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.2.tgz",
|
"resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.3.tgz",
|
||||||
"integrity": "sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==",
|
"integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/devtools-api": "^7.7.2"
|
"@vue/devtools-api": "^7.7.2"
|
||||||
},
|
},
|
||||||
@ -4958,9 +4955,9 @@
|
|||||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||||
},
|
},
|
||||||
"node_modules/sass": {
|
"node_modules/sass": {
|
||||||
"version": "1.89.0",
|
"version": "1.89.1",
|
||||||
"resolved": "https://registry.npmmirror.com/sass/-/sass-1.89.0.tgz",
|
"resolved": "https://registry.npmmirror.com/sass/-/sass-1.89.1.tgz",
|
||||||
"integrity": "sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==",
|
"integrity": "sha512-eMLLkl+qz7tx/0cJ9wI+w09GQ2zodTkcE/aVfywwdlRcI3EO19xGnbmJwg/JMIm+5MxVJ6outddLZ4Von4E++Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chokidar": "^4.0.0",
|
"chokidar": "^4.0.0",
|
||||||
@ -5286,12 +5283,6 @@
|
|||||||
"node": ">=16"
|
"node": ">=16"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/svg-tags": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/terser": {
|
"node_modules/terser": {
|
||||||
"version": "5.39.0",
|
"version": "5.39.0",
|
||||||
"resolved": "https://registry.npmmirror.com/terser/-/terser-5.39.0.tgz",
|
"resolved": "https://registry.npmmirror.com/terser/-/terser-5.39.0.tgz",
|
||||||
@ -6235,15 +6226,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vue": {
|
"node_modules/vue": {
|
||||||
"version": "3.5.15",
|
"version": "3.5.16",
|
||||||
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.15.tgz",
|
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.16.tgz",
|
||||||
"integrity": "sha512-aD9zK4rB43JAMK/5BmS4LdPiEp8Fdh8P1Ve/XNuMF5YRf78fCyPE6FUbQwcaWQ5oZ1R2CD9NKE0FFOVpMR7gEQ==",
|
"integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/compiler-dom": "3.5.15",
|
"@vue/compiler-dom": "3.5.16",
|
||||||
"@vue/compiler-sfc": "3.5.15",
|
"@vue/compiler-sfc": "3.5.16",
|
||||||
"@vue/runtime-dom": "3.5.15",
|
"@vue/runtime-dom": "3.5.16",
|
||||||
"@vue/server-renderer": "3.5.15",
|
"@vue/server-renderer": "3.5.16",
|
||||||
"@vue/shared": "3.5.15"
|
"@vue/shared": "3.5.16"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"typescript": "*"
|
"typescript": "*"
|
||||||
|
12
package.json
12
package.json
@ -11,25 +11,25 @@
|
|||||||
"preview": "cross-env NODE_ENV=production PORT=5174 HOST=:: node server"
|
"preview": "cross-env NODE_ENV=production PORT=5174 HOST=:: node server"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mdui/icons": "^1.0.2",
|
"@mdui/icons": "^1.0.3",
|
||||||
"@vueuse/core": "^13.3.0",
|
"@vueuse/core": "^13.3.0",
|
||||||
"@vueuse/integrations": "^13.3.0",
|
"@vueuse/integrations": "^13.3.0",
|
||||||
"axios": "^1.9.0",
|
"axios": "^1.9.0",
|
||||||
"compress-json": "^3.1.1",
|
"compress-json": "^3.1.2",
|
||||||
"cookie-parser": "^1.4.7",
|
"cookie-parser": "^1.4.7",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"mdui": "^2.1.4",
|
"mdui": "^2.1.4",
|
||||||
"pinia": "^3.0.2",
|
"pinia": "^3.0.3",
|
||||||
"vue": "^3.5.15",
|
"vue": "^3.5.16",
|
||||||
"vue-router": "^4.5.1"
|
"vue-router": "^4.5.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vitejs/plugin-vue": "^5.2.4",
|
"@vitejs/plugin-vue": "^5.2.4",
|
||||||
"@vitejs/plugin-vue-jsx": "^4.1.2",
|
"@vitejs/plugin-vue-jsx": "^4.2.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"markdown-it-anchor": "^9.2.0",
|
"markdown-it-anchor": "^9.2.0",
|
||||||
"markdown-it-attrs": "^4.3.1",
|
"markdown-it-attrs": "^4.3.1",
|
||||||
"sass": "^1.89.0",
|
"sass": "^1.89.1",
|
||||||
"vite": "^6.3.5",
|
"vite": "^6.3.5",
|
||||||
"vite-plugin-md": "^0.21.5",
|
"vite-plugin-md": "^0.21.5",
|
||||||
"vite-plugin-vue-devtools": "^7.7.6"
|
"vite-plugin-vue-devtools": "^7.7.6"
|
||||||
|
69
server.js
69
server.js
@ -2,17 +2,15 @@ import fs from 'node:fs/promises'
|
|||||||
import express from 'express'
|
import express from 'express'
|
||||||
import cookieParser from 'cookie-parser'
|
import cookieParser from 'cookie-parser'
|
||||||
import { compress } from 'compress-json'
|
import { compress } from 'compress-json'
|
||||||
// Constants
|
|
||||||
const isProduction = process.env.NODE_ENV === 'production'
|
const isProduction = process.env.NODE_ENV === 'production'
|
||||||
const port = process.env.PORT || 5173
|
const port = process.env.PORT || 5173
|
||||||
const base = process.env.BASE || '/'
|
const base = process.env.BASE || '/'
|
||||||
|
|
||||||
// Cached production assets
|
|
||||||
const templateHtml = isProduction
|
const templateHtml = isProduction
|
||||||
? await fs.readFile('./dist/client/index.html', 'utf-8')
|
? await fs.readFile('./dist/client/index.html', 'utf-8')
|
||||||
: ''
|
: ''
|
||||||
|
|
||||||
// Create http server
|
|
||||||
const app = express()
|
const app = express()
|
||||||
app.use(cookieParser());
|
app.use(cookieParser());
|
||||||
|
|
||||||
@ -21,8 +19,6 @@ const MESSAGE = {
|
|||||||
0: 'Unknown'
|
0: 'Unknown'
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add Vite or respective production middlewares
|
|
||||||
/** @type {import('vite').ViteDevServer | undefined} */
|
|
||||||
let vite
|
let vite
|
||||||
if (!isProduction) {
|
if (!isProduction) {
|
||||||
const { createServer } = await import('vite')
|
const { createServer } = await import('vite')
|
||||||
@ -33,20 +29,18 @@ if (!isProduction) {
|
|||||||
})
|
})
|
||||||
app.use(vite.middlewares)
|
app.use(vite.middlewares)
|
||||||
} else {
|
} else {
|
||||||
//const compression = (await import('compression')).default
|
|
||||||
const sirv = (await import('sirv')).default
|
const sirv = (await import('sirv')).default
|
||||||
//app.use(compression())
|
|
||||||
app.use(base, sirv('./dist/client', { extensions: [] }))
|
app.use(base, sirv('./dist/client', { extensions: [] }))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Serve HTML
|
app.set('trust proxy', true);
|
||||||
|
|
||||||
app.use('*all', async (req, res) => {
|
app.use('*all', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const url = req.originalUrl.replace(base, '')
|
const url = req.originalUrl.replace(base, '')
|
||||||
console.log(`Request ${url}`)
|
const ua = req.get('User-Agent');
|
||||||
/** @type {string} */
|
console.log(`${req.ip} /${url} "${ua}"`)
|
||||||
let template
|
let template
|
||||||
/** @type {import('./src/entry-server.js').render} */
|
|
||||||
let render, getRoute
|
let render, getRoute
|
||||||
if (!isProduction) {
|
if (!isProduction) {
|
||||||
// Always read fresh template in development
|
// Always read fresh template in development
|
||||||
@ -61,21 +55,65 @@ app.use('*all', async (req, res) => {
|
|||||||
render = module.render
|
render = module.render
|
||||||
getRoute = module.getRoute
|
getRoute = module.getRoute
|
||||||
}
|
}
|
||||||
const { router, code } = await getRoute(url)
|
const { router, code, title, metas, meta } = await getRoute(url)
|
||||||
if (code != 200 && !req.accepts('html')) {
|
if (code != 200 && !req.accepts('html')) {
|
||||||
res.status(code).set({ 'Content-Type': 'text/plain' })
|
res.status(code).set({ 'Content-Type': 'text/plain' })
|
||||||
res.write(MESSAGE[code] || MESSAGE[0])
|
res.write(MESSAGE[code] || MESSAGE[0])
|
||||||
res.end()
|
res.end()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const { stream, piniaState } = await render(router, req.cookies, req.headers.host)
|
const { stream, piniaState, headState } = await render(router, req.cookies, req.headers.host)
|
||||||
const [htmlStart, htmlEnd] = template.split('<!--app-html-->')
|
const [htmlStart, htmlEnd] = template.split('<!--app-html-->')
|
||||||
|
if (meta) {
|
||||||
|
const buffer = []
|
||||||
|
let headReady = false
|
||||||
|
for await (const chunk of stream) {
|
||||||
|
if (res.closed) break
|
||||||
|
if (headReady) res.write(chunk)
|
||||||
|
else {
|
||||||
|
if (headState.ready) {
|
||||||
|
res.status(headState.code || code).set({ 'Content-Type': 'text/html' })
|
||||||
|
const heads = [`<title>${ headState.title || title }</title>`]
|
||||||
|
for (const item of [ ...metas, ...headState.meta ]) {
|
||||||
|
const properties = []
|
||||||
|
for (const [key, value] of Object.entries(item)) properties.push(`${key}="${value}"`)
|
||||||
|
heads.push(`<meta ${properties.join(' ')}>`)
|
||||||
|
}
|
||||||
|
res.write(htmlStart.replace('<!--app-head-->',heads.join('')))
|
||||||
|
for (const item of buffer) res.write(item)
|
||||||
|
res.write(chunk)
|
||||||
|
headReady = true
|
||||||
|
} else buffer.push(chunk)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!headState.ready) {
|
||||||
|
console.warn('Page not set meta ready! No stream render at all!')
|
||||||
|
const heads = [`<title>${ title }</title>`]
|
||||||
|
for (const item of metas) {
|
||||||
|
const properties = []
|
||||||
|
for (const [key, value] of Object.entries(item)) properties.push(`${key}="${value}"`)
|
||||||
|
heads.push(`<meta ${properties.join(' ')}>`)
|
||||||
|
}
|
||||||
|
res.write(htmlStart.replace('<!--app-head-->',heads.join('')))
|
||||||
|
for await (const chunk of buffer) {
|
||||||
|
if (res.closed) break
|
||||||
|
res.write(chunk)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
res.status(code).set({ 'Content-Type': 'text/html' })
|
res.status(code).set({ 'Content-Type': 'text/html' })
|
||||||
res.write(htmlStart)
|
const heads = [`<title>${ title }</title>`]
|
||||||
|
for (const item of metas) {
|
||||||
|
const properties = []
|
||||||
|
for (const [key, value] of Object.entries(item)) properties.push(`${key}="${value}"`)
|
||||||
|
heads.push(`<meta ${properties.join(' ')}>`)
|
||||||
|
}
|
||||||
|
res.write(htmlStart.replace('<!--app-head-->',heads.join('')))
|
||||||
for await (const chunk of stream) {
|
for await (const chunk of stream) {
|
||||||
if (res.closed) break
|
if (res.closed) break
|
||||||
res.write(chunk)
|
res.write(chunk)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
const piniaStateContent = JSON.stringify(compress(piniaState))
|
const piniaStateContent = JSON.stringify(compress(piniaState))
|
||||||
const stateScript = `<script>window.__PINIA_STATE__=${piniaStateContent}</script>`
|
const stateScript = `<script>window.__PINIA_STATE__=${piniaStateContent}</script>`
|
||||||
res.write(htmlEnd.replace('<!--app-state-->', stateScript))
|
res.write(htmlEnd.replace('<!--app-state-->', stateScript))
|
||||||
@ -87,7 +125,6 @@ app.use('*all', async (req, res) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// Start http server
|
|
||||||
app.listen(port, () => {
|
app.listen(port, () => {
|
||||||
console.log(`Server started at http://localhost:${port}`)
|
console.log(`Server started at port ${port}`)
|
||||||
})
|
})
|
||||||
|
@ -20,9 +20,7 @@ function replaceUrl(url) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function useApiRequest(method, url, data, config = {}) {
|
export function useApiRequest(method, url, data, config = {}) {
|
||||||
const start = Date.now()
|
|
||||||
const baseURL = getEndpoint()
|
const baseURL = getEndpoint()
|
||||||
// 若为 GET 请求,将 data 转为查询参数拼接到 URL 上
|
|
||||||
const fullURL = method === 'GET' && data
|
const fullURL = method === 'GET' && data
|
||||||
? `${baseURL}${url}?${objectToQueryString(data)}`
|
? `${baseURL}${url}?${objectToQueryString(data)}`
|
||||||
: `${baseURL}${url}`
|
: `${baseURL}${url}`
|
||||||
@ -45,14 +43,14 @@ export function useApiRequest(method, url, data, config = {}) {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
const exec = async () => {
|
const exec = async () => {
|
||||||
await execute()
|
const start = Date.now()
|
||||||
|
try { await execute() }
|
||||||
|
catch (e) {}
|
||||||
const stop = Date.now()
|
const stop = Date.now()
|
||||||
return {
|
return {
|
||||||
status: response.value?.status || (error.value?.response?.status ?? -1),
|
status: response.value?.status || (error.value?.response?.status ?? -1),
|
||||||
data: response.value?.data || error.value?.response?.data || null,
|
data: response.value?.data || error.value?.response?.data || null,
|
||||||
duration: stop - start,
|
duration: stop - start,
|
||||||
start,
|
|
||||||
stop,
|
|
||||||
error: error.value,
|
error: error.value,
|
||||||
isSSR: import.meta.env.SSR,
|
isSSR: import.meta.env.SSR,
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { renderToWebStream } from 'vue/server-renderer'
|
import { renderToWebStream } from 'vue/server-renderer'
|
||||||
import { createApp } from './main'
|
import { createApp } from './main'
|
||||||
|
|
||||||
import { createSSRRouter } from './router.js'
|
import { createSSRRouter, defaultHead } from './router.js'
|
||||||
|
|
||||||
export async function getRoute(_url) {
|
export async function getRoute(_url) {
|
||||||
const router = createSSRRouter()
|
const router = createSSRRouter()
|
||||||
@ -9,15 +9,24 @@ export async function getRoute(_url) {
|
|||||||
await router.isReady()
|
await router.isReady()
|
||||||
const route = router.currentRoute.value.matched[0]
|
const route = router.currentRoute.value.matched[0]
|
||||||
const code = route.meta.code || 200
|
const code = route.meta.code || 200
|
||||||
return { router, code }
|
return { router, code, meta: route.meta.meta || false,
|
||||||
|
title: route.meta.title || route.meta.name || defaultHead.title,
|
||||||
|
metas: [...defaultHead.meta, ...route.meta.metas || []]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function render(router, cookies, host) {
|
export async function render(router, cookies, host) {
|
||||||
const { app, pinia } = createApp()
|
const { app, pinia } = createApp()
|
||||||
app.use(router)
|
app.use(router)
|
||||||
const ctx = { cookies, host }
|
const headState = {
|
||||||
|
ready: false,
|
||||||
|
code: null,
|
||||||
|
title: null,
|
||||||
|
meta: []
|
||||||
|
}
|
||||||
|
const ctx = { cookies, host, headState }
|
||||||
const stream = renderToWebStream(app, ctx)
|
const stream = renderToWebStream(app, ctx)
|
||||||
const piniaState = pinia.state.value
|
const piniaState = pinia.state.value
|
||||||
return { stream, piniaState }
|
return { stream, piniaState, headState }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,25 @@
|
|||||||
import { createMemoryHistory, createWebHistory, createRouter } from 'vue-router'
|
import { createMemoryHistory, createWebHistory, createRouter } from 'vue-router'
|
||||||
|
|
||||||
|
export const defaultHead = {
|
||||||
|
title: 'AO3 Mirror',
|
||||||
|
meta: [
|
||||||
|
{ name: 'description',
|
||||||
|
content: 'ArchiveOfOurOwn 镜像站, 使用 Vue 3 与 MDUI 2 重写界面, 优化 UI/UX' },
|
||||||
|
{ name: 'author',
|
||||||
|
content: 'UnknownMp' },
|
||||||
|
{ property: 'og:title',
|
||||||
|
content: 'AO3 Mirror' },
|
||||||
|
{ property: 'og:description',
|
||||||
|
content: 'ArchiveOfOurOwn 重构镜像' },
|
||||||
|
{ property: 'og:image',
|
||||||
|
content: 'https://cdn.unknownmp.top/website/ao3mirror.svg' },
|
||||||
|
{ property: 'og:url',
|
||||||
|
content: 'https://ao3.unknownmp.top' },
|
||||||
|
{ property: 'og:type',
|
||||||
|
content: 'website' },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
export const createSSRRouter = () => createRouter({
|
export const createSSRRouter = () => createRouter({
|
||||||
history: import.meta.env.SSR ? createMemoryHistory() : createWebHistory(),
|
history: import.meta.env.SSR ? createMemoryHistory() : createWebHistory(),
|
||||||
scrollBehavior(to, from, savedPosition) {
|
scrollBehavior(to, from, savedPosition) {
|
||||||
@ -25,7 +45,8 @@ export const createSSRRouter = () => createRouter({
|
|||||||
component: () => import('./views/Work.vue'),
|
component: () => import('./views/Work.vue'),
|
||||||
meta: {
|
meta: {
|
||||||
title: '阅读',
|
title: '阅读',
|
||||||
hidden: true
|
hidden: true,
|
||||||
|
meta: true
|
||||||
}
|
}
|
||||||
},{
|
},{
|
||||||
path: '/work/:id/:cid',
|
path: '/work/:id/:cid',
|
||||||
@ -33,7 +54,8 @@ export const createSSRRouter = () => createRouter({
|
|||||||
component: () => import('./views/Work.vue'),
|
component: () => import('./views/Work.vue'),
|
||||||
meta: {
|
meta: {
|
||||||
title: '阅读',
|
title: '阅读',
|
||||||
hidden: true
|
hidden: true,
|
||||||
|
meta: true
|
||||||
}
|
}
|
||||||
},{
|
},{
|
||||||
path: '/search/simple',
|
path: '/search/simple',
|
||||||
@ -48,7 +70,6 @@ export const createSSRRouter = () => createRouter({
|
|||||||
name: '设置',
|
name: '设置',
|
||||||
component: () => import('./views/Settings.vue'),
|
component: () => import('./views/Settings.vue'),
|
||||||
meta: {
|
meta: {
|
||||||
title: '设置',
|
|
||||||
order: 90
|
order: 90
|
||||||
},
|
},
|
||||||
},{
|
},{
|
||||||
@ -56,7 +77,6 @@ export const createSSRRouter = () => createRouter({
|
|||||||
name: '关于',
|
name: '关于',
|
||||||
component: () => import('./views/About.md'),
|
component: () => import('./views/About.md'),
|
||||||
meta: {
|
meta: {
|
||||||
title: '',
|
|
||||||
order: 100
|
order: 100
|
||||||
},
|
},
|
||||||
},{
|
},{
|
||||||
@ -64,7 +84,6 @@ export const createSSRRouter = () => createRouter({
|
|||||||
name: '开发人员选项',
|
name: '开发人员选项',
|
||||||
component: () => import('./views/Developer.vue'),
|
component: () => import('./views/Developer.vue'),
|
||||||
meta: {
|
meta: {
|
||||||
title: '',
|
|
||||||
hidden: true
|
hidden: true
|
||||||
},
|
},
|
||||||
},{
|
},{
|
||||||
|
47
src/ssr/headHelper.js
Normal file
47
src/ssr/headHelper.js
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import { useSSRContext } from 'vue'
|
||||||
|
|
||||||
|
export function useHeadHelper() {
|
||||||
|
if (!import.meta.env.SSR) {
|
||||||
|
return {
|
||||||
|
headReady: () => {},
|
||||||
|
setMeta: () => {},
|
||||||
|
addMeta: () => {},
|
||||||
|
setTitle: () => {},
|
||||||
|
setCode: () => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const ssrContext = useSSRContext()
|
||||||
|
|
||||||
|
if (!ssrContext || !ssrContext.headState) {
|
||||||
|
return {
|
||||||
|
headReady: () => {},
|
||||||
|
setMeta: () => {},
|
||||||
|
addMeta: () => {},
|
||||||
|
setTitle: () => {},
|
||||||
|
setCode: () => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
headReady: () => {
|
||||||
|
ssrContext.headState.ready = true
|
||||||
|
},
|
||||||
|
setMeta: (metas = []) => {
|
||||||
|
ssrContext.headState.meta = [
|
||||||
|
...ssrContext.headState.meta,
|
||||||
|
...metas
|
||||||
|
]
|
||||||
|
},
|
||||||
|
addMeta: (meta) => {
|
||||||
|
ssrContext.headState.meta.push(meta)
|
||||||
|
},
|
||||||
|
setTitle: (title) => {
|
||||||
|
ssrContext.headState.title = title
|
||||||
|
},
|
||||||
|
setCode: (code) => {
|
||||||
|
ssrContext.headState.code = code
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,6 +2,8 @@ import { ref, computed, watch } from 'vue'
|
|||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import { useRouter, useRoute } from 'vue-router'
|
import { useRouter, useRoute } from 'vue-router'
|
||||||
|
|
||||||
|
import { useHeadHelper } from '../ssr/headHelper.js'
|
||||||
|
|
||||||
export const useRouteStore = defineStore('route', () => {
|
export const useRouteStore = defineStore('route', () => {
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
@ -16,7 +18,9 @@ export const useRouteStore = defineStore('route', () => {
|
|||||||
)
|
)
|
||||||
const lastFromDrawer = ref(0)
|
const lastFromDrawer = ref(0)
|
||||||
const customTitle = ref(null)
|
const customTitle = ref(null)
|
||||||
const title = computed(() => customTitle.value || route.meta.title || route.name)
|
const title = import.meta.env.SSR ?
|
||||||
|
computed(() => route.meta.title || route.name) :
|
||||||
|
computed(() => customTitle.value || route.meta.title || route.name)
|
||||||
function drawerPress(target) {
|
function drawerPress(target) {
|
||||||
if (lastFromDrawer.value == 0) {
|
if (lastFromDrawer.value == 0) {
|
||||||
lastFromDrawer.value = 1
|
lastFromDrawer.value = 1
|
||||||
|
@ -15,6 +15,8 @@ export const useWorkReadState = defineStore('workRead', () => {
|
|||||||
const text = ref(null)
|
const text = ref(null)
|
||||||
const state = ref('')
|
const state = ref('')
|
||||||
const publishedTime = ref(null)
|
const publishedTime = ref(null)
|
||||||
|
const completedTime = ref(null)
|
||||||
|
const updatedTime = ref(null)
|
||||||
const wordCount = ref(0)
|
const wordCount = ref(0)
|
||||||
const kudoCount = ref(0)
|
const kudoCount = ref(0)
|
||||||
const hitCount = ref(0)
|
const hitCount = ref(0)
|
||||||
@ -32,6 +34,8 @@ export const useWorkReadState = defineStore('workRead', () => {
|
|||||||
pseud.value = data.pseud
|
pseud.value = data.pseud
|
||||||
text.value = data.text
|
text.value = data.text
|
||||||
publishedTime.value = data.stats.publishedTime
|
publishedTime.value = data.stats.publishedTime
|
||||||
|
completedTime.value = data.stats.completedTime
|
||||||
|
updatedTime.value = data.stats.updatedTime
|
||||||
wordCount.value = data.stats.wordCount
|
wordCount.value = data.stats.wordCount
|
||||||
kudoCount.value = data.stats.kudoCount
|
kudoCount.value = data.stats.kudoCount
|
||||||
hitCount.value = data.stats.hitCount
|
hitCount.value = data.stats.hitCount
|
||||||
@ -62,29 +66,24 @@ export const useWorkReadState = defineStore('workRead', () => {
|
|||||||
if (result.status == 200) {
|
if (result.status == 200) {
|
||||||
setData(result.data)
|
setData(result.data)
|
||||||
state.value = 'ready'
|
state.value = 'ready'
|
||||||
} else {
|
} else if (result.status == 404) {
|
||||||
id.value = target
|
|
||||||
state.value = import.meta.env.SSR ? 'ssrnotfound' : 'notfound'
|
state.value = import.meta.env.SSR ? 'ssrnotfound' : 'notfound'
|
||||||
|
} else if (result.status == 401) {
|
||||||
|
state.value = 'unauth'
|
||||||
|
} else if (result.status == 500) {
|
||||||
|
state.value = 'error'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
id, cid,
|
id, cid,
|
||||||
title,
|
title, summary,
|
||||||
summary,
|
pseud, text, state,
|
||||||
pseud,
|
|
||||||
text,
|
|
||||||
state,
|
|
||||||
publishedTime,
|
publishedTime,
|
||||||
wordCount,
|
completedTime,
|
||||||
kudoCount,
|
updatedTime,
|
||||||
hitCount,
|
wordCount, kudoCount, hitCount,
|
||||||
category,
|
category, fandom, lang,
|
||||||
fandom,
|
chapters, chapterIndex, chapterStat,
|
||||||
lang,
|
setData, loadWork
|
||||||
chapters,
|
|
||||||
chapterIndex,
|
|
||||||
chapterStat,
|
|
||||||
setData,
|
|
||||||
loadWork
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -21,17 +21,18 @@ onUnmounted(() => console.log('Unmounted'))*/
|
|||||||
---
|
---
|
||||||
一个 AO3 镜像站, 优化了 UI/UX
|
一个 AO3 镜像站, 优化了 UI/UX
|
||||||
|
|
||||||
作者 (1)
|
作者 {#contact}
|
||||||
---
|
---
|
||||||
- [UnknownMp](https://www.unknownmp.top)
|
- [UnknownMp](https://www.unknownmp.top)
|
||||||
|
邮件: unknownmp@unknownmp.top
|
||||||
<mdui-avatar src="https://cdn.unknownmp.top/website/logo.jpg"></mdui-avatar>
|
<mdui-avatar src="https://cdn.unknownmp.top/website/logo.jpg"></mdui-avatar>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
源代码
|
源代码
|
||||||
---
|
---
|
||||||
- 前端 Vue3 + Vite 6 (SSR) + MDUI 2 [Gitea](https://git.unknownmp.top/default/ao3-mirror-ssr)
|
- 前端 Vue3 + Vite 6 (SSR) + MDUI 2 [Gitea](https://git.unknownmp.top/AO3-Mirror/ao3-mirror-ssr)
|
||||||
- 后端 FastAPI + HttpX + LXML *(暂无仓库)*
|
- 后端 FastAPI + HttpX + LXML [Gitea](https://git.unknownmp.top/AO3-Mirror/ao3-mirror-api)
|
||||||
|
|
||||||
组件库与工具链
|
组件库与工具链
|
||||||
---
|
---
|
||||||
@ -49,7 +50,7 @@ onUnmounted(() => console.log('Unmounted'))*/
|
|||||||
|
|
||||||
### 书签 {#deprecated-feature-bookmark}
|
### 书签 {#deprecated-feature-bookmark}
|
||||||
|
|
||||||
因为底层 IndexedDB 更新困难和作品段落解析困难问题, 所以在 [**v1.0.7**](https://git.unknownmp.top/default/ao3-mirror-ssr/releases/tag/v1.0.7) 以后的版本废弃了书签机制
|
因为底层 IndexedDB 更新困难和作品段落解析困难问题, 所以在 [**v1.0.7**](https://git.unknownmp.top/AO3-Mirror/ao3-mirror-ssr/releases/tag/v1.0.7) 以后的版本废弃了书签机制
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -4,6 +4,8 @@ import { useRouter, useRoute } from 'vue-router'
|
|||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
||||||
|
import { useHeadHelper } from '../ssr/headHelper.js'
|
||||||
|
|
||||||
import { useWorkReadState } from '@/stores/workRead.js'
|
import { useWorkReadState } from '@/stores/workRead.js'
|
||||||
import { useRouteStore } from '@/stores/route.js'
|
import { useRouteStore } from '@/stores/route.js'
|
||||||
|
|
||||||
@ -43,11 +45,23 @@ const categoryName = {
|
|||||||
fm: '女/男'
|
fm: '女/男'
|
||||||
}
|
}
|
||||||
|
|
||||||
onServerPrefetch(async () => await workReadState.loadWork(route.params.id, route.params.cid))
|
onServerPrefetch(async () => {
|
||||||
|
const headHelper = useHeadHelper()
|
||||||
|
await workReadState.loadWork(route.params.id, route.params.cid)
|
||||||
|
if (workReadState.state == 'ready') headHelper.setTitle(workReadState.title)
|
||||||
|
else if (workReadState.state == 'ssrnotfound') {
|
||||||
|
headHelper.setTitle('文章未找到')
|
||||||
|
headHelper.setCode(404)
|
||||||
|
} else if (workReadState.state == 'unauth') {
|
||||||
|
headHelper.setTitle('访问被阻止')
|
||||||
|
headHelper.setCode(401)
|
||||||
|
}
|
||||||
|
headHelper.headReady()
|
||||||
|
})
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
watch(() => workReadState.state, (value) => { if (value == 'ready') routeState.customTitle = workReadState.title })
|
watch(() => workReadState.state, (value) => { if (value == 'ready') routeState.customTitle = workReadState.title })
|
||||||
if (workReadState.state != 'ssrnotfound') await workReadState.loadWork(route.params.id, route.params.cid)
|
if (workReadState.state != 'ssrnotfound' && workReadState.state != 'ready') await workReadState.loadWork(route.params.id, route.params.cid)
|
||||||
if (workReadState.state == 'ready') {
|
if (workReadState.state == 'ready') {
|
||||||
routeState.customTitle = workReadState.title
|
routeState.customTitle = workReadState.title
|
||||||
if (workReadState.cid !== null && parseInt(route.params.cid) != workReadState.cid) {
|
if (workReadState.cid !== null && parseInt(route.params.cid) != workReadState.cid) {
|
||||||
@ -94,11 +108,6 @@ async function switchWorkWithIndex(target) {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<ClientOnly>
|
|
||||||
<template v-if="workReadState.state == 'loading'">
|
|
||||||
加载中...<br/>
|
|
||||||
<mdui-linear-progress></mdui-linear-progress>
|
|
||||||
</template>
|
|
||||||
<template v-if="workReadState.state == 'notfound' || workReadState.state == 'ssrnotfound'">
|
<template v-if="workReadState.state == 'notfound' || workReadState.state == 'ssrnotfound'">
|
||||||
<h2>文章不存在...</h2>
|
<h2>文章不存在...</h2>
|
||||||
是不是链接没有复制完全?<br/>
|
是不是链接没有复制完全?<br/>
|
||||||
@ -107,20 +116,41 @@ async function switchWorkWithIndex(target) {
|
|||||||
CID: {{ workReadState.cid }}
|
CID: {{ workReadState.cid }}
|
||||||
</template>
|
</template>
|
||||||
<a @click="$router.back()">返回</a>
|
<a @click="$router.back()">返回</a>
|
||||||
</template>
|
</template><template v-if="workReadState.state == 'unauth'">
|
||||||
<template v-if="workReadState.state == 'errformat'">
|
<h2>访问被阻止!</h2>
|
||||||
|
上游 AO3 不允许匿名用户访问该作品<br/>
|
||||||
|
ID: {{workReadState.id}}<br/>
|
||||||
|
<template v-if="workReadState.cid">
|
||||||
|
CID: {{ workReadState.cid }}
|
||||||
|
</template><br/>
|
||||||
|
<a @click="$router.back()">返回</a>
|
||||||
|
</template><template v-if="workReadState.state == 'error'">
|
||||||
|
<h2>内部服务器错误</h2>
|
||||||
|
这种情况不是你的问题, 而是我给网站写的屎山代码发力了, 在 <a href="/about#contact">这里</a> 联系我修复此问题<br/>
|
||||||
|
并提供以下信息:<br/>
|
||||||
|
ID: {{workReadState.id}}<br/>
|
||||||
|
<template v-if="workReadState.cid">
|
||||||
|
CID: {{ workReadState.cid }}
|
||||||
|
</template><br/>
|
||||||
|
<a @click="$router.back()">返回</a>
|
||||||
|
</template><template v-if="workReadState.state == 'errformat'">
|
||||||
<h2>路径格式错误</h2>
|
<h2>路径格式错误</h2>
|
||||||
ID: {{ $route.params.id }}<br/>
|
ID: {{ $route.params.id }}<br/>
|
||||||
<template v-if="$route.params.id">
|
<template v-if="$route.params.id">
|
||||||
CID: {{ $route.params.id }}
|
CID: {{ $route.params.id }}
|
||||||
</template><br/>
|
</template><br/>
|
||||||
<a @click="$router.back()">返回</a>
|
<a @click="$router.back()">返回</a>
|
||||||
|
</template><ClientOnly>
|
||||||
|
<template v-if="workReadState.state == 'loading'">
|
||||||
|
加载中...<br/>
|
||||||
|
<mdui-linear-progress></mdui-linear-progress>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="workReadState.state == 'ready'">
|
<template v-if="workReadState.state == 'ready'">
|
||||||
<article>
|
<article>
|
||||||
<h1 style="margin: auto">{{ workReadState.title }}</h1>
|
<h1>{{ workReadState.title }}</h1>
|
||||||
<h4>{{ workReadState.pesud }}</h4>
|
<h4>{{ workReadState.pseud }}</h4>
|
||||||
<mdui-card style="margin: 8px; padding: 16px;">
|
<a target="_blank" :href="workReadState.cid ? `https://archiveofourown.org/works/${workReadState.id}/chapters/${workReadState.cid}` : `https://archiveofourown.org/works/${workReadState.id}`">原 AO3 链接</a>
|
||||||
|
<mdui-card style="margin: 8px 0px; padding: 16px;">
|
||||||
<strong>作品信息</strong><dl>
|
<strong>作品信息</strong><dl>
|
||||||
<template v-if="workReadState.category"><dt>分类</dt><ul>
|
<template v-if="workReadState.category"><dt>分类</dt><ul>
|
||||||
<li v-for="item in workReadState.category" :key="item">
|
<li v-for="item in workReadState.category" :key="item">
|
||||||
@ -130,16 +160,30 @@ async function switchWorkWithIndex(target) {
|
|||||||
<li v-for="item in workReadState.fandom" :key="item">
|
<li v-for="item in workReadState.fandom" :key="item">
|
||||||
{{ item }}</li>
|
{{ item }}</li>
|
||||||
</ul></template>
|
</ul></template>
|
||||||
|
<template v-if="workReadState.additionalTags"><dt>附加 Tag</dt><ul>
|
||||||
|
<li v-for="item in workReadState.additionalTags" :key="item">
|
||||||
|
{{ item }}</li>
|
||||||
|
</ul></template>
|
||||||
<dt>语言</dt><dd>
|
<dt>语言</dt><dd>
|
||||||
{{ workReadState.lang }}
|
{{ workReadState.lang }}
|
||||||
</dd>
|
</dd>
|
||||||
</dl><Hr/>
|
</dl><Hr/>
|
||||||
<strong>作品状态</strong><dl>
|
<strong>作品状态</strong><dl>
|
||||||
<dt>发布时间</dt><dd>
|
<dt>发布</dt><dd>
|
||||||
{{ workReadState.publishedTime.year }} -
|
{{ workReadState.publishedTime.year }} -
|
||||||
{{ workReadState.publishedTime.month }} -
|
{{ workReadState.publishedTime.month }} -
|
||||||
{{ workReadState.publishedTime.date }}
|
{{ workReadState.publishedTime.date }}
|
||||||
</dd>
|
</dd>
|
||||||
|
<template v-if="workReadState.completedTime"><dt>完成</dt><dd>
|
||||||
|
{{ workReadState.completedTime.year }} -
|
||||||
|
{{ workReadState.completedTime.month }} -
|
||||||
|
{{ workReadState.completedTime.date }}
|
||||||
|
</dd></template>
|
||||||
|
<template v-if="workReadState.updatedTime"><dt>更新</dt><dd>
|
||||||
|
{{ workReadState.updatedTime.year }} -
|
||||||
|
{{ workReadState.updatedTime.month }} -
|
||||||
|
{{ workReadState.updatedTime.date }}
|
||||||
|
</dd></template>
|
||||||
<dt>字数</dt><dd>
|
<dt>字数</dt><dd>
|
||||||
{{ workReadState.wordCount }}
|
{{ workReadState.wordCount }}
|
||||||
</dd>
|
</dd>
|
||||||
@ -198,18 +242,9 @@ async function switchWorkWithIndex(target) {
|
|||||||
</mdui-dialog>
|
</mdui-dialog>
|
||||||
</template>
|
</template>
|
||||||
<template #ssr>
|
<template #ssr>
|
||||||
<template v-if="workReadState.state == 'notfound' || workReadState.state == 'ssrnotfound'">
|
|
||||||
<h2>文章不存在...</h2>
|
|
||||||
是不是链接没有复制完全?<br/>
|
|
||||||
ID: {{workReadState.id}}<br/>
|
|
||||||
<template v-if="workReadState.cid">
|
|
||||||
CID: {{ workReadState.cid }}
|
|
||||||
</template>
|
|
||||||
<a @click="$router.back()">返回</a>
|
|
||||||
</template>
|
|
||||||
<template v-if="workReadState.state == 'ready'">
|
<template v-if="workReadState.state == 'ready'">
|
||||||
<h2>{{ workReadState.title }}</h2>
|
<h2>{{ workReadState.title }}</h2>
|
||||||
<h4>{{ workReadState.pesud }}</h4>
|
<h4>{{ workReadState.pseud }}</h4>
|
||||||
<dl>
|
<dl>
|
||||||
<template v-if="workReadState.category"><dt>分类</dt><ul>
|
<template v-if="workReadState.category"><dt>分类</dt><ul>
|
||||||
<li v-for="item in workReadState.category" :key="item">
|
<li v-for="item in workReadState.category" :key="item">
|
||||||
@ -222,11 +257,21 @@ async function switchWorkWithIndex(target) {
|
|||||||
<dt>语言</dt><dd>
|
<dt>语言</dt><dd>
|
||||||
{{ workReadState.lang }}
|
{{ workReadState.lang }}
|
||||||
</dd>
|
</dd>
|
||||||
<dt>发布时间</dt><dd>
|
<dt>发布</dt><dd>
|
||||||
{{ workReadState.publishedTime.year }} -
|
{{ workReadState.publishedTime.year }} -
|
||||||
{{ workReadState.publishedTime.month }} -
|
{{ workReadState.publishedTime.month }} -
|
||||||
{{ workReadState.publishedTime.date }}
|
{{ workReadState.publishedTime.date }}
|
||||||
</dd>
|
</dd>
|
||||||
|
<template v-if="workReadState.completedTime"><dt>完成</dt><dd>
|
||||||
|
{{ workReadState.completedTime.year }} -
|
||||||
|
{{ workReadState.completedTime.month }} -
|
||||||
|
{{ workReadState.completedTime.date }}
|
||||||
|
</dd></template>
|
||||||
|
<template v-if="workReadState.updatedTime"><dt>更新</dt><dd>
|
||||||
|
{{ workReadState.updatedTime.year }} -
|
||||||
|
{{ workReadState.updatedTime.month }} -
|
||||||
|
{{ workReadState.updatedTime.date }}
|
||||||
|
</dd></template>
|
||||||
<dt>字数</dt><dd>
|
<dt>字数</dt><dd>
|
||||||
{{ workReadState.wordCount }}
|
{{ workReadState.wordCount }}
|
||||||
</dd>
|
</dd>
|
||||||
|
Reference in New Issue
Block a user