{"_id":"@ampernic/vitepress-plugin-cross-site-router","_rev":"3-ffa852493c583e8dbc82c4b10087fcc3","name":"@ampernic/vitepress-plugin-cross-site-router","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@ampernic/vitepress-plugin-cross-site-router","version":"0.1.0","keywords":["vitepress","plugin","router","multi-instance","cross-site"],"author":{"name":"Ampernic"},"license":"GPL-3.0-or-later","_id":"@ampernic/vitepress-plugin-cross-site-router@0.1.0","maintainers":[{"name":"ampernic","email":"ampernic@inbox.ru"}],"homepage":"https://integrations.ampernic.space/","bugs":{"url":"https://altlinux.space/ampernic/integrations/issues"},"dist":{"shasum":"dded7be440626b9b8b5514d1f3aa7efe651940a5","tarball":"https://registry.npmjs.org/@ampernic/vitepress-plugin-cross-site-router/-/vitepress-plugin-cross-site-router-0.1.0.tgz","fileCount":14,"integrity":"sha512-iqvVguoiz+LNyNQ2x02LE5kMee9T93N9sFfqefcM9INs09s2iqzCFemOjEvNmDrWIeh2b36kWznGw0q4VwlUzA==","signatures":[{"sig":"MEQCIG3IEiJ9V8FbYoN+6SLeXuuwFsNO+gBIfcrxKgNQMSEzAiBGypHTYAwEYgq7OcH2uhzqMSQH+qOjL7JnU4c35nWxJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47690},"main":"./dist/vite/index.js","_from":"file:ampernic-vitepress-plugin-cross-site-router-0.1.0.tgz","types":"./dist/vite/index.d.ts","module":"./dist/vite/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/vite/index.d.ts","import":"./dist/vite/index.mjs","require":"./dist/vite/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.mjs","require":"./dist/client/index.js"}},"scripts":{"dev":"unbuild --stub","stub":"unbuild --stub","build":"unbuild","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ampernic","email":"ampernic@inbox.ru"},"_resolved":"/tmp/e6a0b2d85ed78a1f3f00ae4c9416b977/ampernic-vitepress-plugin-cross-site-router-0.1.0.tgz","_integrity":"sha512-iqvVguoiz+LNyNQ2x02LE5kMee9T93N9sFfqefcM9INs09s2iqzCFemOjEvNmDrWIeh2b36kWznGw0q4VwlUzA==","repository":{"url":"https://altlinux.space/ampernic/integrations.git","type":"git","directory":"packages/vitepress-plugin-cross-site-router"},"_npmVersion":"10.9.7","description":"VitePress plugin for correct same-tab navigation between independently-deployed VitePress instances sharing an origin","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"unbuild":"^2.0.0","builtin-modules":"^3.3.0"},"peerDependencies":{"vue":"^3.0.0","vitepress":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vitepress-plugin-cross-site-router_0.1.0_1775821756382_0.043832610535602834","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@ampernic/vitepress-plugin-cross-site-router","version":"0.1.1","keywords":["vitepress","plugin","router","multi-instance","cross-site"],"author":{"name":"Ampernic"},"license":"GPL-3.0-or-later","_id":"@ampernic/vitepress-plugin-cross-site-router@0.1.1","maintainers":[{"name":"ampernic","email":"ampernic@inbox.ru"}],"homepage":"https://integrations.ampernic.space/","bugs":{"url":"https://altlinux.space/ampernic/integrations/issues"},"dist":{"shasum":"78d6f88a4d3b0218b229a934790bd80b25ef88af","tarball":"https://registry.npmjs.org/@ampernic/vitepress-plugin-cross-site-router/-/vitepress-plugin-cross-site-router-0.1.1.tgz","fileCount":14,"integrity":"sha512-038dUL7V/jCDhOSSipXjzmCjWX/8WKZztF4TvLPZ1C8bIzYXJxgki9TDaBVAjSFSI1RanotyJSvFEcggLWvt3g==","signatures":[{"sig":"MEQCIGWqCS+Kh19eUjgd8zmxLzEX2lOzgpdfnZIGQAdS56/HAiAtZBdILqPoJCKBVGO99NqWmOV8wLyM6prxMuZuUQFyyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47690},"main":"./dist/vite/index.js","_from":"file:ampernic-vitepress-plugin-cross-site-router-0.1.1.tgz","types":"./dist/vite/index.d.ts","module":"./dist/vite/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/vite/index.d.ts","import":"./dist/vite/index.mjs","require":"./dist/vite/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.mjs","require":"./dist/client/index.js"}},"scripts":{"dev":"unbuild --stub","stub":"unbuild --stub","build":"unbuild","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ampernic","email":"ampernic@inbox.ru"},"_resolved":"/tmp/c20d40a183eb1a718e731ed2a9f05ab8/ampernic-vitepress-plugin-cross-site-router-0.1.1.tgz","_integrity":"sha512-038dUL7V/jCDhOSSipXjzmCjWX/8WKZztF4TvLPZ1C8bIzYXJxgki9TDaBVAjSFSI1RanotyJSvFEcggLWvt3g==","repository":{"url":"https://altlinux.space/ampernic/integrations.git","type":"git","directory":"packages/vitepress-plugin-cross-site-router"},"_npmVersion":"10.9.7","description":"VitePress plugin for correct same-tab navigation between independently-deployed VitePress instances sharing an origin","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"unbuild":"^2.0.0","builtin-modules":"^3.3.0"},"peerDependencies":{"vue":"^3.0.0","vitepress":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vitepress-plugin-cross-site-router_0.1.1_1775822062394_0.9720016983674817","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@ampernic/vitepress-plugin-cross-site-router","version":"0.1.2","description":"VitePress plugin for correct same-tab navigation between independently-deployed VitePress instances sharing an origin","main":"./dist/vite/index.js","module":"./dist/vite/index.mjs","types":"./dist/vite/index.d.ts","exports":{".":{"types":"./dist/vite/index.d.ts","import":"./dist/vite/index.mjs","require":"./dist/vite/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.mjs","require":"./dist/client/index.js"}},"keywords":["vitepress","plugin","router","multi-instance","cross-site"],"license":"GPL-3.0-or-later","author":{"name":"Ampernic"},"homepage":"https://integrations.ampernic.space/","repository":{"type":"git","url":"https://altlinux.space/ampernic/integrations.git","directory":"packages/vitepress-plugin-cross-site-router"},"bugs":{"url":"https://altlinux.space/ampernic/integrations/issues"},"engines":{"node":">=16.0.0"},"peerDependencies":{"vitepress":"^1.0.0","vue":"^3.0.0"},"devDependencies":{"builtin-modules":"^3.3.0","unbuild":"^2.0.0"},"publishConfig":{"access":"public"},"scripts":{"build":"unbuild","dev":"unbuild --stub","stub":"unbuild --stub","typecheck":"tsc --noEmit"},"_id":"@ampernic/vitepress-plugin-cross-site-router@0.1.2","_integrity":"sha512-FtMzTm/nsMVwKUbvEgJqhF0+cpqWY1ha39ZBBZ13Wvhv5unloUSL/VOeFKJSx40r+M1NTR4DbOpndS91umzsQA==","_resolved":"/tmp/0e1e0d254c98953b6d86b6824084907e/ampernic-vitepress-plugin-cross-site-router-0.1.2.tgz","_from":"file:ampernic-vitepress-plugin-cross-site-router-0.1.2.tgz","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-FtMzTm/nsMVwKUbvEgJqhF0+cpqWY1ha39ZBBZ13Wvhv5unloUSL/VOeFKJSx40r+M1NTR4DbOpndS91umzsQA==","shasum":"373ba22a9da10d4989d63c62738da2592abbcc30","tarball":"https://registry.npmjs.org/@ampernic/vitepress-plugin-cross-site-router/-/vitepress-plugin-cross-site-router-0.1.2.tgz","fileCount":15,"unpackedSize":51042,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDtZhwPIzcDiaqgeUvTrf3LPDpjsn7Vw9upbH7ynhGF4gIhAM+lMX/gvoD/oPu0B6ox2eDzznhKAi4tev3sAVNlWCcO"}]},"_npmUser":{"name":"ampernic","email":"ampernic@inbox.ru"},"directories":{},"maintainers":[{"name":"ampernic","email":"ampernic@inbox.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vitepress-plugin-cross-site-router_0.1.2_1775823721419_0.9184167069904188"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-10T11:49:16.290Z","modified":"2026-04-10T12:22:01.644Z","0.1.0":"2026-04-10T11:49:16.526Z","0.1.1":"2026-04-10T11:54:22.536Z","0.1.2":"2026-04-10T12:22:01.554Z"},"bugs":{"url":"https://altlinux.space/ampernic/integrations/issues"},"author":{"name":"Ampernic"},"license":"GPL-3.0-or-later","homepage":"https://integrations.ampernic.space/","keywords":["vitepress","plugin","router","multi-instance","cross-site"],"repository":{"type":"git","url":"https://altlinux.space/ampernic/integrations.git","directory":"packages/vitepress-plugin-cross-site-router"},"description":"VitePress plugin for correct same-tab navigation between independently-deployed VitePress instances sharing an origin","maintainers":[{"name":"ampernic","email":"ampernic@inbox.ru"}],"readme":"# @ampernic/vitepress-plugin-cross-site-router\n\nИсправляет навигацию и prefetch между несколькими независимо развёрнутыми экземплярами VitePress на одном origin.\n\n## Проблема\n\nПри хостинге нескольких VitePress-сайтов на одном домене с разными base-путями (например `/alt-server/`, `/alt-workstation/`) возникают две проблемы:\n\n1. **Ошибка SPA-навигации** — VitePress перехватывает все клики по ссылкам одного origin и пытается выполнить SPA-переход, не находит чанки соседнего сайта и ломается.\n2. **Лишние prefetch-запросы** — prefetcher VitePress пытается предзагрузить страницы соседних сайтов, получая 404.\n\n## Решение\n\nПлагин подменяет логику router'а и prefetch'а:\n1. Перехватывает `router.onBeforeRouteChange` — если href не принадлежит текущему base, выполняет `location.href` (полный переход).\n2. Оборачивает `window.IntersectionObserver` до того, как VitePress создаст prefetch-observer — ссылки на соседние сайты в очередь prefetch не попадают.\n\n## Установка\n\n```bash\nnpm install @ampernic/vitepress-plugin-cross-site-router\n```\n\n## Использование\n\nПлагин состоит из двух частей: Vite-плагин (опционален) и клиентский рантайм.\n\n### VitePress config\n\n```ts\nimport { CrossSiteRouterPlugin } from '@ampernic/vitepress-plugin-cross-site-router'\n\nexport default defineConfig({\n  vite: {\n    plugins: [CrossSiteRouterPlugin()],\n  },\n})\n```\n\n### Theme `enhanceApp`\n\n```ts\nimport {\n  installCrossSiteRouter,\n  suppressCrossSitePrefetch,\n} from '@ampernic/vitepress-plugin-cross-site-router/client'\n\nexport default {\n  enhanceApp({ router, siteData }) {\n    installCrossSiteRouter(router, siteData)\n    suppressCrossSitePrefetch(siteData)\n  },\n}\n```\n\n## API\n\n### `installCrossSiteRouter(router, siteData)`\n\nУстанавливает хук `router.onBeforeRouteChange`. Если целевой href не начинается с `siteData.base` или отсутствует в `__VP_HASH_MAP__` (prod), выполняет `location.href` вместо SPA-перехода.\n\n### `suppressCrossSitePrefetch(siteData)`\n\nПодменяет `window.IntersectionObserver` так, чтобы prefetch-observer VitePress никогда не добавлял в очередь ссылки, ведущие за пределы `siteData.base`.\n\n### `isCrossSiteHref(href, base)`\n\nУтилита для проверки, является ли href межсайтовым относительно данного base.\n\n### `CrossSiteRouterPlugin(options?)`\n\nVite-плагин. Служит точкой входа для build-time интеграции.\n\n| Опция | Тип | Описание |\n|-------|-----|----------|\n| `isCrossSite` | `(href, base) => boolean \\| undefined` | Кастомный предикат определения межсайтовых ссылок |\n\n## Лицензия\n\nGPL-3.0-or-later\n","readmeFilename":"README.md"}