From 958d970efabb21dbd4ca315249d549a5c1e949fb Mon Sep 17 00:00:00 2001 From: "Mr.Hope" Date: Fri, 21 Apr 2023 13:59:42 +0800 Subject: [PATCH 1/3] feat(client): add support for clientData --- packages/client/src/app.ts | 6 ++++++ packages/client/src/composables/clientData.ts | 15 +++++++++++++++ packages/client/src/composables/index.ts | 1 + packages/client/src/helpers/defineClientData.ts | 13 +++++++++++++ packages/client/src/helpers/index.ts | 1 + 5 files changed, 36 insertions(+) create mode 100644 packages/client/src/composables/clientData.ts create mode 100644 packages/client/src/helpers/defineClientData.ts diff --git a/packages/client/src/app.ts b/packages/client/src/app.ts index 8ea77ffd41..bded528e2a 100644 --- a/packages/client/src/app.ts +++ b/packages/client/src/app.ts @@ -2,6 +2,7 @@ import { clientConfigs } from '@internal/clientConfigs' import { createApp, createSSRApp, h } from 'vue' import { RouterView } from 'vue-router' import { siteData } from './composables/index.js' +import { clientDataMap } from './helpers/index.js' import { createVueRouter } from './router.js' import { setupGlobalComponents } from './setupGlobalComponents.js' import { setupGlobalComputed } from './setupGlobalComputed.js' @@ -50,6 +51,11 @@ export const createVueApp: CreateVueAppFunction = async () => { setupDevtools(app, globalComputed) } + // provide client data + for (const [key, value] of clientDataMap) { + app.provide(key, value) + } + // invoke all client enhance for (const clientConfig of clientConfigs) { await clientConfig.enhance?.({ app, router, siteData }) diff --git a/packages/client/src/composables/clientData.ts b/packages/client/src/composables/clientData.ts new file mode 100644 index 0000000000..0a6fac9a3e --- /dev/null +++ b/packages/client/src/composables/clientData.ts @@ -0,0 +1,15 @@ +import { inject } from 'vue' +import type { InjectionKey } from 'vue' + +export const useClientData = ( + key: InjectionKey, + required?: U +): U extends true ? T : T | undefined => { + const result = inject(key) + + if (required && !result) { + throw new Error(`Can not found ${key} in clientData()`) + } + + return result +} diff --git a/packages/client/src/composables/index.ts b/packages/client/src/composables/index.ts index 838b38b191..4253ac28d4 100644 --- a/packages/client/src/composables/index.ts +++ b/packages/client/src/composables/index.ts @@ -1,3 +1,4 @@ +export * from './clientData.js' export * from './layouts.js' export * from './pageData.js' export * from './pageFrontmatter.js' diff --git a/packages/client/src/helpers/defineClientData.ts b/packages/client/src/helpers/defineClientData.ts new file mode 100644 index 0000000000..9f11a2f2a3 --- /dev/null +++ b/packages/client/src/helpers/defineClientData.ts @@ -0,0 +1,13 @@ +import type { InjectionKey } from 'vue' + +export const clientDataMap = new Map, unknown>() + +/** + * A helper function to help you define vuepress client data + */ +export const defineClientData = ( + key: InjectionKey, + data: T +): void => { + clientDataMap.set(key, data) +} diff --git a/packages/client/src/helpers/index.ts b/packages/client/src/helpers/index.ts index e5726afa68..223b916e0a 100644 --- a/packages/client/src/helpers/index.ts +++ b/packages/client/src/helpers/index.ts @@ -1,2 +1,3 @@ export * from './defineClientConfig.js' +export * from './defineClientData.js' export * from './withBase.js' From 76973910e99765195af2b8cdcbc0d7aba2feffa5 Mon Sep 17 00:00:00 2001 From: "Mr.Hope" Date: Fri, 21 Apr 2023 14:07:54 +0800 Subject: [PATCH 2/3] feat(client): add overrideExisting arg --- packages/client/src/helpers/defineClientData.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/client/src/helpers/defineClientData.ts b/packages/client/src/helpers/defineClientData.ts index 9f11a2f2a3..cc71048590 100644 --- a/packages/client/src/helpers/defineClientData.ts +++ b/packages/client/src/helpers/defineClientData.ts @@ -7,7 +7,8 @@ export const clientDataMap = new Map, unknown>() */ export const defineClientData = ( key: InjectionKey, - data: T + data: T, + overrideExisting = true ): void => { - clientDataMap.set(key, data) + if (overrideExisting || !clientDataMap.has(key)) clientDataMap.set(key, data) } From 16897a78d461f97e60a25d361eaf386fc9c68db2 Mon Sep 17 00:00:00 2001 From: "Mr.Hope" Date: Mon, 20 Nov 2023 15:12:35 +0800 Subject: [PATCH 3/3] style: fix linter --- packages/client/src/composables/clientData.ts | 4 ++-- packages/client/src/helpers/defineClientData.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/client/src/composables/clientData.ts b/packages/client/src/composables/clientData.ts index 0a6fac9a3e..cc09150723 100644 --- a/packages/client/src/composables/clientData.ts +++ b/packages/client/src/composables/clientData.ts @@ -3,7 +3,7 @@ import type { InjectionKey } from 'vue' export const useClientData = ( key: InjectionKey, - required?: U + required?: U, ): U extends true ? T : T | undefined => { const result = inject(key) @@ -11,5 +11,5 @@ export const useClientData = ( throw new Error(`Can not found ${key} in clientData()`) } - return result + return result as U extends true ? T : T | undefined } diff --git a/packages/client/src/helpers/defineClientData.ts b/packages/client/src/helpers/defineClientData.ts index cc71048590..6537e528be 100644 --- a/packages/client/src/helpers/defineClientData.ts +++ b/packages/client/src/helpers/defineClientData.ts @@ -8,7 +8,7 @@ export const clientDataMap = new Map, unknown>() export const defineClientData = ( key: InjectionKey, data: T, - overrideExisting = true + overrideExisting = true, ): void => { if (overrideExisting || !clientDataMap.has(key)) clientDataMap.set(key, data) }