import type { Ref } from 'vue' import { encrypt as rawEncrypt } from '@internal/encrypt' import { decodeData } from '@vuepress/helper/client' import { ref } from 'vue' export type EncryptConfig = readonly [ boolean, // global string, // separator string, // admin string[], // keys Record, // rules ] export interface EncryptDataRule { key: string match: string rules: string[] } export interface EncryptData { global: boolean separator: string admins: string[] matches: string[] ruleList: EncryptDataRule[] } export type EncryptRef = Ref export const encrypt: EncryptRef = ref(resolveEncryptData(rawEncrypt)) export function useEncryptData(): EncryptRef { return encrypt as EncryptRef } function resolveEncryptData( [global, separator, admin, matches, rules]: EncryptConfig, ): EncryptData { const keys = matches.map(match => decodeData(match)) return { global, separator, matches: keys, admins: admin.split(separator), ruleList: Object.keys(rules).map(key => ({ key, match: keys[key] as string, rules: rules[key].split(separator), })), } } if (__VUEPRESS_DEV__ && (import.meta.webpackHot || import.meta.hot)) { __VUE_HMR_RUNTIME__.updateEncrypt = (data: EncryptConfig) => { encrypt.value = resolveEncryptData(data) } }