refactor: restructure project configuration and utility modules

- Move configuration and utility files to more organized locations
- Update import paths across the project to reflect new file structure
- Simplify content and internationalization utilities
- Remove redundant configuration files and consolidate logic
- Add prefetch configuration to Astro config for improved performance
This commit is contained in:
radishzzz 2025-01-25 08:19:31 +00:00
parent a26031d490
commit fc1daf4335
23 changed files with 380 additions and 393 deletions

View file

@ -18,7 +18,7 @@ import remarkGithubAdmonitionsToDirectives from 'remark-github-admonitions-to-di
import remarkMath from 'remark-math'
import remarkSectionize from 'remark-sectionize'
import UnoCSS from 'unocss/astro'
import { themeConfig } from './src/config'
import { themeConfig } from './src/config.js'
// Local plugins
import { AdmonitionComponent } from './src/plugins/rehype-component-admonition.mjs'
import { GithubCardComponent } from './src/plugins/rehype-component-github-card.mjs'
@ -34,6 +34,10 @@ const { locale } = themeConfig.global
export default defineConfig({
site: url,
base: '/',
prefetch: {
prefetchAll: true,
defaultStrategy: 'viewport',
},
i18n: {
locales: Object.entries(langMap).map(([path, codes]) => ({
path,

View file

@ -51,8 +51,8 @@
"@types/sanitize-html": "^2.13.0",
"@unocss/eslint-plugin": "^65.4.3",
"@unocss/preset-attributify": "^65.4.3",
"astro-eslint-parser": "^1.1.0",
"eslint": "^9.18.0",
"astro-eslint-parser": "^1.2.0",
"eslint": "^9.19.0",
"eslint-plugin-astro": "^1.3.1",
"lint-staged": "^15.4.2",
"mdast-util-to-string": "^4.0.0",

385
pnpm-lock.yaml generated
View file

@ -98,7 +98,7 @@ importers:
devDependencies:
'@antfu/eslint-config':
specifier: ^3.16.0
version: 3.16.0(@typescript-eslint/utils@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(@unocss/eslint-plugin@65.4.3(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(@vue/compiler-sfc@3.5.13)(astro-eslint-parser@1.1.0(typescript@5.7.3))(eslint-plugin-astro@1.3.1(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
version: 3.16.0(@typescript-eslint/utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(@unocss/eslint-plugin@65.4.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(@vue/compiler-sfc@3.5.13)(astro-eslint-parser@1.2.0)(eslint-plugin-astro@1.3.1(eslint@9.19.0(jiti@2.4.2)))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
'@types/markdown-it':
specifier: ^14.1.2
version: 14.1.2
@ -110,19 +110,19 @@ importers:
version: 2.13.0
'@unocss/eslint-plugin':
specifier: ^65.4.3
version: 65.4.3(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
version: 65.4.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
'@unocss/preset-attributify':
specifier: ^65.4.3
version: 65.4.3
astro-eslint-parser:
specifier: ^1.1.0
version: 1.1.0(typescript@5.7.3)
specifier: ^1.2.0
version: 1.2.0
eslint:
specifier: ^9.18.0
version: 9.18.0(jiti@2.4.2)
specifier: ^9.19.0
version: 9.19.0(jiti@2.4.2)
eslint-plugin-astro:
specifier: ^1.3.1
version: 1.3.1(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
version: 1.3.1(eslint@9.19.0(jiti@2.4.2))
lint-staged:
specifier: ^15.4.2
version: 15.4.2
@ -268,13 +268,13 @@ packages:
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
'@babel/parser@7.26.5':
resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==}
'@babel/parser@7.26.7':
resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==}
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/types@7.26.5':
resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==}
'@babel/types@7.26.7':
resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==}
engines: {node: '>=6.9.0'}
'@clack/core@0.4.1':
@ -646,8 +646,8 @@ packages:
resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/js@9.18.0':
resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==}
'@eslint/js@9.19.0':
resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/markdown@6.2.2':
@ -976,6 +976,10 @@ packages:
'@shikijs/vscode-textmate@10.0.1':
resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==}
'@sindresorhus/merge-streams@2.3.0':
resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==}
engines: {node: '>=18'}
'@stylistic/eslint-plugin@2.13.0':
resolution: {integrity: sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@ -1342,10 +1346,6 @@ packages:
array-iterate@2.0.1:
resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
array-union@2.1.0:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
engines: {node: '>=8'}
astring@1.9.0:
resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
hasBin: true
@ -1353,8 +1353,8 @@ packages:
astro-compress@2.3.6:
resolution: {integrity: sha512-P93OXRRykS2iLGN20KAr1tJUAUGptKOnUybqg00/8N4aHrZxR76giBhK/C9RCLm8tsnxL0nR5FCXR53MUza9Mg==}
astro-eslint-parser@1.1.0:
resolution: {integrity: sha512-F6NW1RJo5pp2kPnnM97M5Ohw8zAGjv83MpxHqfAochH68n/kiXN57+hYaNUCA7XkScoVNr6yzvly3hsY34TGfQ==}
astro-eslint-parser@1.2.0:
resolution: {integrity: sha512-LmJ63+AsDEBjo1rXFe87rxqhvMCS3W756oGBDqg83+FAOqGPjj1OncpCcn1OPqOhk5MyENkx3w0H6TrDgXEgPQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
astro-robots-txt@1.0.0:
@ -1581,8 +1581,8 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
crossws@0.3.2:
resolution: {integrity: sha512-S2PpQHRcgYABOS2465b34wqTOn5dbLL+iSvyweJYGGFLDsKq88xrjDXUiEhfYkhWZq1HuS6of3okRHILbkrqxw==}
crossws@0.3.3:
resolution: {integrity: sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw==}
css-select@5.1.0:
resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
@ -1679,10 +1679,6 @@ packages:
resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
engines: {node: '>=0.3.1'}
dir-glob@3.0.1:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
@ -1717,8 +1713,8 @@ packages:
duplexer@0.1.2:
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
electron-to-chromium@1.5.87:
resolution: {integrity: sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg==}
electron-to-chromium@1.5.88:
resolution: {integrity: sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==}
emmet@2.4.11:
resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==}
@ -1740,6 +1736,10 @@ packages:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
entities@6.0.0:
resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==}
engines: {node: '>=0.12'}
environment@1.1.0:
resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
engines: {node: '>=18'}
@ -1849,8 +1849,8 @@ packages:
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
eslint-plugin-jsdoc@50.6.2:
resolution: {integrity: sha512-n7GNZ4czMAAbDg7DsDA7PvHo1IPIUwAXYmxTx6j/hTlXbt5V0x5q/kGkiJ7s4wA9SpB/yaiK8jF7CO237lOLew==}
eslint-plugin-jsdoc@50.6.3:
resolution: {integrity: sha512-NxbJyt1M5zffPcYZ8Nb53/8nnbIScmiLAMdoe0/FAszwb7lcSiX3iYBTsuF7RV84dZZJC8r3NghomrUXsmWvxQ==}
engines: {node: '>=18'}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
@ -1938,8 +1938,8 @@ packages:
resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@9.18.0:
resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==}
eslint@9.19.0:
resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
@ -2126,9 +2126,9 @@ packages:
resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==}
engines: {node: '>=18'}
globby@11.1.0:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
engines: {node: '>=10'}
globby@14.0.2:
resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==}
engines: {node: '>=18'}
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@ -2940,9 +2940,9 @@ packages:
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
path-type@5.0.0:
resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==}
engines: {node: '>=12'}
pathe@1.1.2:
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
@ -3276,9 +3276,9 @@ packages:
engines: {node: '>=14.0.0', npm: '>=6.0.0'}
hasBin: true
slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
slash@5.1.0:
resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
engines: {node: '>=14.16'}
slashes@3.0.12:
resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==}
@ -3509,6 +3509,10 @@ packages:
unenv@1.10.0:
resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==}
unicorn-magic@0.1.0:
resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
engines: {node: '>=18'}
unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
@ -3939,48 +3943,48 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
'@antfu/eslint-config@3.16.0(@typescript-eslint/utils@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(@unocss/eslint-plugin@65.4.3(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(@vue/compiler-sfc@3.5.13)(astro-eslint-parser@1.1.0(typescript@5.7.3))(eslint-plugin-astro@1.3.1(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)':
'@antfu/eslint-config@3.16.0(@typescript-eslint/utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(@unocss/eslint-plugin@65.4.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(@vue/compiler-sfc@3.5.13)(astro-eslint-parser@1.2.0)(eslint-plugin-astro@1.3.1(eslint@9.19.0(jiti@2.4.2)))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
'@antfu/install-pkg': 1.0.0
'@clack/prompts': 0.9.1
'@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.18.0(jiti@2.4.2))
'@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.19.0(jiti@2.4.2))
'@eslint/markdown': 6.2.2
'@stylistic/eslint-plugin': 2.13.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
'@vitest/eslint-plugin': 1.1.25(@typescript-eslint/utils@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.18.0(jiti@2.4.2)
eslint-config-flat-gitignore: 1.0.0(eslint@9.18.0(jiti@2.4.2))
'@stylistic/eslint-plugin': 2.13.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/parser': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
'@vitest/eslint-plugin': 1.1.25(@typescript-eslint/utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.19.0(jiti@2.4.2)
eslint-config-flat-gitignore: 1.0.0(eslint@9.19.0(jiti@2.4.2))
eslint-flat-config-utils: 1.1.0
eslint-merge-processors: 1.0.0(eslint@9.18.0(jiti@2.4.2))
eslint-plugin-antfu: 2.7.0(eslint@9.18.0(jiti@2.4.2))
eslint-plugin-command: 2.1.0(eslint@9.18.0(jiti@2.4.2))
eslint-plugin-import-x: 4.6.1(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
eslint-plugin-jsdoc: 50.6.2(eslint@9.18.0(jiti@2.4.2))
eslint-plugin-jsonc: 2.19.1(eslint@9.18.0(jiti@2.4.2))
eslint-plugin-n: 17.15.1(eslint@9.18.0(jiti@2.4.2))
eslint-merge-processors: 1.0.0(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-antfu: 2.7.0(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-command: 2.1.0(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-import-x: 4.6.1(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
eslint-plugin-jsdoc: 50.6.3(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-jsonc: 2.19.1(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-n: 17.15.1(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-no-only-tests: 3.3.0
eslint-plugin-perfectionist: 4.7.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
eslint-plugin-regexp: 2.7.0(eslint@9.18.0(jiti@2.4.2))
eslint-plugin-toml: 0.12.0(eslint@9.18.0(jiti@2.4.2))
eslint-plugin-unicorn: 56.0.1(eslint@9.18.0(jiti@2.4.2))
eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))
eslint-plugin-vue: 9.32.0(eslint@9.18.0(jiti@2.4.2))
eslint-plugin-yml: 1.16.0(eslint@9.18.0(jiti@2.4.2))
eslint-processor-vue-blocks: 1.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.18.0(jiti@2.4.2))
eslint-plugin-perfectionist: 4.7.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
eslint-plugin-regexp: 2.7.0(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-toml: 0.12.0(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-unicorn: 56.0.1(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-vue: 9.32.0(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-yml: 1.16.0(eslint@9.19.0(jiti@2.4.2))
eslint-processor-vue-blocks: 1.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.19.0(jiti@2.4.2))
globals: 15.14.0
jsonc-eslint-parser: 2.4.0
local-pkg: 1.0.0
parse-gitignore: 2.0.0
picocolors: 1.1.1
toml-eslint-parser: 0.10.0
vue-eslint-parser: 9.4.3(eslint@9.18.0(jiti@2.4.2))
vue-eslint-parser: 9.4.3(eslint@9.19.0(jiti@2.4.2))
yaml-eslint-parser: 1.2.3
yargs: 17.7.2
optionalDependencies:
'@unocss/eslint-plugin': 65.4.3(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
astro-eslint-parser: 1.1.0(typescript@5.7.3)
eslint-plugin-astro: 1.3.1(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
'@unocss/eslint-plugin': 65.4.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
astro-eslint-parser: 1.2.0
eslint-plugin-astro: 1.3.1(eslint@9.19.0(jiti@2.4.2))
transitivePeerDependencies:
- '@eslint/json'
- '@typescript-eslint/utils'
@ -4130,11 +4134,11 @@ snapshots:
'@babel/helper-validator-identifier@7.25.9': {}
'@babel/parser@7.26.5':
'@babel/parser@7.26.7':
dependencies:
'@babel/types': 7.26.5
'@babel/types': 7.26.7
'@babel/types@7.26.5':
'@babel/types@7.26.7':
dependencies:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
@ -4340,22 +4344,22 @@ snapshots:
'@esbuild/win32-x64@0.24.2':
optional: true
'@eslint-community/eslint-plugin-eslint-comments@4.4.1(eslint@9.18.0(jiti@2.4.2))':
'@eslint-community/eslint-plugin-eslint-comments@4.4.1(eslint@9.19.0(jiti@2.4.2))':
dependencies:
escape-string-regexp: 4.0.0
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
ignore: 5.3.2
'@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@2.4.2))':
'@eslint-community/eslint-utils@4.4.1(eslint@9.19.0(jiti@2.4.2))':
dependencies:
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.1': {}
'@eslint/compat@1.2.5(eslint@9.18.0(jiti@2.4.2))':
'@eslint/compat@1.2.5(eslint@9.19.0(jiti@2.4.2))':
optionalDependencies:
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
'@eslint/config-array@0.19.1':
dependencies:
@ -4383,7 +4387,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@eslint/js@9.18.0': {}
'@eslint/js@9.19.0': {}
'@eslint/markdown@6.2.2':
dependencies:
@ -4687,10 +4691,12 @@ snapshots:
'@shikijs/vscode-textmate@10.0.1': {}
'@stylistic/eslint-plugin@2.13.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)':
'@sindresorhus/merge-streams@2.3.0': {}
'@stylistic/eslint-plugin@2.13.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
'@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.18.0(jiti@2.4.2)
'@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.19.0(jiti@2.4.2)
eslint-visitor-keys: 4.2.0
espree: 10.3.0
estraverse: 5.3.0
@ -4785,15 +4791,15 @@ snapshots:
'@types/unist@3.0.3': {}
'@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)':
'@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
'@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/parser': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/scope-manager': 8.21.0
'@typescript-eslint/type-utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/type-utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/visitor-keys': 8.21.0
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
graphemer: 1.4.0
ignore: 5.3.2
natural-compare: 1.4.0
@ -4802,14 +4808,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)':
'@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
'@typescript-eslint/scope-manager': 8.21.0
'@typescript-eslint/types': 8.21.0
'@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3)
'@typescript-eslint/visitor-keys': 8.21.0
debug: 4.4.0
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
@ -4819,12 +4825,12 @@ snapshots:
'@typescript-eslint/types': 8.21.0
'@typescript-eslint/visitor-keys': 8.21.0
'@typescript-eslint/type-utils@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)':
'@typescript-eslint/type-utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
'@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3)
'@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
debug: 4.4.0
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
ts-api-utils: 2.0.0(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
@ -4846,13 +4852,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)':
'@typescript-eslint/utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2))
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
'@typescript-eslint/scope-manager': 8.21.0
'@typescript-eslint/types': 8.21.0
'@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3)
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
@ -4906,9 +4912,9 @@ snapshots:
'@unocss/core@65.4.3': {}
'@unocss/eslint-plugin@65.4.3(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)':
'@unocss/eslint-plugin@65.4.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
'@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
'@unocss/config': 65.4.3
'@unocss/core': 65.4.3
'@unocss/rule-utils': 65.4.3
@ -5036,10 +5042,10 @@ snapshots:
- supports-color
- vue
'@vitest/eslint-plugin@1.1.25(@typescript-eslint/utils@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)':
'@vitest/eslint-plugin@1.1.25(@typescript-eslint/utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
'@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.18.0(jiti@2.4.2)
'@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.19.0(jiti@2.4.2)
optionalDependencies:
typescript: 5.7.3
@ -5095,7 +5101,7 @@ snapshots:
'@vue/compiler-core@3.5.13':
dependencies:
'@babel/parser': 7.26.5
'@babel/parser': 7.26.7
'@vue/shared': 3.5.13
entities: 4.5.0
estree-walker: 2.0.2
@ -5108,7 +5114,7 @@ snapshots:
'@vue/compiler-sfc@3.5.13':
dependencies:
'@babel/parser': 7.26.5
'@babel/parser': 7.26.7
'@vue/compiler-core': 3.5.13
'@vue/compiler-dom': 3.5.13
'@vue/compiler-ssr': 3.5.13
@ -5204,8 +5210,6 @@ snapshots:
array-iterate@2.0.1: {}
array-union@2.1.0: {}
astring@1.9.0: {}
astro-compress@2.3.6(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0):
@ -5256,24 +5260,22 @@ snapshots:
- uploadthing
- yaml
astro-eslint-parser@1.1.0(typescript@5.7.3):
astro-eslint-parser@1.2.0:
dependencies:
'@astrojs/compiler': 2.10.3
'@typescript-eslint/scope-manager': 8.21.0
'@typescript-eslint/types': 8.21.0
'@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3)
astrojs-compiler-sync: 1.0.1(@astrojs/compiler@2.10.3)
debug: 4.4.0
entities: 4.5.0
entities: 6.0.0
eslint-scope: 8.2.0
eslint-visitor-keys: 4.2.0
espree: 10.3.0
globby: 11.1.0
globby: 14.0.2
is-glob: 4.0.3
semver: 7.6.3
transitivePeerDependencies:
- supports-color
- typescript
astro-robots-txt@1.0.0:
dependencies:
@ -5421,7 +5423,7 @@ snapshots:
browserslist@4.24.4:
dependencies:
caniuse-lite: 1.0.30001695
electron-to-chromium: 1.5.87
electron-to-chromium: 1.5.88
node-releases: 2.0.19
update-browserslist-db: 1.1.2(browserslist@4.24.4)
@ -5567,7 +5569,7 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
crossws@0.3.2:
crossws@0.3.3:
dependencies:
uncrypto: 0.1.3
@ -5644,10 +5646,6 @@ snapshots:
diff@5.2.0: {}
dir-glob@3.0.1:
dependencies:
path-type: 4.0.0
dlv@1.1.3: {}
doctrine@3.0.0:
@ -5683,7 +5681,7 @@ snapshots:
duplexer@0.1.2: {}
electron-to-chromium@1.5.87: {}
electron-to-chromium@1.5.88: {}
emmet@2.4.11:
dependencies:
@ -5703,6 +5701,8 @@ snapshots:
entities@4.5.0: {}
entities@6.0.0: {}
environment@1.1.0: {}
error-ex@1.3.2:
@ -5788,20 +5788,20 @@ snapshots:
escape-string-regexp@5.0.0: {}
eslint-compat-utils@0.5.1(eslint@9.18.0(jiti@2.4.2)):
eslint-compat-utils@0.5.1(eslint@9.19.0(jiti@2.4.2)):
dependencies:
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
semver: 7.6.3
eslint-compat-utils@0.6.4(eslint@9.18.0(jiti@2.4.2)):
eslint-compat-utils@0.6.4(eslint@9.19.0(jiti@2.4.2)):
dependencies:
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
semver: 7.6.3
eslint-config-flat-gitignore@1.0.0(eslint@9.18.0(jiti@2.4.2)):
eslint-config-flat-gitignore@1.0.0(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@eslint/compat': 1.2.5(eslint@9.18.0(jiti@2.4.2))
eslint: 9.18.0(jiti@2.4.2)
'@eslint/compat': 1.2.5(eslint@9.19.0(jiti@2.4.2))
eslint: 9.19.0(jiti@2.4.2)
find-up-simple: 1.0.0
eslint-flat-config-utils@1.1.0:
@ -5816,57 +5816,56 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-json-compat-utils@0.2.1(eslint@9.18.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0):
eslint-json-compat-utils@0.2.1(eslint@9.19.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0):
dependencies:
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
esquery: 1.6.0
jsonc-eslint-parser: 2.4.0
eslint-merge-processors@1.0.0(eslint@9.18.0(jiti@2.4.2)):
eslint-merge-processors@1.0.0(eslint@9.19.0(jiti@2.4.2)):
dependencies:
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
eslint-plugin-antfu@2.7.0(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-antfu@2.7.0(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@antfu/utils': 0.7.10
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
eslint-plugin-astro@1.3.1(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3):
eslint-plugin-astro@1.3.1(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2))
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
'@jridgewell/sourcemap-codec': 1.5.0
'@typescript-eslint/types': 8.21.0
astro-eslint-parser: 1.1.0(typescript@5.7.3)
eslint: 9.18.0(jiti@2.4.2)
eslint-compat-utils: 0.6.4(eslint@9.18.0(jiti@2.4.2))
astro-eslint-parser: 1.2.0
eslint: 9.19.0(jiti@2.4.2)
eslint-compat-utils: 0.6.4(eslint@9.19.0(jiti@2.4.2))
globals: 15.14.0
postcss: 8.5.1
postcss-selector-parser: 7.0.0
transitivePeerDependencies:
- supports-color
- typescript
eslint-plugin-command@2.1.0(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-command@2.1.0(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@es-joy/jsdoccomment': 0.50.0
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
eslint-plugin-es-x@7.8.0(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-es-x@7.8.0(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2))
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
'@eslint-community/regexpp': 4.12.1
eslint: 9.18.0(jiti@2.4.2)
eslint-compat-utils: 0.5.1(eslint@9.18.0(jiti@2.4.2))
eslint: 9.19.0(jiti@2.4.2)
eslint-compat-utils: 0.5.1(eslint@9.19.0(jiti@2.4.2))
eslint-plugin-import-x@4.6.1(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3):
eslint-plugin-import-x@4.6.1(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3):
dependencies:
'@types/doctrine': 0.0.9
'@typescript-eslint/scope-manager': 8.21.0
'@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
debug: 4.4.0
doctrine: 3.0.0
enhanced-resolve: 5.18.0
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
eslint-import-resolver-node: 0.3.9
get-tsconfig: 4.10.0
is-glob: 4.0.3
@ -5878,14 +5877,14 @@ snapshots:
- supports-color
- typescript
eslint-plugin-jsdoc@50.6.2(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-jsdoc@50.6.3(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@es-joy/jsdoccomment': 0.49.0
are-docs-informative: 0.0.2
comment-parser: 1.4.1
debug: 4.4.0
escape-string-regexp: 4.0.0
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
espree: 10.3.0
esquery: 1.6.0
parse-imports: 2.2.1
@ -5895,12 +5894,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-plugin-jsonc@2.19.1(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-jsonc@2.19.1(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2))
eslint: 9.18.0(jiti@2.4.2)
eslint-compat-utils: 0.6.4(eslint@9.18.0(jiti@2.4.2))
eslint-json-compat-utils: 0.2.1(eslint@9.18.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0)
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
eslint: 9.19.0(jiti@2.4.2)
eslint-compat-utils: 0.6.4(eslint@9.19.0(jiti@2.4.2))
eslint-json-compat-utils: 0.2.1(eslint@9.19.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0)
espree: 9.6.1
graphemer: 1.4.0
jsonc-eslint-parser: 2.4.0
@ -5909,12 +5908,12 @@ snapshots:
transitivePeerDependencies:
- '@eslint/json'
eslint-plugin-n@17.15.1(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-n@17.15.1(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2))
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
enhanced-resolve: 5.18.0
eslint: 9.18.0(jiti@2.4.2)
eslint-plugin-es-x: 7.8.0(eslint@9.18.0(jiti@2.4.2))
eslint: 9.19.0(jiti@2.4.2)
eslint-plugin-es-x: 7.8.0(eslint@9.19.0(jiti@2.4.2))
get-tsconfig: 4.10.0
globals: 15.14.0
ignore: 5.3.2
@ -5923,45 +5922,45 @@ snapshots:
eslint-plugin-no-only-tests@3.3.0: {}
eslint-plugin-perfectionist@4.7.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3):
eslint-plugin-perfectionist@4.7.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3):
dependencies:
'@typescript-eslint/types': 8.21.0
'@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.18.0(jiti@2.4.2)
'@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.19.0(jiti@2.4.2)
natural-orderby: 5.0.0
transitivePeerDependencies:
- supports-color
- typescript
eslint-plugin-regexp@2.7.0(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-regexp@2.7.0(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2))
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
'@eslint-community/regexpp': 4.12.1
comment-parser: 1.4.1
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
jsdoc-type-pratt-parser: 4.1.0
refa: 0.12.1
regexp-ast-analysis: 0.7.1
scslre: 0.3.0
eslint-plugin-toml@0.12.0(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-toml@0.12.0(eslint@9.19.0(jiti@2.4.2)):
dependencies:
debug: 4.4.0
eslint: 9.18.0(jiti@2.4.2)
eslint-compat-utils: 0.6.4(eslint@9.18.0(jiti@2.4.2))
eslint: 9.19.0(jiti@2.4.2)
eslint-compat-utils: 0.6.4(eslint@9.19.0(jiti@2.4.2))
lodash: 4.17.21
toml-eslint-parser: 0.10.0
transitivePeerDependencies:
- supports-color
eslint-plugin-unicorn@56.0.1(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-unicorn@56.0.1(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@babel/helper-validator-identifier': 7.25.9
'@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2))
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
ci-info: 4.1.0
clean-regexp: 1.0.0
core-js-compat: 3.40.0
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
esquery: 1.6.0
globals: 15.14.0
indent-string: 4.0.0
@ -5974,41 +5973,41 @@ snapshots:
semver: 7.6.3
strip-indent: 3.0.0
eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2)):
dependencies:
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
optionalDependencies:
'@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.18.0(jiti@2.4.2))(typescript@5.7.3)
'@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)
eslint-plugin-vue@9.32.0(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-vue@9.32.0(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2))
eslint: 9.18.0(jiti@2.4.2)
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
eslint: 9.19.0(jiti@2.4.2)
globals: 13.24.0
natural-compare: 1.4.0
nth-check: 2.1.1
postcss-selector-parser: 6.1.2
semver: 7.6.3
vue-eslint-parser: 9.4.3(eslint@9.18.0(jiti@2.4.2))
vue-eslint-parser: 9.4.3(eslint@9.19.0(jiti@2.4.2))
xml-name-validator: 4.0.0
transitivePeerDependencies:
- supports-color
eslint-plugin-yml@1.16.0(eslint@9.18.0(jiti@2.4.2)):
eslint-plugin-yml@1.16.0(eslint@9.19.0(jiti@2.4.2)):
dependencies:
debug: 4.4.0
eslint: 9.18.0(jiti@2.4.2)
eslint-compat-utils: 0.6.4(eslint@9.18.0(jiti@2.4.2))
eslint: 9.19.0(jiti@2.4.2)
eslint-compat-utils: 0.6.4(eslint@9.19.0(jiti@2.4.2))
lodash: 4.17.21
natural-compare: 1.4.0
yaml-eslint-parser: 1.2.3
transitivePeerDependencies:
- supports-color
eslint-processor-vue-blocks@1.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.18.0(jiti@2.4.2)):
eslint-processor-vue-blocks@1.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.19.0(jiti@2.4.2)):
dependencies:
'@vue/compiler-sfc': 3.5.13
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
eslint-scope@7.2.2:
dependencies:
@ -6024,14 +6023,14 @@ snapshots:
eslint-visitor-keys@4.2.0: {}
eslint@9.18.0(jiti@2.4.2):
eslint@9.19.0(jiti@2.4.2):
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@2.4.2))
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
'@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.19.1
'@eslint/core': 0.10.0
'@eslint/eslintrc': 3.2.0
'@eslint/js': 9.18.0
'@eslint/js': 9.19.0
'@eslint/plugin-kit': 0.2.5
'@humanfs/node': 0.16.6
'@humanwhocodes/module-importer': 1.0.1
@ -6239,14 +6238,14 @@ snapshots:
globals@15.14.0: {}
globby@11.1.0:
globby@14.0.2:
dependencies:
array-union: 2.1.0
dir-glob: 3.0.1
'@sindresorhus/merge-streams': 2.3.0
fast-glob: 3.3.3
ignore: 5.3.2
merge2: 1.4.1
slash: 3.0.0
path-type: 5.0.0
slash: 5.1.0
unicorn-magic: 0.1.0
graceful-fs@4.2.11: {}
@ -6259,7 +6258,7 @@ snapshots:
h3@1.14.0:
dependencies:
cookie-es: 1.2.2
crossws: 0.3.2
crossws: 0.3.3
defu: 6.1.4
destr: 2.0.3
iron-webcrypto: 1.2.1
@ -6731,8 +6730,8 @@ snapshots:
magicast@0.3.5:
dependencies:
'@babel/parser': 7.26.5
'@babel/types': 7.26.5
'@babel/parser': 7.26.7
'@babel/types': 7.26.7
source-map-js: 1.2.1
markdown-extensions@2.0.0: {}
@ -7442,7 +7441,7 @@ snapshots:
path-parse@1.0.7: {}
path-type@4.0.0: {}
path-type@5.0.0: {}
pathe@1.1.2: {}
@ -7927,7 +7926,7 @@ snapshots:
arg: 5.0.2
sax: 1.4.1
slash@3.0.0: {}
slash@5.1.0: {}
slashes@3.0.12: {}
@ -8140,6 +8139,8 @@ snapshots:
node-fetch-native: 1.6.6
pathe: 1.1.2
unicorn-magic@0.1.0: {}
unified@11.0.5:
dependencies:
'@types/unist': 3.0.3
@ -8422,10 +8423,10 @@ snapshots:
vscode-uri@3.0.8: {}
vue-eslint-parser@9.4.3(eslint@9.18.0(jiti@2.4.2)):
vue-eslint-parser@9.4.3(eslint@9.19.0(jiti@2.4.2)):
dependencies:
debug: 4.4.0
eslint: 9.18.0(jiti@2.4.2)
eslint: 9.19.0(jiti@2.4.2)
eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.3
espree: 9.6.1

View file

@ -3,11 +3,11 @@ import type { ThemeConfig } from '@/types'
export const themeConfig: ThemeConfig = {
// SITE INFORMATION >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> START
site: {
title: 'Retypeset',
subtitle: '再现版式之美',
description: '重新编排 - 再现版式之美 | Retypeset - Rediscover the beauty of typography',
author: 'radishzz',
url: 'https://retypeset.radishzz.cc',
title: 'Retypeset', // site title
subtitle: '再现版式之美', // site subtitle
description: 'This is Retypeset, an elegant and open-source Astro blog theme, help you rediscover the beauty of typography.', // site description for SEO
author: 'radishzz', // author name
url: 'https://retypeset.radishzz.cc', // site url
favicon: '/image/logo.svg', // or https://image.example.com/logo.svg. Support only webp, svg, png
},
// SITE INFORMATION >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> END
@ -60,20 +60,20 @@ export const themeConfig: ThemeConfig = {
facebookLink: '', // facebook profile link
// site verification
verification: {
google: '',
bing: '',
yandex: '',
baidu: '',
google: '', // Google Search Console: https://search.google.com/search-console
bing: '', // Bing Webmaster Tools: https://www.bing.com/webmasters
yandex: '', // Yandex Webmaster: https://webmaster.yandex.com
baidu: '', // Baidu Search: https://ziyuan.baidu.com
},
// site analytics
googleAnalyticsID: '',
umamiAnalyticsID: '',
googleAnalyticsID: '', // Google Analytics: https://analytics.google.com
umamiAnalyticsID: '', // Umami Analytics: https://cloud.umami.is
// follow verification
follow: {
feedID: '',
userID: '',
feedID: '', // feed ID
userID: '', // user ID
},
siteScreenshot: '', // please take a screenshot of your website homepage to show on twitter card
siteScreenshot: '', // take a screenshot of your website homepage to show on twitter card
},
// SEO SETTINGS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> END
@ -96,16 +96,28 @@ export const themeConfig: ThemeConfig = {
// PRELOAD SETTINGS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> START
preload: {
cdn: 'https://cdn.jsdelivr.net', // Recommended to keep default. Unless you can proxy https://cdn.jsdelivr.net/gh/radishzzz/astro-theme-retypeset/src/styles/font.css
cdn: 'https://cdn.jsdelivr.net', // Keep the default CDN unless you can proxy https://cdn.jsdelivr.net/gh/radishzzz/astro-theme-retypeset/src/styles/font.css
commentURL: '', // https://comment.example.com/
imageHostURL: '', // https://image.example.com/
// If you proxy analytics requests to the custom domain, you can fill in below
customGoogleAnalyticsURL: '', // https://custom.example.com/
customUmamiAnalyticsURL: '', // https://custom.example.com/
customUmamiAnalyticsJS: '', // https://custom.example.com/custom.js
lazyload: false,
},
// PRELOAD SETTINGS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> END
// ABOUT PAGE CONTENT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> START
about: {
// Required: Content for about page in default language
'[locale]': '关于我',
// Optional: Content for about page in other languages. If not set, will fallback to [locale] content
'zh-tw': '關於我',
'ja': '私について',
'en': 'About me',
'es': 'Sobre mí',
'ru': 'Обо мне',
},
// ABOUT PAGE CONTENT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> END
}
export default themeConfig

View file

@ -1,8 +1,8 @@
---
import Footer from '@/components/Footer.astro'
import Header from '@/components/Header.astro'
import LanguageSwitcher from '@/components/LanguageSwitcher.astro'
import Navigation from '@/components/Navigation.astro'
import LanguageSwitcher from '@/components/LangSwitch.astro'
import Navigation from '@/components/Navbar.astro'
import PhotoSwipe from '@/components/PhotoSwipe.astro'
import Scrollbar from '@/components/Scrollbar.astro'
import ThemeToggle from '@/components/ThemeToggle.astro'

View file

@ -1,11 +1,9 @@
---
import { themeConfig } from '@/config'
import Layout from '@/layouts/Layout.astro'
import { generateLanguagePaths } from '@/utils/i18n'
export function getStaticPaths() {
return themeConfig.global.moreLocale.map(lang => ({
params: { lang },
}))
return generateLanguagePaths()
}
---

View file

@ -1,12 +1,10 @@
---
import { themeConfig } from '@/config'
import Layout from '@/layouts/Layout.astro'
import { getPinnedPosts, getPosts } from '@/utils/content.config'
import { getPinnedPosts, getPosts } from '@/utils/content'
import { generateLanguagePaths } from '@/utils/i18n'
export function getStaticPaths() {
return themeConfig.global.moreLocale.map(lang => ({
params: { lang },
}))
return generateLanguagePaths()
}
const { lang } = Astro.params

View file

@ -1,26 +1,18 @@
---
import { themeConfig } from '@/config'
import Layout from '@/layouts/Layout.astro'
import { checkSlugDuplication } from '@/utils/content.config'
import { checkSlugDuplication } from '@/utils/content'
import { generateMultiLangPostPaths } from '@/utils/i18n'
import { getCollection } from 'astro:content'
export async function getStaticPaths() {
const posts = await getCollection('posts')
const duplicates = await checkSlugDuplication(posts)
if (duplicates.length > 0) {
throw new Error(`Slug conflicts found:\n${duplicates.join('\n')}`)
}
return themeConfig.global.moreLocale.flatMap(lang =>
posts.map(post => ({
params: {
lang,
slug: post.data.slug || post.slug,
},
props: { post },
})),
)
return generateMultiLangPostPaths(posts)
}
const { post } = Astro.props

View file

@ -1,38 +1,8 @@
import type { APIContext } from 'astro'
import type { CollectionEntry } from 'astro:content'
import themeConfig from '@/config'
import rss from '@astrojs/rss'
import { getCollection } from 'astro:content'
import MarkdownIt from 'markdown-it'
import sanitizeHtml from 'sanitize-html'
import { generateRSS } from '@/utils/rss'
const parser = new MarkdownIt()
const { title, description, url } = themeConfig.site
const { moreLocale } = themeConfig.global
const followConfig = themeConfig.seo?.follow
// Returns first 200 chars with proper truncation
function getExcerpt(content: string): string {
if (!content)
return ''
// Convert markdown to plain text by removing all HTML tags
const plainText = sanitizeHtml(parser.render(content), {
allowedTags: [],
allowedAttributes: {},
})
const excerpt = plainText.slice(0, 200).trim()
return excerpt.length === 200 ? `${excerpt}...` : excerpt
}
// Return 404 for invalid language paths
function return404() {
return new Response(null, {
status: 404,
statusText: 'Not found',
})
}
// Type for supported non-default languages
type SupportedLanguage = typeof moreLocale[number]
@ -46,43 +16,12 @@ export async function GET({ params }: APIContext) {
const lang = params.lang as SupportedLanguage
// Return 404 if language is not supported
if (!moreLocale.includes(lang))
return return404()
if (!moreLocale.includes(lang)) {
return new Response(null, {
status: 404,
statusText: 'Not found',
})
}
// Get posts for specific language (including universal posts)
const posts = await getCollection(
'posts',
({ data }: { data: CollectionEntry<'posts'>['data'] }) =>
(!data.draft && (data.lang === lang || data.lang === '')),
)
return rss({
title: `${title} (${lang})`,
description,
site: url,
items: posts.map((post: CollectionEntry<'posts'>) => ({
title: post.data.title,
pubDate: post.data.published,
description: post.data.description || getExcerpt(post.body),
// Generate absolute URL with language prefix
link: new URL(`${lang}/posts/${post.data.slug || post.slug}/`, url).toString(),
// Convert markdown content to HTML, allowing img tags
content: post.body
? sanitizeHtml(parser.render(post.body), {
allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img']),
})
: '',
})),
// Add XML namespaces for language and follow challenge
customData: `
<language>${lang}</language>
${followConfig?.feedID && followConfig?.userID
? `<follow_challenge>
<feedId>${followConfig.feedID}</feedId>
<userId>${followConfig.userID}</userId>
</follow_challenge>`
: ''
}
`.trim(),
})
return generateRSS({ lang })
}

View file

@ -1,16 +1,11 @@
---
import { themeConfig } from '@/config'
import Layout from '@/layouts/Layout.astro'
import { getAllTags, getPostsByTag } from '@/utils/content.config'
import { getAllTags, getPostsByTag } from '@/utils/content'
import { generateMultiLangTagPaths } from '@/utils/i18n'
export async function getStaticPaths() {
const tags = await getAllTags()
return themeConfig.global.moreLocale.flatMap(lang =>
tags.map(tag => ({
params: { lang, tags: tag },
props: { tags: tag },
})),
)
return generateMultiLangTagPaths(tags)
}
const { lang } = Astro.params

View file

@ -1,12 +1,10 @@
---
import { themeConfig } from '@/config'
import Layout from '@/layouts/Layout.astro'
import { getAllTags } from '@/utils/content.config'
import { getAllTags } from '@/utils/content'
import { generateLanguagePaths } from '@/utils/i18n'
export function getStaticPaths() {
return themeConfig.global.moreLocale.map(lang => ({
params: { lang },
}))
return generateLanguagePaths()
}
const { lang } = Astro.params
@ -21,3 +19,4 @@ const allTags = await getAllTags()
</a>
))}
</div>
</Layout>

View file

@ -1,6 +1,6 @@
---
import Layout from '@/layouts/Layout.astro'
import { getPinnedPosts, getPosts } from '@/utils/content.config'
import { getPinnedPosts, getPosts } from '@/utils/content'
const posts = await getPosts()
const pinnedPosts = await getPinnedPosts()

View file

@ -1,22 +1,18 @@
---
import Layout from '@/layouts/Layout.astro'
import { checkSlugDuplication } from '@/utils/content.config'
import { checkSlugDuplication } from '@/utils/content'
import { generatePostPaths } from '@/utils/i18n'
import { getCollection } from 'astro:content'
export async function getStaticPaths() {
const posts = await getCollection('posts')
const duplicates = await checkSlugDuplication(posts)
if (duplicates.length > 0) {
throw new Error(`Slug conflicts found:\n${duplicates.join('\n')}`)
}
return posts.map(post => ({
params: {
slug: post.data.slug || post.slug,
},
props: { post },
}))
return generatePostPaths(posts)
}
const { post } = Astro.props

View file

@ -1,65 +1,5 @@
import type { CollectionEntry } from 'astro:content'
import themeConfig from '@/config'
import rss from '@astrojs/rss'
import { getCollection } from 'astro:content'
import MarkdownIt from 'markdown-it'
import sanitizeHtml from 'sanitize-html'
const parser = new MarkdownIt()
const { title, description, url } = themeConfig.site
const { locale } = themeConfig.global
const followConfig = themeConfig.seo?.follow
// Returns first 200 chars with proper truncation
function getExcerpt(content: string): string {
if (!content)
return ''
// Convert markdown to plain text by removing all HTML tags
const plainText = sanitizeHtml(parser.render(content), {
allowedTags: [],
allowedAttributes: {},
})
const excerpt = plainText.slice(0, 200).trim()
return excerpt.length === 200 ? `${excerpt}...` : excerpt
}
import { generateRSS } from '@/utils/rss'
export async function GET() {
// Get all posts for default language (including universal posts)
const posts = await getCollection(
'posts',
({ data }: { data: CollectionEntry<'posts'>['data'] }) =>
(!data.draft && (data.lang === locale || data.lang === '')),
)
return rss({
title,
description,
site: url,
items: posts.map((post: CollectionEntry<'posts'>) => ({
title: post.data.title,
pubDate: post.data.published,
description: post.data.description || getExcerpt(post.body),
// Generate absolute URL for post
link: new URL(`posts/${post.data.slug || post.slug}/`, url).toString(),
// Convert markdown content to HTML, allowing img tags
content: post.body
? sanitizeHtml(parser.render(post.body), {
allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img']),
})
: '',
})),
// Add XML namespaces for language and follow challenge
customData: `
<language>${locale}</language>
${followConfig?.feedID && followConfig?.userID
? `<follow_challenge>
<feedId>${followConfig.feedID}</feedId>
<userId>${followConfig.userID}</userId>
</follow_challenge>`
: ''
}
`.trim(),
})
return generateRSS()
}

View file

@ -1,6 +1,6 @@
---
import Layout from '@/layouts/Layout.astro'
import { getAllTags, getPostsByTag } from '@/utils/content.config'
import { getAllTags, getPostsByTag } from '@/utils/content'
export async function getStaticPaths() {
const tags = await getAllTags()

View file

@ -1,6 +1,6 @@
---
import Layout from '@/layouts/Layout.astro'
import { getAllTags } from '@/utils/content.config'
import { getAllTags } from '@/utils/content'
const allTags = await getAllTags()
---

View file

@ -10,19 +10,16 @@
--os-handle-perpendicular-size-active: 160%;
--os-handle-interactive-area-offset: 3px;
}
.scrollbar-light {
--os-handle-bg: #C9C4C1;
--os-handle-bg-hover: #B8B3B0;
--os-handle-bg-active: #B8B3B0;
}
.scrollbar-dark {
--os-handle-bg: #383838;
--os-handle-bg-hover: #464646;
--os-handle-bg-active: #464646;
}
@media (max-width: 1023px) {
.os-scrollbar {
display: none !important;

View file

@ -1,5 +1,7 @@
import type { langPath } from '@/utils/ui'
type Exclude<T, U> = T extends U ? never : T
export interface ThemeConfig {
site: {
@ -84,7 +86,12 @@ export interface ThemeConfig {
customGoogleAnalyticsURL?: string
customUmamiAnalyticsURL?: string
customUmamiAnalyticsJS?: string
lazyload: boolean
}
about: {
[key in ThemeConfig['global']['locale']]: string
} & {
[key in ThemeConfig['global']['moreLocale'][number]]?: string
}
}

38
src/utils/i18n.ts Normal file
View file

@ -0,0 +1,38 @@
import type { CollectionEntry } from 'astro:content'
import { themeConfig } from '@/config'
export function generateLanguagePaths() {
return themeConfig.global.moreLocale.map(lang => ({
params: { lang },
}))
}
export function generatePostPaths(posts: CollectionEntry<'posts'>[]) {
return posts.map(post => ({
params: {
slug: post.data.slug || post.slug,
},
props: { post },
}))
}
export function generateMultiLangPostPaths(posts: CollectionEntry<'posts'>[]) {
return themeConfig.global.moreLocale.flatMap(lang =>
posts.map(post => ({
params: {
lang,
slug: post.data.slug || post.slug,
},
props: { post },
})),
)
}
export function generateMultiLangTagPaths(tags: string[]) {
return themeConfig.global.moreLocale.flatMap(lang =>
tags.map(tag => ({
params: { lang, tags: tag },
props: { tags: tag },
})),
)
}

71
src/utils/rss.ts Normal file
View file

@ -0,0 +1,71 @@
import type { CollectionEntry } from 'astro:content'
import themeConfig from '@/config'
import rss from '@astrojs/rss'
import { getCollection } from 'astro:content'
import MarkdownIt from 'markdown-it'
import sanitizeHtml from 'sanitize-html'
const parser = new MarkdownIt()
const { title, description, url } = themeConfig.site
const followConfig = themeConfig.seo?.follow
// Returns first 200 chars with proper truncation
function getExcerpt(content: string): string {
if (!content)
return ''
// Convert markdown to plain text by removing all HTML tags
const plainText = sanitizeHtml(parser.render(content), {
allowedTags: [],
allowedAttributes: {},
})
const excerpt = plainText.slice(0, 200).trim()
return excerpt.length === 200 ? `${excerpt}...` : excerpt
}
interface GenerateRSSOptions {
lang?: string
}
export async function generateRSS({ lang }: GenerateRSSOptions = {}) {
// Get posts for specific language (including universal posts)
const posts = await getCollection(
'posts',
({ data }: { data: CollectionEntry<'posts'>['data'] }) =>
(!data.draft && (data.lang === lang || data.lang === '')),
)
return rss({
title: lang ? `${title} (${lang})` : title,
description,
site: url,
items: posts.map((post: CollectionEntry<'posts'>) => ({
title: post.data.title,
pubDate: post.data.published,
description: post.data.description || getExcerpt(post.body),
// Generate absolute URL with optional language prefix
link: new URL(
`${lang ? `${lang}/` : ''}posts/${post.data.slug || post.slug}/`,
url,
).toString(),
// Convert markdown content to HTML, allowing img tags
content: post.body
? sanitizeHtml(parser.render(post.body), {
allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img']),
})
: '',
})),
// Add XML namespaces for language and follow challenge
customData: `
<language>${lang || themeConfig.global.locale}</language>
${followConfig?.feedID && followConfig?.userID
? `<follow_challenge>
<feedId>${followConfig.feedID}</feedId>
<userId>${followConfig.userID}</userId>
</follow_challenge>`
: ''
}
`.trim(),
})
}