diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index 1d8c822..1e2aea3 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -21,7 +21,6 @@ jobs: with: key: lando-mvb-docs path: docs/.vitepress/cache/@lando/mvb - save-always: true - name: Install node ${{ matrix.node-version }} uses: actions/setup-node@v4 with: @@ -35,7 +34,8 @@ jobs: run: npm run lint - name: Run tests run: npm run test - - name: Test build - run: npm run build - name: Test multiversion build run: npx mvb docs + - name: Test build + run: npm run build + diff --git a/CHANGELOG.md b/CHANGELOG.md index ae28ed5..1c427d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,5 @@ ## {{ UNRELEASED_VERSION }} - [{{ UNRELEASED_DATE }}]({{ UNRELEASED_LINK }}) -* Added `getItemNormalizedLink` helper client util -* Added `normalize2base` helper client util -* Added `normalizeMVB` helper client util -* Added `normalizeRoot` helper client util * Added `version` alias information to config * Fixed bug preventing user specified `buildEnd` and `transformPageData` from running after theme's * Fixed bug preventing `mvb` from correctly setting the `mvbase` diff --git a/client/normalize-mvblink.js b/client/normalize-mvblink.js deleted file mode 100644 index dba6386..0000000 --- a/client/normalize-mvblink.js +++ /dev/null @@ -1,7 +0,0 @@ -import {useData} from 'vitepress'; -import {default as normalize} from './normalize-2base.js'; - -export default function normalizemvbLink(url) { - const {site} = useData(); - return normalize(url, site?.value?.themeConfig?.multiVersionBuild?.mvbase ?? '/'); -}; diff --git a/client/normalize-rootlink.js b/client/normalize-rootlink.js deleted file mode 100644 index 1df363a..0000000 --- a/client/normalize-rootlink.js +++ /dev/null @@ -1,5 +0,0 @@ -import {default as normalize} from './normalize-2base.js'; - -export default function normalizerootLink(url) { - return normalize(url, '/'); -}; diff --git a/components/VPLCollectionItemTags.vue b/components/VPLCollectionItemTags.vue index 713d957..031135b 100644 --- a/components/VPLCollectionItemTags.vue +++ b/components/VPLCollectionItemTags.vue @@ -21,7 +21,7 @@ diff --git a/config.js b/config.js index afe6c7b..3f11ef7 100644 --- a/config.js +++ b/config.js @@ -36,7 +36,6 @@ import {tabsMarkdownPlugin} from 'vitepress-plugin-tabs'; import {default as tabsMarkdownOverridePlugin} from './markdown/tabs-override-plugin.js'; // vitepress patches -import {default as patchVPHasActiveLink} from './vite/patch-vp-has-active-link.js'; import {default as patchVPMenuColumnsPlugin} from './vite/patch-vp-menu-columns-plugin.js'; import {default as patchVPUseSidebarControl} from './vite/patch-vp-use-sidebar-control.js'; @@ -135,7 +134,6 @@ export async function defineConfig(userConfig = {}, defaults = {}) { vite.plugins.push(...[ addLayoutsPlugin(layouts, {debug: debug.extend('vite-plugin')}), patchVPMenuColumnsPlugin({debug: debug.extend('vite-plugin')}), - patchVPHasActiveLink({debug: debug.extend('vite-plugin')}), patchVPUseSidebarControl({debug: debug.extend('vite-plugin')}), ]); diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js index de8b6e5..571c2f5 100644 --- a/docs/.vitepress/config.js +++ b/docs/.vitepress/config.js @@ -11,10 +11,11 @@ const require = createRequire(import.meta.url); // get version info const {version} = require('../../package.json'); +const semver = process?.env?.VPL_MVB_VERSION ? process.env.VPL_MVB_VERSION : `v${version}`; // sidebar ender const sidebarEnder = { - text: process?.env?.VPL_MVB_VERSION ? process.env.VPL_MVB_VERSION : `v${version}`, + text: semver, collapsed: true, items: [ { @@ -30,10 +31,10 @@ const sidebarEnder = { }; // if version is a stable or edge release then add in the release notes -if (!isDevRelease(version)) { +if (!isDevRelease(semver)) { sidebarEnder.items.splice(1, 0, { text: 'Release Notes', - link: `https://github.com/lando/vitepress-theme-default-plus/releases/tag/v${version}`, + link: `https://github.com/lando/vitepress-theme-default-plus/releases/tag/v${semver}`, }); } diff --git a/client/encode-tag.js b/utils/encode-tag.js similarity index 100% rename from client/encode-tag.js rename to utils/encode-tag.js diff --git a/client/get-item-nl.js b/utils/get-item-nl.js similarity index 58% rename from client/get-item-nl.js rename to utils/get-item-nl.js index 11da869..eceb165 100644 --- a/client/get-item-nl.js +++ b/utils/get-item-nl.js @@ -1,7 +1,6 @@ -import {useData} from 'vitepress'; import {default as normalize} from './normalize-2base.js'; -export default function getItemNormalizedLink(item) { +export default function getItemNormalizedLink(item, site) { // if we dont have what we need just return that garbage if (!item.link) return item.link; @@ -9,6 +8,5 @@ export default function getItemNormalizedLink(item) { if (item.rel !== 'mvb') return item.link; // otherwise normalize on version base - const {site} = useData(); - return normalize(item.link, site?.value?.themeConfig?.multiVersionBuild?.base ?? '/'); + return normalize(item.link, site?.themeConfig?.multiVersionBuild?.base ?? '/', site); }; diff --git a/client/is-active.js b/utils/is-active.js similarity index 100% rename from client/is-active.js rename to utils/is-active.js diff --git a/client/normalize-2base.js b/utils/normalize-2base.js similarity index 91% rename from client/normalize-2base.js rename to utils/normalize-2base.js index b8f36c4..7dc9560 100644 --- a/client/normalize-2base.js +++ b/utils/normalize-2base.js @@ -1,5 +1,3 @@ -import {useData} from 'vitepress'; - const EXTERNAL_URL_RE = /^(?:[a-z]+:|\/\/)/i; const KNOWN_EXTENSIONS = new Set(); @@ -30,15 +28,13 @@ const treatAsHtml = filename => { return ext == null || !KNOWN_EXTENSIONS.has(ext.toLowerCase()); }; -export default function normalize2Base(url, base = '/') { +export default function normalize2Base(url, base = '/', site) { const {pathname, search, hash, protocol} = new URL(url, 'http://lando.dev'); // return external urls if (isExternal(url) || url.startsWith('#') || !protocol.startsWith('http') || !treatAsHtml(pathname)) return url; // otherwise do the usual normalization - const {site} = useData(); - const path = pathname.endsWith('/') || pathname.endsWith('.html') ? url @@ -46,7 +42,7 @@ export default function normalize2Base(url, base = '/') { /(?:(^\.+)\/)?.*$/, `$1${pathname.replace( /(\.md)?$/, - site.value.cleanUrls ? '' : '.html', + site.cleanUrls ? '' : '.html', )}${search}${hash}`, ); diff --git a/utils/normalize-items.js b/utils/normalize-items.js new file mode 100644 index 0000000..16effb1 --- /dev/null +++ b/utils/normalize-items.js @@ -0,0 +1,9 @@ +import {default as getItemNormalizedLink} from './get-item-nl.js'; + +export default function normalizeItems(items, site) { + return items.map(item => { + if (item.items && Array.isArray(item.items)) return normalizeItems(item.items, site); + else if (item.rel !== 'mvb') return item; + else return {...item, link: getItemNormalizedLink(item, site)}; + }); +}; diff --git a/utils/normalize-mvblink.js b/utils/normalize-mvblink.js new file mode 100644 index 0000000..bee8ec9 --- /dev/null +++ b/utils/normalize-mvblink.js @@ -0,0 +1,5 @@ +import {default as normalize} from './normalize-2base.js'; + +export default function normalizemvbLink(url, site) { + return normalize(url, site?.themeConfig?.multiVersionBuild?.mvbase ?? '/', site); +}; diff --git a/utils/normalize-rootlink.js b/utils/normalize-rootlink.js new file mode 100644 index 0000000..ffa017a --- /dev/null +++ b/utils/normalize-rootlink.js @@ -0,0 +1,5 @@ +import {default as normalize} from './normalize-2base.js'; + +export default function normalizerootLink(url, site) { + return normalize(url, '/', site); +}; diff --git a/vite/patch-vp-has-active-link.js b/vite/patch-vp-has-active-link.js deleted file mode 100644 index d81b365..0000000 --- a/vite/patch-vp-has-active-link.js +++ /dev/null @@ -1,21 +0,0 @@ -import Debug from 'debug'; -import {EOL} from 'node:os'; - -export default function({debug = Debug('@lando/vite-plugin')}) { // eslint-disable-line - return { - name: 'vp-has-active-links', - enforce: 'pre', - transform: (code, id) => { - const supportfile = 'dist/client/theme-default/support/sidebar.js'; - if (id.includes(supportfile)) { - // prepend our mvb normalizer - code = `import { getItemNormalizedLink } from '@lando/vitepress-theme-default-plus';${EOL}${code}`; - // and then use it - code = code.replace('return isActive(path, items.link)', 'return isActive(path, getItemNormalizedLink(items))'); - // log - debug('patched %o to use getItemNormalizedLink', supportfile); - return code; - } - }, - }; -}; diff --git a/vite/patch-vp-use-sidebar-control.js b/vite/patch-vp-use-sidebar-control.js index ce6d1ba..194519d 100644 --- a/vite/patch-vp-use-sidebar-control.js +++ b/vite/patch-vp-use-sidebar-control.js @@ -10,11 +10,26 @@ export default function({debug = Debug('@lando/vite-plugin')}) { // eslint-disab if (id.includes(supportfile)) { // prepend our mvb normalizer code = `import { getItemNormalizedLink } from '@lando/vitepress-theme-default-plus';${EOL}${code}`; - // and then use it + code = `import { normalizeItems } from '@lando/vitepress-theme-default-plus';${EOL}${code}`; + + // make sure we get "site" as well + code = code.replace( + 'const { page, hash } = useData()', + 'const { site, page, hash } = useData()', + ); + + // and then use getItemNormalizedLink code = code.replace( 'isActive(page.value.relativePath, item.value.link)', - 'isActive(page.value.relativePath, getItemNormalizedLink(item.value))', + 'isActive(page.value.relativePath, getItemNormalizedLink(item.value, site.value))', ); + + // and also use normalizeItems + code = code.replace( + 'containsActiveLink(page.value.relativePath, item.value.items)', + 'containsActiveLink(page.value.relativePath, normalizeItems(item.value.items, site.value))', + ); + // log debug('patched %o to use getItemNormalizedLink', supportfile); return code; diff --git a/vitepress-theme-default-plus.js b/vitepress-theme-default-plus.js index a11c32d..6e0a507 100644 --- a/vitepress-theme-default-plus.js +++ b/vitepress-theme-default-plus.js @@ -17,19 +17,21 @@ import VPLSponsors from './components/VPLSponsors.vue'; import VPLYouTube from './components/VPLYouTube.vue'; // composables -export {default as isActive} from './client/is-active.js'; -export {default as isDevRelease} from './utils/is-dev-release.js'; -export {default as isFauxInternal} from './utils/is-faux-internal.js'; -export {default as encodeTag} from './client/encode-tag.js'; -export {default as getBaseUrl} from './utils/get-base-url.js'; -export {default as getItemNormalizedLink} from './client/get-item-nl.js'; -export {default as normalize2base} from './client/normalize-2base.js'; -export {default as normalizeMVB} from './client/normalize-mvblink.js'; -export {default as normalizeRoot} from './client/normalize-rootlink.js'; export {default as useCollection} from './client/use-collection.js'; export {default as useTags} from './client/use-tags.js'; export {default as useTeam} from './client/use-team.js'; +// shared utils +export {default as encodeTag} from './utils/encode-tag.js'; +export {default as getItemNormalizedLink} from './utils/get-item-nl.js'; +export {default as isFauxInternal} from './utils/is-faux-internal.js'; +export {default as isDevRelease} from './utils/is-dev-release.js'; +export {default as isActive} from './utils/is-active.js'; +export {default as normalize2base} from './utils/normalize-2base.js'; +export {default as normalizeItems} from './utils/normalize-items.js'; +export {default as normalizeMVB} from './utils/normalize-mvblink.js'; +export {default as normalizeRoot} from './utils/normalize-rootlink.js'; + // components export {default as VPLAlert} from './components/VPLAlert.vue'; export {default as VPLLink} from './components/VPLLink.vue';