test/node_modules/@vuepress/client/dist/app.js
2024-08-13 09:27:52 +08:00

317 lines
8.9 KiB
JavaScript

import {
ClientOnly,
Content,
RouteLink,
clientDataSymbol,
redirects,
resolveRoute,
resolvers,
routes,
updateHeadSymbol,
usePageHead,
usePageLang,
usePageLayout,
withBase
} from "./chunk-YRXAAVF4.js";
// src/app.ts
import { clientConfigs } from "@internal/clientConfigs";
import { createApp, createSSRApp, h } from "vue";
// src/internal/siteData.ts
import { siteData as siteDataRaw } from "@internal/siteData";
import { shallowRef } from "vue";
var siteData = shallowRef(siteDataRaw);
if (__VUEPRESS_DEV__ && (import.meta.webpackHot || import.meta.hot)) {
__VUE_HMR_RUNTIME__.updateSiteData = (data) => {
siteData.value = data;
};
}
// src/router/createVueRouter.ts
import { removeEndingSlash } from "@vuepress/shared";
import {
createMemoryHistory,
createRouter,
createWebHistory,
START_LOCATION
} from "vue-router";
var historyCreator = __VUEPRESS_SSR__ ? createMemoryHistory : createWebHistory;
var createVueRouter = () => {
const router = createRouter({
// it might be an issue of vue-router that have to remove the ending slash
history: historyCreator(removeEndingSlash(__VUEPRESS_BASE__)),
routes: [
{
name: "vuepress-route",
path: "/:catchAll(.*)",
components: {}
}
],
scrollBehavior: (to, _from, savedPosition) => {
if (savedPosition) return savedPosition;
if (to.hash) return { el: to.hash };
return { top: 0 };
}
});
router.beforeResolve(async (to, from) => {
if (to.path !== from.path || from === START_LOCATION) {
const route = resolveRoute(to.fullPath);
if (route.path !== to.fullPath) {
return route.path;
}
const pageChunk = await route.loader();
to.meta = {
// attach route meta
...route.meta,
// attach page chunk route meta
_pageChunk: pageChunk
};
} else if (to.path === from.path) {
to.meta = from.meta;
}
});
return router;
};
// src/setupGlobalComponents.ts
var setupGlobalComponents = (app) => {
app.component("ClientOnly", ClientOnly);
app.component("Content", Content);
app.component("RouteLink", RouteLink);
};
// src/setupGlobalComputed.ts
import { computed, customRef } from "vue";
var setupGlobalComputed = (app, router, clientConfigs2) => {
const routePath = computed(() => router.currentRoute.value.path);
const pageChunk = customRef((track, trigger) => ({
get() {
track();
return router.currentRoute.value.meta._pageChunk;
},
set(value) {
router.currentRoute.value.meta._pageChunk = value;
trigger();
}
}));
if (__VUEPRESS_DEV__ && (import.meta.webpackHot || import.meta.hot)) {
__VUE_HMR_RUNTIME__.updatePageData = async (newPageData) => {
const oldPageChunk = await routes.value[newPageData.path].loader();
const newPageChunk = { comp: oldPageChunk.comp, data: newPageData };
routes.value[newPageData.path].loader = () => Promise.resolve(newPageChunk);
if (newPageData.path === router.currentRoute.value.meta._pageChunk?.data.path) {
pageChunk.value = newPageChunk;
}
};
}
const layouts = computed(() => resolvers.resolveLayouts(clientConfigs2));
const routeLocale = computed(
() => resolvers.resolveRouteLocale(siteData.value.locales, routePath.value)
);
const siteLocaleData = computed(
() => resolvers.resolveSiteLocaleData(siteData.value, routeLocale.value)
);
const pageComponent = computed(() => pageChunk.value.comp);
const pageData = computed(() => pageChunk.value.data);
const pageFrontmatter = computed(() => pageData.value.frontmatter);
const pageHeadTitle = computed(
() => resolvers.resolvePageHeadTitle(pageData.value, siteLocaleData.value)
);
const pageHead = computed(
() => resolvers.resolvePageHead(
pageHeadTitle.value,
pageFrontmatter.value,
siteLocaleData.value
)
);
const pageLang = computed(
() => resolvers.resolvePageLang(pageData.value, siteLocaleData.value)
);
const pageLayout = computed(
() => resolvers.resolvePageLayout(pageData.value, layouts.value)
);
const clientData = {
layouts,
pageData,
pageComponent,
pageFrontmatter,
pageHead,
pageHeadTitle,
pageLang,
pageLayout,
redirects,
routeLocale,
routePath,
routes,
siteData,
siteLocaleData
};
app.provide(clientDataSymbol, clientData);
Object.defineProperties(app.config.globalProperties, {
$frontmatter: { get: () => pageFrontmatter.value },
$head: { get: () => pageHead.value },
$headTitle: { get: () => pageHeadTitle.value },
$lang: { get: () => pageLang.value },
$page: { get: () => pageData.value },
$routeLocale: { get: () => routeLocale.value },
$site: { get: () => siteData.value },
$siteLocale: { get: () => siteLocaleData.value },
$withBase: { get: () => withBase }
});
return clientData;
};
// src/setupUpdateHead.ts
import { isPlainObject, isString } from "@vuepress/shared";
import { onMounted, provide, useSSRContext, watch } from "vue";
var setupUpdateHead = () => {
const head = usePageHead();
const lang = usePageLang();
if (__VUEPRESS_SSR__) {
const ssrContext = useSSRContext();
if (ssrContext) {
ssrContext.head = head.value;
ssrContext.lang = lang.value;
}
return;
}
let managedHeadElements = [];
const takeOverHeadElements = () => {
head.value.forEach((item) => {
const headElement = queryHeadElement(item);
if (headElement) {
managedHeadElements.push(headElement);
}
});
};
const generateHeadElements = () => {
const result = [];
head.value.forEach((item) => {
const headElement = createHeadElement(item);
if (headElement) {
result.push(headElement);
}
});
return result;
};
const updateHead = () => {
document.documentElement.lang = lang.value;
const newHeadElements = generateHeadElements();
managedHeadElements.forEach((oldEl, oldIndex) => {
const matchedIndex = newHeadElements.findIndex(
(newEl) => oldEl.isEqualNode(newEl)
);
if (matchedIndex === -1) {
oldEl.remove();
delete managedHeadElements[oldIndex];
} else {
newHeadElements.splice(matchedIndex, 1);
}
});
newHeadElements.forEach((el) => document.head.appendChild(el));
managedHeadElements = [
// filter out empty deleted items
...managedHeadElements.filter((item) => !!item),
...newHeadElements
];
};
provide(updateHeadSymbol, updateHead);
onMounted(() => {
if (!__VUEPRESS_DEV__) {
takeOverHeadElements();
}
watch(head, updateHead, { immediate: __VUEPRESS_DEV__ });
});
};
var queryHeadElement = ([
tagName,
attrs,
content = ""
]) => {
const attrsSelector = Object.entries(attrs).map(([key, value]) => {
if (isString(value)) {
return `[${key}=${JSON.stringify(value)}]`;
}
if (value === true) {
return `[${key}]`;
}
return "";
}).join("");
const selector = `head > ${tagName}${attrsSelector}`;
const headElements = Array.from(
document.querySelectorAll(selector)
);
const matchedHeadElement = headElements.find(
(item) => item.innerText === content
);
return matchedHeadElement || null;
};
var createHeadElement = ([
tagName,
attrs,
content
]) => {
if (!isString(tagName)) {
return null;
}
const headElement = document.createElement(tagName);
if (isPlainObject(attrs)) {
Object.entries(attrs).forEach(([key, value]) => {
if (isString(value)) {
headElement.setAttribute(key, value);
} else if (value === true) {
headElement.setAttribute(key, "");
}
});
}
if (isString(content)) {
headElement.appendChild(document.createTextNode(content));
}
return headElement;
};
// src/app.ts
var appCreator = __VUEPRESS_DEV__ ? createApp : createSSRApp;
var createVueApp = async () => {
const app = appCreator({
name: "Vuepress",
setup() {
setupUpdateHead();
for (const clientConfig of clientConfigs) {
clientConfig.setup?.();
}
const rootComponents = clientConfigs.flatMap(
({ rootComponents: rootComponents2 = [] }) => rootComponents2.map((component) => h(component))
);
const pageLayout = usePageLayout();
return () => [h(pageLayout.value), rootComponents];
}
});
const router = createVueRouter();
setupGlobalComponents(app);
const globalComputed = setupGlobalComputed(app, router, clientConfigs);
if (__VUEPRESS_DEV__ || __VUE_PROD_DEVTOOLS__) {
const { setupDevtools } = await import("./setupDevtools-HHDGOOYC.js");
setupDevtools(app, globalComputed);
}
for (const clientConfig of clientConfigs) {
await clientConfig.enhance?.({ app, router, siteData });
}
app.use(router);
return {
app,
router
};
};
if (!__VUEPRESS_SSR__) {
createVueApp().then(({ app, router }) => {
router.isReady().then(() => {
app.mount("#app");
});
});
}
export {
createVueApp
};