v-dict 2.0.7 → 2.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -207,33 +207,6 @@ function createDictManager(createDictManagerOptions = {}) {
207
207
  function getMapSnapshot() {
208
208
  return maps[code];
209
209
  }
210
- const createStateFromMap = (map = /* @__PURE__ */ new Map()) => {
211
- const newObj = /* @__PURE__ */ Object.create(null);
212
- const newList = [];
213
- mapToObj(map, {
214
- obj: newObj,
215
- itemTransformer
216
- });
217
- mapToList(map, {
218
- list: newList,
219
- itemTransformer
220
- });
221
- const newE = Object.fromEntries(
222
- Array.from(map.keys()).map((key) => {
223
- var _a;
224
- return [key, (_a = transformer == null ? void 0 : transformer(key)) != null ? _a : key];
225
- })
226
- );
227
- const getItem = (value) => {
228
- return value !== null && value !== void 0 ? newObj[value] : null;
229
- };
230
- return {
231
- map: newObj,
232
- list: newList,
233
- E: newE,
234
- getItem
235
- };
236
- };
237
210
  function useDict(useDictOptions = {}) {
238
211
  const mergedOptions = {
239
212
  clone: false,
@@ -242,77 +215,94 @@ function createDictManager(createDictManagerOptions = {}) {
242
215
  ...useDictOptions
243
216
  };
244
217
  const { clone, immediate, refresh } = mergedOptions;
245
- const stateRef = react.useRef(createStateFromMap());
246
- const clonedLoadPromiseRef = react.useRef(null);
247
218
  const globalMap = react.useSyncExternalStore(subscribeMap, getMapSnapshot);
248
219
  const [clonedMap, setClonedMap] = react.useState(/* @__PURE__ */ new Map());
249
- const loadPromise = !clone ? globalLoadPromise : clonedLoadPromiseRef.current;
250
- const map = !clone ? globalMap : clonedMap;
251
- const state = react.useMemo(() => createStateFromMap(map), [map]);
252
- const load = react.useCallback((options) => {
253
- const oldLoadPromise = loadPromise;
254
- if (!clone) {
255
- globalLoadPromise = createPromise();
256
- } else {
257
- clonedLoadPromiseRef.current = createPromise();
258
- }
259
- loadDict({ ...mergedOptions, ...options }).then((map2) => {
260
- var _a;
220
+ const createStateFromMap = (map = /* @__PURE__ */ new Map()) => {
221
+ const newObj = /* @__PURE__ */ Object.create(null);
222
+ const newList = [];
223
+ mapToObj(map, {
224
+ obj: newObj,
225
+ itemTransformer
226
+ });
227
+ mapToList(map, {
228
+ list: newList,
229
+ itemTransformer
230
+ });
231
+ const newE = Object.fromEntries(
232
+ Array.from(map.keys()).map((key) => {
233
+ var _a;
234
+ return [key, (_a = transformer == null ? void 0 : transformer(key)) != null ? _a : key];
235
+ })
236
+ );
237
+ const getItem = (value) => {
238
+ return value !== null && value !== void 0 ? newObj[value] : null;
239
+ };
240
+ return {
241
+ map: newObj,
242
+ list: newList,
243
+ E: newE,
244
+ getItem
245
+ };
246
+ };
247
+ const stateRef = react.useRef({
248
+ ...createStateFromMap(clonedMap),
249
+ clear: () => {
261
250
  if (!clone) {
262
- maps[code] = map2;
251
+ maps[code] = /* @__PURE__ */ new Map();
263
252
  emitChange(code);
264
- } else {
265
- setClonedMap(map2);
253
+ return;
266
254
  }
267
- stateRef.current = createStateFromMap(map2);
268
- oldLoadPromise == null ? void 0 : oldLoadPromise.resolve(void 0);
255
+ setClonedMap(/* @__PURE__ */ new Map());
256
+ },
257
+ loadPromise: !clone ? globalLoadPromise : createPromise(),
258
+ async load(options) {
259
+ const oldLoadPromise = stateRef.current.loadPromise;
260
+ stateRef.current.loadPromise = createPromise();
269
261
  if (!clone) {
270
- globalLoadPromise.resolve(void 0);
271
- } else {
272
- (_a = clonedLoadPromiseRef.current) == null ? void 0 : _a.resolve(void 0);
262
+ globalLoadPromise = stateRef.current.loadPromise;
273
263
  }
274
- });
275
- return !clone ? globalLoadPromise : clonedLoadPromiseRef.current;
276
- }, []);
277
- const clear2 = () => {
278
- if (!clone) {
279
- maps[code] = /* @__PURE__ */ new Map();
280
- emitChange(code);
281
- return;
264
+ loadDict({ ...mergedOptions, ...options }).then((map) => {
265
+ Object.assign(stateRef.current, createStateFromMap(map));
266
+ if (!clone) {
267
+ maps[code] = map;
268
+ emitChange(code);
269
+ } else {
270
+ setClonedMap(map);
271
+ }
272
+ oldLoadPromise == null ? void 0 : oldLoadPromise.resolve(void 0);
273
+ stateRef.current.loadPromise.resolve(void 0);
274
+ });
275
+ return stateRef.current.loadPromise;
282
276
  }
283
- setClonedMap(/* @__PURE__ */ new Map());
284
- };
277
+ });
278
+ if (!clone) {
279
+ Object.assign(stateRef.current, createStateFromMap(globalMap));
280
+ }
285
281
  react.useEffect(() => {
286
282
  if (remote && !immediate) {
287
283
  return;
288
284
  }
289
285
  if (clone) {
290
- load();
286
+ stateRef.current.load();
291
287
  } else {
292
288
  if (!init) {
293
289
  init = true;
294
- load();
290
+ stateRef.current.load();
295
291
  } else if (refresh) {
296
- load();
292
+ stateRef.current.load();
297
293
  }
298
294
  }
299
295
  }, []);
300
296
  const ctx = react.useMemo(() => {
301
- const value = {
302
- ...state,
303
- loadPromise,
304
- load,
305
- clear: clear2
306
- };
307
297
  return {
308
- ...value,
298
+ ...stateRef.current,
309
299
  // @ts-ignore
310
- ...managerExtra == null ? void 0 : managerExtra(value),
300
+ ...managerExtra == null ? void 0 : managerExtra(stateRef.current),
311
301
  // @ts-ignore
312
- ...extra == null ? void 0 : extra(value),
313
- stateRef
302
+ ...extra == null ? void 0 : extra(stateRef.current),
303
+ ref: stateRef
314
304
  };
315
- }, [state, loadPromise]);
305
+ }, [!clone ? globalMap : clonedMap]);
316
306
  return ctx;
317
307
  }
318
308
  useDict.extend = (extendCode2, extendOptions) => {
@@ -1,6 +1,6 @@
1
1
  import { warn, isFunction, cloneDeep, createPromise, toMap, merge, mapToObj, mapToList } from '../chunk-E7KZBQBQ.js';
2
2
  export { defineDictData } from '../chunk-E7KZBQBQ.js';
3
- import { useRef, useSyncExternalStore, useState, useMemo, useCallback, useEffect } from 'react';
3
+ import { useSyncExternalStore, useState, useRef, useEffect, useMemo } from 'react';
4
4
 
5
5
  function createDictManager(createDictManagerOptions = {}) {
6
6
  const {
@@ -78,33 +78,6 @@ function createDictManager(createDictManagerOptions = {}) {
78
78
  function getMapSnapshot() {
79
79
  return maps[code];
80
80
  }
81
- const createStateFromMap = (map = /* @__PURE__ */ new Map()) => {
82
- const newObj = /* @__PURE__ */ Object.create(null);
83
- const newList = [];
84
- mapToObj(map, {
85
- obj: newObj,
86
- itemTransformer
87
- });
88
- mapToList(map, {
89
- list: newList,
90
- itemTransformer
91
- });
92
- const newE = Object.fromEntries(
93
- Array.from(map.keys()).map((key) => {
94
- var _a;
95
- return [key, (_a = transformer == null ? void 0 : transformer(key)) != null ? _a : key];
96
- })
97
- );
98
- const getItem = (value) => {
99
- return value !== null && value !== void 0 ? newObj[value] : null;
100
- };
101
- return {
102
- map: newObj,
103
- list: newList,
104
- E: newE,
105
- getItem
106
- };
107
- };
108
81
  function useDict(useDictOptions = {}) {
109
82
  const mergedOptions = {
110
83
  clone: false,
@@ -113,77 +86,94 @@ function createDictManager(createDictManagerOptions = {}) {
113
86
  ...useDictOptions
114
87
  };
115
88
  const { clone, immediate, refresh } = mergedOptions;
116
- const stateRef = useRef(createStateFromMap());
117
- const clonedLoadPromiseRef = useRef(null);
118
89
  const globalMap = useSyncExternalStore(subscribeMap, getMapSnapshot);
119
90
  const [clonedMap, setClonedMap] = useState(/* @__PURE__ */ new Map());
120
- const loadPromise = !clone ? globalLoadPromise : clonedLoadPromiseRef.current;
121
- const map = !clone ? globalMap : clonedMap;
122
- const state = useMemo(() => createStateFromMap(map), [map]);
123
- const load = useCallback((options) => {
124
- const oldLoadPromise = loadPromise;
125
- if (!clone) {
126
- globalLoadPromise = createPromise();
127
- } else {
128
- clonedLoadPromiseRef.current = createPromise();
129
- }
130
- loadDict({ ...mergedOptions, ...options }).then((map2) => {
131
- var _a;
91
+ const createStateFromMap = (map = /* @__PURE__ */ new Map()) => {
92
+ const newObj = /* @__PURE__ */ Object.create(null);
93
+ const newList = [];
94
+ mapToObj(map, {
95
+ obj: newObj,
96
+ itemTransformer
97
+ });
98
+ mapToList(map, {
99
+ list: newList,
100
+ itemTransformer
101
+ });
102
+ const newE = Object.fromEntries(
103
+ Array.from(map.keys()).map((key) => {
104
+ var _a;
105
+ return [key, (_a = transformer == null ? void 0 : transformer(key)) != null ? _a : key];
106
+ })
107
+ );
108
+ const getItem = (value) => {
109
+ return value !== null && value !== void 0 ? newObj[value] : null;
110
+ };
111
+ return {
112
+ map: newObj,
113
+ list: newList,
114
+ E: newE,
115
+ getItem
116
+ };
117
+ };
118
+ const stateRef = useRef({
119
+ ...createStateFromMap(clonedMap),
120
+ clear: () => {
132
121
  if (!clone) {
133
- maps[code] = map2;
122
+ maps[code] = /* @__PURE__ */ new Map();
134
123
  emitChange(code);
135
- } else {
136
- setClonedMap(map2);
124
+ return;
137
125
  }
138
- stateRef.current = createStateFromMap(map2);
139
- oldLoadPromise == null ? void 0 : oldLoadPromise.resolve(void 0);
126
+ setClonedMap(/* @__PURE__ */ new Map());
127
+ },
128
+ loadPromise: !clone ? globalLoadPromise : createPromise(),
129
+ async load(options) {
130
+ const oldLoadPromise = stateRef.current.loadPromise;
131
+ stateRef.current.loadPromise = createPromise();
140
132
  if (!clone) {
141
- globalLoadPromise.resolve(void 0);
142
- } else {
143
- (_a = clonedLoadPromiseRef.current) == null ? void 0 : _a.resolve(void 0);
133
+ globalLoadPromise = stateRef.current.loadPromise;
144
134
  }
145
- });
146
- return !clone ? globalLoadPromise : clonedLoadPromiseRef.current;
147
- }, []);
148
- const clear2 = () => {
149
- if (!clone) {
150
- maps[code] = /* @__PURE__ */ new Map();
151
- emitChange(code);
152
- return;
135
+ loadDict({ ...mergedOptions, ...options }).then((map) => {
136
+ Object.assign(stateRef.current, createStateFromMap(map));
137
+ if (!clone) {
138
+ maps[code] = map;
139
+ emitChange(code);
140
+ } else {
141
+ setClonedMap(map);
142
+ }
143
+ oldLoadPromise == null ? void 0 : oldLoadPromise.resolve(void 0);
144
+ stateRef.current.loadPromise.resolve(void 0);
145
+ });
146
+ return stateRef.current.loadPromise;
153
147
  }
154
- setClonedMap(/* @__PURE__ */ new Map());
155
- };
148
+ });
149
+ if (!clone) {
150
+ Object.assign(stateRef.current, createStateFromMap(globalMap));
151
+ }
156
152
  useEffect(() => {
157
153
  if (remote && !immediate) {
158
154
  return;
159
155
  }
160
156
  if (clone) {
161
- load();
157
+ stateRef.current.load();
162
158
  } else {
163
159
  if (!init) {
164
160
  init = true;
165
- load();
161
+ stateRef.current.load();
166
162
  } else if (refresh) {
167
- load();
163
+ stateRef.current.load();
168
164
  }
169
165
  }
170
166
  }, []);
171
167
  const ctx = useMemo(() => {
172
- const value = {
173
- ...state,
174
- loadPromise,
175
- load,
176
- clear: clear2
177
- };
178
168
  return {
179
- ...value,
169
+ ...stateRef.current,
180
170
  // @ts-ignore
181
- ...managerExtra == null ? void 0 : managerExtra(value),
171
+ ...managerExtra == null ? void 0 : managerExtra(stateRef.current),
182
172
  // @ts-ignore
183
- ...extra == null ? void 0 : extra(value),
184
- stateRef
173
+ ...extra == null ? void 0 : extra(stateRef.current),
174
+ ref: stateRef
185
175
  };
186
- }, [state, loadPromise]);
176
+ }, [!clone ? globalMap : clonedMap]);
187
177
  return ctx;
188
178
  }
189
179
  useDict.extend = (extendCode2, extendOptions) => {
@@ -21,17 +21,8 @@ export type Dict<K extends PropertyKey = PropertyKey, I extends Recordable = Dic
21
21
  load: (options?: O) => LoadPromise;
22
22
  clear: () => void;
23
23
  getItem: (value?: I['value'] | Nil) => I | Nil;
24
- stateRef?: {
25
- current: {
26
- list: I[];
27
- E: {
28
- [X in K]: X;
29
- };
30
- map: {
31
- [X in K]: I;
32
- };
33
- getItem: (value?: I['value'] | Nil) => I | Nil;
34
- };
24
+ ref?: {
25
+ current: Omit<Dict<K, I, O>, 'ref'>;
35
26
  };
36
27
  };
37
28
  export type Fetch = (code: string, options: Recordable) => MaybePromise<DictItemRecord[]>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "v-dict",
3
- "version": "2.0.7",
3
+ "version": "2.0.9",
4
4
  "type": "module",
5
5
  "description": "Vue3 & React Dict Manager",
6
6
  "repository": {