diff --git a/.vitepress/theme/components/SponsorsGroup.vue b/.vitepress/theme/components/SponsorsGroup.vue index 498430f0..b24d686a 100644 --- a/.vitepress/theme/components/SponsorsGroup.vue +++ b/.vitepress/theme/components/SponsorsGroup.vue @@ -98,7 +98,7 @@ function resolveList(data: SponsorData) { > + + + + + + + + diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts index 3aa1dac2..212b4138 100644 --- a/.vitepress/theme/index.ts +++ b/.vitepress/theme/index.ts @@ -12,12 +12,14 @@ import SponsorsAside from './components/SponsorsAside.vue' import VueSchoolLink from './components/VueSchoolLink.vue' // import Banner from './components/Banner.vue' // import TextAd from './components/TextAd.vue' +import VueMasteryBanner from './components/VueMasteryBanner.vue' export default Object.assign({}, VPTheme, { Layout: () => { // @ts-ignore return h(VPTheme.Layout, null, { // banner: () => h(Banner), + banner: () => h(VueMasteryBanner), 'sidebar-top': () => h(PreferenceSwitch), 'sidebar-bottom': () => h(SecurityUpdateBtn), 'aside-mid': () => h(SponsorsAside) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 009f95c7..376bf495 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 4.4.2 '@vue/theme': specifier: ^2.3.0 - version: 2.3.0(@algolia/client-search@4.24.0)(search-insights@2.17.2)(vitepress@1.4.3(@algolia/client-search@4.24.0)(@types/node@22.7.5)(postcss@8.4.47)(search-insights@2.17.2)(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3)) + version: 2.3.0(@algolia/client-search@4.24.0)(search-insights@2.17.2)(vitepress@1.5.0(@algolia/client-search@4.24.0)(@types/node@22.7.5)(postcss@8.4.49)(search-insights@2.17.2)(typescript@5.6.3))(vue@3.5.13(typescript@5.6.3)) dynamics.js: specifier: ^1.1.5 version: 1.1.5 @@ -22,10 +22,10 @@ importers: version: 3.12.5 vitepress: specifier: ^1.4.3 - version: 1.4.3(@algolia/client-search@4.24.0)(@types/node@22.7.5)(postcss@8.4.47)(search-insights@2.17.2)(typescript@5.6.3) + version: 1.5.0(@algolia/client-search@4.24.0)(@types/node@22.7.5)(postcss@8.4.49)(search-insights@2.17.2)(typescript@5.6.3) vue: specifier: ^3.5.12 - version: 3.5.12(typescript@5.6.3) + version: 3.5.13(typescript@5.6.3) devDependencies: '@types/body-scroll-lock': specifier: ^3.1.2 @@ -288,6 +288,12 @@ packages: cpu: [x64] os: [win32] + '@iconify-json/simple-icons@1.2.10': + resolution: {integrity: sha512-9OK1dsSjXlH36lhu5n+BlSoXuqFjHUErGLtNdzHpq0vHq4YFBuGYWtZ+vZTHLreRQ8ijPRv/6EsgkV+nf6AReQ==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} @@ -441,14 +447,20 @@ packages: '@vue/compiler-core@3.5.12': resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==} + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-dom@3.5.12': resolution: {integrity: sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==} - '@vue/compiler-sfc@3.5.12': - resolution: {integrity: sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==} + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@vue/compiler-ssr@3.5.12': - resolution: {integrity: sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==} + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -470,26 +482,29 @@ packages: typescript: optional: true - '@vue/reactivity@3.5.12': - resolution: {integrity: sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==} + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} '@vue/repl@4.4.2': resolution: {integrity: sha512-MEAsBK/YzMFGINOBzqM40XTeIYAUsg7CqvXvD5zi0rhYEQrPfEUIdexmMjdm7kVKsKmcvIHxrFK2DFC35m9kHw==} - '@vue/runtime-core@3.5.12': - resolution: {integrity: sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==} + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} - '@vue/runtime-dom@3.5.12': - resolution: {integrity: sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==} + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} - '@vue/server-renderer@3.5.12': - resolution: {integrity: sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==} + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} peerDependencies: - vue: 3.5.12 + vue: 3.5.13 '@vue/shared@3.5.12': resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==} + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/theme@2.3.0': resolution: {integrity: sha512-eKd4ipY6i6P2XD2iRVgbxs936g7pesEY2AgNX24C/sjzcmCnm48J7uV8xKXI2du2qfA89/r5QQp7bqZVf2Tekw==} peerDependencies: @@ -704,10 +719,17 @@ packages: picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + postcss@8.4.47: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + preact@10.24.2: resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} @@ -827,8 +849,8 @@ packages: terser: optional: true - vitepress@1.4.3: - resolution: {integrity: sha512-956c2K2Mr0ubY9bTc2lCJD3g0mgo0mARB1iJC/BqUt4s0AM8Wl60wSU4zbFnzV7X2miFK1XJDKzGZnuEN90umw==} + vitepress@1.5.0: + resolution: {integrity: sha512-q4Q/G2zjvynvizdB3/bupdYkCJe2umSAMv9Ju4d92E6/NXJ59z70xB0q5p/4lpRyAwflDsbwy1mLV9Q5+nlB+g==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 @@ -859,8 +881,8 @@ packages: peerDependencies: typescript: '>=5.0.0' - vue@3.5.12: - resolution: {integrity: sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==} + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -1083,6 +1105,12 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true + '@iconify-json/simple-icons@1.2.10': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@rollup/rollup-android-arm-eabi@4.24.0': @@ -1195,10 +1223,10 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-vue@5.1.4(vite@5.4.10(@types/node@22.7.5))(vue@3.5.12(typescript@5.6.3))': + '@vitejs/plugin-vue@5.1.4(vite@5.4.10(@types/node@22.7.5))(vue@3.5.13(typescript@5.6.3))': dependencies: vite: 5.4.10(@types/node@22.7.5) - vue: 3.5.12(typescript@5.6.3) + vue: 3.5.13(typescript@5.6.3) '@volar/language-core@2.4.6': dependencies: @@ -1220,27 +1248,40 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.25.8 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + '@vue/compiler-dom@3.5.12': dependencies: '@vue/compiler-core': 3.5.12 '@vue/shared': 3.5.12 - '@vue/compiler-sfc@3.5.12': + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': dependencies: '@babel/parser': 7.25.8 - '@vue/compiler-core': 3.5.12 - '@vue/compiler-dom': 3.5.12 - '@vue/compiler-ssr': 3.5.12 - '@vue/shared': 3.5.12 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 estree-walker: 2.0.2 magic-string: 0.30.12 - postcss: 8.4.47 + postcss: 8.4.49 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.12': + '@vue/compiler-ssr@3.5.13': dependencies: - '@vue/compiler-dom': 3.5.12 - '@vue/shared': 3.5.12 + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 '@vue/compiler-vue2@2.7.16': dependencies: @@ -1278,41 +1319,43 @@ snapshots: optionalDependencies: typescript: 5.6.3 - '@vue/reactivity@3.5.12': + '@vue/reactivity@3.5.13': dependencies: - '@vue/shared': 3.5.12 + '@vue/shared': 3.5.13 '@vue/repl@4.4.2': {} - '@vue/runtime-core@3.5.12': + '@vue/runtime-core@3.5.13': dependencies: - '@vue/reactivity': 3.5.12 - '@vue/shared': 3.5.12 + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 - '@vue/runtime-dom@3.5.12': + '@vue/runtime-dom@3.5.13': dependencies: - '@vue/reactivity': 3.5.12 - '@vue/runtime-core': 3.5.12 - '@vue/shared': 3.5.12 + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 csstype: 3.1.3 - '@vue/server-renderer@3.5.12(vue@3.5.12(typescript@5.6.3))': + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.6.3))': dependencies: - '@vue/compiler-ssr': 3.5.12 - '@vue/shared': 3.5.12 - vue: 3.5.12(typescript@5.6.3) + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.6.3) '@vue/shared@3.5.12': {} - '@vue/theme@2.3.0(@algolia/client-search@4.24.0)(search-insights@2.17.2)(vitepress@1.4.3(@algolia/client-search@4.24.0)(@types/node@22.7.5)(postcss@8.4.47)(search-insights@2.17.2)(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))': + '@vue/shared@3.5.13': {} + + '@vue/theme@2.3.0(@algolia/client-search@4.24.0)(search-insights@2.17.2)(vitepress@1.5.0(@algolia/client-search@4.24.0)(@types/node@22.7.5)(postcss@8.4.49)(search-insights@2.17.2)(typescript@5.6.3))(vue@3.5.13(typescript@5.6.3))': dependencies: '@docsearch/css': 3.6.2 '@docsearch/js': 3.6.2(@algolia/client-search@4.24.0)(search-insights@2.17.2) - '@vueuse/core': 10.11.1(vue@3.5.12(typescript@5.6.3)) + '@vueuse/core': 10.11.1(vue@3.5.13(typescript@5.6.3)) body-scroll-lock: 4.0.0-beta.0 normalize.css: 8.0.1 tiny-decode: 0.1.3 - vitepress: 1.4.3(@algolia/client-search@4.24.0)(@types/node@22.7.5)(postcss@8.4.47)(search-insights@2.17.2)(typescript@5.6.3) + vitepress: 1.5.0(@algolia/client-search@4.24.0)(@types/node@22.7.5)(postcss@8.4.49)(search-insights@2.17.2)(typescript@5.6.3) transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -1322,31 +1365,31 @@ snapshots: - search-insights - vue - '@vueuse/core@10.11.1(vue@3.5.12(typescript@5.6.3))': + '@vueuse/core@10.11.1(vue@3.5.13(typescript@5.6.3))': dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 10.11.1 - '@vueuse/shared': 10.11.1(vue@3.5.12(typescript@5.6.3)) - vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) + '@vueuse/shared': 10.11.1(vue@3.5.13(typescript@5.6.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/core@11.1.0(vue@3.5.12(typescript@5.6.3))': + '@vueuse/core@11.1.0(vue@3.5.13(typescript@5.6.3))': dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 11.1.0 - '@vueuse/shared': 11.1.0(vue@3.5.12(typescript@5.6.3)) - vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) + '@vueuse/shared': 11.1.0(vue@3.5.13(typescript@5.6.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/integrations@11.1.0(focus-trap@7.6.0)(vue@3.5.12(typescript@5.6.3))': + '@vueuse/integrations@11.1.0(focus-trap@7.6.0)(vue@3.5.13(typescript@5.6.3))': dependencies: - '@vueuse/core': 11.1.0(vue@3.5.12(typescript@5.6.3)) - '@vueuse/shared': 11.1.0(vue@3.5.12(typescript@5.6.3)) - vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) + '@vueuse/core': 11.1.0(vue@3.5.13(typescript@5.6.3)) + '@vueuse/shared': 11.1.0(vue@3.5.13(typescript@5.6.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) optionalDependencies: focus-trap: 7.6.0 transitivePeerDependencies: @@ -1357,16 +1400,16 @@ snapshots: '@vueuse/metadata@11.1.0': {} - '@vueuse/shared@10.11.1(vue@3.5.12(typescript@5.6.3))': + '@vueuse/shared@10.11.1(vue@3.5.13(typescript@5.6.3))': dependencies: - vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/shared@11.1.0(vue@3.5.12(typescript@5.6.3))': + '@vueuse/shared@11.1.0(vue@3.5.13(typescript@5.6.3))': dependencies: - vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.6.3)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -1549,12 +1592,20 @@ snapshots: picocolors@1.1.0: {} + picocolors@1.1.1: {} + postcss@8.4.47: dependencies: nanoid: 3.3.7 picocolors: 1.1.0 source-map-js: 1.2.1 + postcss@8.4.49: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + preact@10.24.2: {} property-information@6.5.0: {} @@ -1669,27 +1720,28 @@ snapshots: '@types/node': 22.7.5 fsevents: 2.3.3 - vitepress@1.4.3(@algolia/client-search@4.24.0)(@types/node@22.7.5)(postcss@8.4.47)(search-insights@2.17.2)(typescript@5.6.3): + vitepress@1.5.0(@algolia/client-search@4.24.0)(@types/node@22.7.5)(postcss@8.4.49)(search-insights@2.17.2)(typescript@5.6.3): dependencies: '@docsearch/css': 3.6.2 '@docsearch/js': 3.6.2(@algolia/client-search@4.24.0)(search-insights@2.17.2) + '@iconify-json/simple-icons': 1.2.10 '@shikijs/core': 1.22.2 '@shikijs/transformers': 1.22.2 '@shikijs/types': 1.22.2 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.1.4(vite@5.4.10(@types/node@22.7.5))(vue@3.5.12(typescript@5.6.3)) + '@vitejs/plugin-vue': 5.1.4(vite@5.4.10(@types/node@22.7.5))(vue@3.5.13(typescript@5.6.3)) '@vue/devtools-api': 7.6.2 '@vue/shared': 3.5.12 - '@vueuse/core': 11.1.0(vue@3.5.12(typescript@5.6.3)) - '@vueuse/integrations': 11.1.0(focus-trap@7.6.0)(vue@3.5.12(typescript@5.6.3)) + '@vueuse/core': 11.1.0(vue@3.5.13(typescript@5.6.3)) + '@vueuse/integrations': 11.1.0(focus-trap@7.6.0)(vue@3.5.13(typescript@5.6.3)) focus-trap: 7.6.0 mark.js: 8.11.1 minisearch: 7.1.0 shiki: 1.22.2 vite: 5.4.10(@types/node@22.7.5) - vue: 3.5.12(typescript@5.6.3) + vue: 3.5.13(typescript@5.6.3) optionalDependencies: - postcss: 8.4.47 + postcss: 8.4.49 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -1720,9 +1772,9 @@ snapshots: vscode-uri@3.0.8: {} - vue-demi@0.14.10(vue@3.5.12(typescript@5.6.3)): + vue-demi@0.14.10(vue@3.5.13(typescript@5.6.3)): dependencies: - vue: 3.5.12(typescript@5.6.3) + vue: 3.5.13(typescript@5.6.3) vue-tsc@2.1.6(typescript@5.6.3): dependencies: @@ -1731,13 +1783,13 @@ snapshots: semver: 7.6.3 typescript: 5.6.3 - vue@3.5.12(typescript@5.6.3): + vue@3.5.13(typescript@5.6.3): dependencies: - '@vue/compiler-dom': 3.5.12 - '@vue/compiler-sfc': 3.5.12 - '@vue/runtime-dom': 3.5.12 - '@vue/server-renderer': 3.5.12(vue@3.5.12(typescript@5.6.3)) - '@vue/shared': 3.5.12 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.6.3)) + '@vue/shared': 3.5.13 optionalDependencies: typescript: 5.6.3 diff --git a/src/about/faq.md b/src/about/faq.md index 9a9faa84..3f325d80 100644 --- a/src/about/faq.md +++ b/src/about/faq.md @@ -22,8 +22,7 @@ vue ۳ آخرین نسخه‌ی major vue است که حاوی ویژگی‌ها vue۲.۷، که در جولای ۲۰۲۲ عرضه شد، آخرین نسخه‌ی minor vue ۲ است. vue ۲ حالا وارد حالت نگهداری شده است: vue ۲ دیگر ویژگی‌های جدیدی را ارائه نمی‌دهد ولی رفع باگ‌های ضروری را دریافت می‌کند و به‌روز رسانی‌های امنیتی را تا ۱۸ ماه بعد از انتشار vue ۲.۷ ارائه می‌دهد. این به این معناست که **vue ۲ در تاریخ ۱۰ دی ۱۴۰۲ به پایان عمر خود می‌رسد**. -ما بر این باور هستیم که این زمان زیاد برای مهاجرت بیشتر اکوسیستم به vue ۳ کافی‌ست. -به هر حال، ما متوجه هستیم که شاید گروه‌ها و یا پروژه‌هایی باشند که نتوانند در این مدت زمانی به vue ۳ ارتقا یابند در حالی که همچنان نیازمند امنیت و رضایت‌مندی هستند. ما در حال همکاری با حرفه‌های صنعت هستیم تا بتوانیم پشتیبانی بیشتری برای vue ۲ برای گروه‌هایی با این‌چنین نیازمندی‌هایی برقرار کنیم. اگر گروه شما می‌خواهد که بعد از ۲۰۲۳ همچنان از vue ۲ استفاده کند، در این رابطه برنامه‌ریزی کنید و راجع به [پشتیبانی طولانی مدت اضافی vue ۲](https://v2.vuejs.org/lts/) بیشتر بدانید. +ما بر این باور هستیم که این زمان زیاد برای مهاجرت بیشتر اکوسیستم به vue ۳ کافی‌ست. به هر حال، ما متوجه هستیم که شاید گروه‌ها و یا پروژه‌هایی باشند که نتوانند در این مدت زمانی به vue ۳ ارتقا یابند در حالی که همچنان نیازمند امنیت و رضایت‌مندی هستند. ما در حال همکاری با حرفه‌های صنعت هستیم تا بتوانیم پشتیبانی بیشتری برای vue ۲ برای گروه‌هایی با این‌چنین نیازمندی‌هایی برقرار کنیم. اگر گروه شما می‌خواهد که بعد از ۲۰۲۳ همچنان از vue ۲ استفاده کند، در این رابطه برنامه‌ریزی کنید و راجع به [پشتیبانی طولانی مدت اضافی vue ۲](https://v2.vuejs.org/lts/) بیشتر بدانید. ## vue از چه اجازه‌نامه‌ای استفاده می‌کند؟ {#what-license-does-vue-use} @@ -31,7 +30,7 @@ vue یک پروژه‌ی آزاد و متن‌باز است که با اجازه ## vue از چه مرورگرهایی پشتیبانی می‌کند؟ {#what-browsers-does-vue-support} -آخرین نسخه‌ی vue (۳.x) فقط از [مرورگرهای با پشتیبانی درونی ES2015](https://caniuse.com/es6) پشتیبانی می‌کند. این قضیه شامل Internet Explorer 11 نمی‌شود. vue ۳.x از ویژگی‌هایی از ES2015 استفاده می‌کند که نمی‌توانند در مرورگرهای قدیمی polyfill شوند. پس اگر شما به پشتیبانی از مرورگرهای قدیمی نیاز دارید، به جای vue ۳ از vue ۲ استفاده کنید. +آخرین نسخه‌ی vue (۳.x) فقط از [مرورگرهای با پشتیبانی درونی ES2016](https://caniuse.com/es2016) پشتیبانی می‌کند. این قضیه شامل Internet Explorer 11 نمی‌شود. vue ۳.x از ویژگی‌هایی از ES2015 استفاده می‌کند که نمی‌توانند در مرورگرهای قدیمی polyfill شوند. پس اگر شما به پشتیبانی از مرورگرهای قدیمی نیاز دارید، به جای vue ۳ از vue ۲ استفاده کنید. ## آیا vue قابل اعتماد است؟ {#is-vue-reliable} @@ -69,7 +68,6 @@ vue ۳ یکی از قدرتمندترین frameworkهای پراستفاده fro - [پشتیبانی فراگیر از ابزارها](/guide/scaling-up/tooling) به شما این اطمینان خاطر را می‌دهد که از یک تجربه‌ی توسعه‌ی روان در عین حال که برنامه رشد می‌کند بهره ببرید. - - موانع کمتر برای ورود و مستندات عالی باعث می‌شود که هزینه‌های ورود و آموزش توسعه‌دهنده‌های جدید کاهش یابد. ## چگونه می‌توان به vue مشارکت کرد؟ {#how-do-i-contribute-to-vue} diff --git a/src/api/api.data.ts b/src/api/api.data.ts index 719054fd..5c4f023b 100644 --- a/src/api/api.data.ts +++ b/src/api/api.data.ts @@ -1,15 +1,16 @@ // api.data.ts -// a file ending with data.(j|t)s will be evaluated in Node.js import fs from 'fs' import path from 'path' import type { MultiSidebarConfig } from '@vue/theme/src/vitepress/config.ts' import { sidebar } from '../../.vitepress/config' +// Interface defining the structure of a single header in the API interface APIHeader { anchor: string text: string } +// Interface defining the structure of an API group with text, anchor, and items export interface APIGroup { text: string anchor: string @@ -20,79 +21,108 @@ export interface APIGroup { }[] } -// declare resolved data type +// Declare the resolved data type for API groups export declare const data: APIGroup[] -export default { - // declare files that should trigger HMR - watch: './*.md', - // read from fs and generate the data - load(): APIGroup[] { - return (sidebar as MultiSidebarConfig)['/api/'].map((group) => ({ - text: group.text, - anchor: slugify(group.text), - items: group.items.map((item) => ({ - ...item, - headers: parsePageHeaders(item.link) - })) - })) - } +// Utility function to generate a slug from a string (used for anchor links) +function slugify(text: string): string { + return ( + text + // Replace special characters and spaces with hyphens + .replace(/[\s~`!@#$%^&*()\-_+=[\]{}|\\;:"'<>,.?/]+/g, '-') + // Remove continuous separators + .replace(/-{2,}/g, '-') + // Remove leading/trailing hyphens + .replace(/^-+|-+$/g, '') + // Ensure it doesn't start with a number (e.g. #121) + .replace(/^(\d)/, '_$1') + // Convert to lowercase + .toLowerCase() + ) } -const headersCache = new Map< - string, - { - headers: APIHeader[] - timestamp: number - } ->() - -function parsePageHeaders(link: string) { - const fullPath = path.join(__dirname, '../', link) + '.md' - const timestamp = fs.statSync(fullPath).mtimeMs +// Utility function to parse headers from a markdown file at a given link +function parsePageHeaders(link: string): APIHeader[] { + const fullPath = path.join(__dirname, '../', link) + '.md' // Resolve the full file path + const timestamp = fs.statSync(fullPath).mtimeMs // Get the last modified timestamp of the file + // Check if the file is cached and if its timestamp matches const cached = headersCache.get(fullPath) if (cached && timestamp === cached.timestamp) { - return cached.headers + return cached.headers // Return cached headers if they're up-to-date } - const src = fs.readFileSync(fullPath, 'utf-8') - const h2s = src.match(/^## [^\n]+/gm) + const src = fs.readFileSync(fullPath, 'utf-8') // Read the markdown file + const headers = extractHeadersFromMarkdown(src) // Extract headers from the file content + + // Store the extracted headers along with the file's timestamp in the cache + headersCache.set(fullPath, { + timestamp, + headers + }) + + return headers +} + +// Helper function to extract all headers (h2) from markdown content +function extractHeadersFromMarkdown(src: string): APIHeader[] { + const h2s = src.match(/^## [^\n]+/gm) // Match all h2 headers (## header) + const anchorRE = /\{#([^}]+)\}/ // Regular expression to match the anchor link in header (e.g. {#some-anchor}) let headers: APIHeader[] = [] + if (h2s) { - const anchorRE = /\{#([^}]+)\}/ + // Process each h2 header and extract text and anchor headers = h2s.map((h) => { - const text = h - .slice(2) - .replace(/