123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- import type { Pinia } from 'pinia';
- import type { App } from 'vue';
- import { createPinia } from 'pinia';
- import SecureLS from 'secure-ls';
- let pinia: Pinia;
- export interface InitStoreOptions {
- /**
- * @zh_CN 应用名,由于 @vben/stores 是公用的,后续可能有多个app,为了防止多个app缓存冲突,可在这里配置应用名,应用名将被用于持久化的前缀
- */
- namespace: string;
- }
- /**
- * @zh_CN 初始化pinia
- */
- export async function initStores(app: App, options: InitStoreOptions) {
- const { createPersistedState } = await import('pinia-plugin-persistedstate');
- pinia = createPinia();
- const { namespace } = options;
- const ls = new SecureLS({
- encodingType: 'aes',
- encryptionSecret: import.meta.env.VITE_APP_STORE_SECURE_KEY,
- isCompression: true,
- // @ts-ignore secure-ls does not have a type definition for this
- metaKey: `${namespace}-secure-meta`,
- });
- pinia.use(
- createPersistedState({
- // key $appName-$store.id
- key: (storeKey) => `${namespace}-${storeKey}`,
- storage: import.meta.env.DEV
- ? localStorage
- : {
- getItem(key) {
- return ls.get(key);
- },
- setItem(key, value) {
- ls.set(key, value);
- },
- },
- }),
- );
- app.use(pinia);
- return pinia;
- }
- export function resetAllStores() {
- if (!pinia) {
- console.error('Pinia is not installed');
- return;
- }
- const allStores = (pinia as any)._s;
- for (const [_key, store] of allStores) {
- store.$reset();
- }
- }
|