Blame view

Yi.Vben5.Vue3/packages/stores/src/setup.ts 1.52 KB
515fceeb   “wangming”   框架初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  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();
    }
  }