v-dict 1.2.11 → 2.0.0

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.
@@ -1,4 +1,5 @@
1
1
  // src/util.ts
2
+ var warn = (msg) => console.warn(`[v-dict]: ${msg}`);
2
3
  function isFunction(fn) {
3
4
  return typeof fn === "function";
4
5
  }
@@ -7,7 +8,10 @@ function clearObj(obj) {
7
8
  delete obj[key];
8
9
  }
9
10
  }
10
- function mapToObj(map, obj = {}, itemTransformer) {
11
+ function mapToObj(map, {
12
+ obj = {},
13
+ itemTransformer
14
+ } = {}) {
11
15
  var _a;
12
16
  clearObj(obj);
13
17
  for (const [key, value] of map) {
@@ -23,21 +27,17 @@ function checkObjItem(item, key, transformer) {
23
27
  item.value = transformer(item.value);
24
28
  }
25
29
  }
26
- function mapToList(map, list = [], itemTransformer) {
27
- const values = itemTransformer ? map.values().map(itemTransformer) : map.values();
30
+ function mapToList(map, {
31
+ list = [],
32
+ itemTransformer
33
+ } = {}) {
34
+ const values = isFunction(itemTransformer) ? map.values().map(itemTransformer) : map.values();
28
35
  list.splice(0, list.length, ...values);
29
36
  return list;
30
37
  }
31
- function listToMap(list) {
32
- return new Map(list.map((item) => [item.value, item]));
33
- }
34
- function toMap(data, options = {}) {
35
- const { pickValues = [], omitValues = [], transformer } = options;
38
+ function toMap(data, { map = /* @__PURE__ */ new Map(), pickValues = [], omitValues = [], transformer } = {}) {
36
39
  const filterFn = (value) => (pickValues.length === 0 || pickValues.includes(value)) && !omitValues.includes(value);
37
- if (Array.isArray(data)) {
38
- return listToMap(data.filter((item) => filterFn(item.value)));
39
- }
40
- const map = /* @__PURE__ */ new Map();
40
+ map.clear();
41
41
  Object.entries(data).filter(([key, item]) => {
42
42
  checkObjItem(item, key, transformer);
43
43
  return filterFn(item.value);
@@ -125,4 +125,4 @@ function createPromise(executor) {
125
125
  return promise;
126
126
  }
127
127
 
128
- export { clearObj, cloneDeep, createPromise, defineDictData, isFunction, mapToList, mapToObj, merge, toMap };
128
+ export { cloneDeep, createPromise, defineDictData, isFunction, mapToList, mapToObj, merge, toMap, warn };
package/dist/index.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  var vue = require('vue');
4
4
 
5
- // src/dict-manager.ts
5
+ // src/vue/vue-dict-manager.ts
6
6
 
7
7
  // src/create-promise.ts
8
8
  var noop = () => {
@@ -25,6 +25,7 @@ function createPromise(executor) {
25
25
  }
26
26
 
27
27
  // src/util.ts
28
+ var warn = (msg) => console.warn(`[v-dict]: ${msg}`);
28
29
  function isFunction(fn) {
29
30
  return typeof fn === "function";
30
31
  }
@@ -33,7 +34,10 @@ function clearObj(obj) {
33
34
  delete obj[key];
34
35
  }
35
36
  }
36
- function mapToObj(map, obj = {}, itemTransformer) {
37
+ function mapToObj(map, {
38
+ obj = {},
39
+ itemTransformer
40
+ } = {}) {
37
41
  var _a;
38
42
  clearObj(obj);
39
43
  for (const [key, value] of map) {
@@ -49,21 +53,17 @@ function checkObjItem(item, key, transformer) {
49
53
  item.value = transformer(item.value);
50
54
  }
51
55
  }
52
- function mapToList(map, list = [], itemTransformer) {
53
- const values = itemTransformer ? map.values().map(itemTransformer) : map.values();
56
+ function mapToList(map, {
57
+ list = [],
58
+ itemTransformer
59
+ } = {}) {
60
+ const values = isFunction(itemTransformer) ? map.values().map(itemTransformer) : map.values();
54
61
  list.splice(0, list.length, ...values);
55
62
  return list;
56
63
  }
57
- function listToMap(list) {
58
- return new Map(list.map((item) => [item.value, item]));
59
- }
60
- function toMap(data, options = {}) {
61
- const { pickValues = [], omitValues = [], transformer } = options;
64
+ function toMap(data, { map = /* @__PURE__ */ new Map(), pickValues = [], omitValues = [], transformer } = {}) {
62
65
  const filterFn = (value) => (pickValues.length === 0 || pickValues.includes(value)) && !omitValues.includes(value);
63
- if (Array.isArray(data)) {
64
- return listToMap(data.filter((item) => filterFn(item.value)));
65
- }
66
- const map = /* @__PURE__ */ new Map();
66
+ map.clear();
67
67
  Object.entries(data).filter(([key, item]) => {
68
68
  checkObjItem(item, key, transformer);
69
69
  return filterFn(item.value);
@@ -131,8 +131,7 @@ function cloneDeep(value) {
131
131
  return value;
132
132
  }
133
133
 
134
- // src/dict-manager.ts
135
- var warn = (msg) => console.warn(`[v-dict]: ${msg}`);
134
+ // src/vue/vue-dict-manager.ts
136
135
  function createDictManager(createDictManagerOptions = {}) {
137
136
  const {
138
137
  fetch: managerFetch,
@@ -148,12 +147,14 @@ function createDictManager(createDictManagerOptions = {}) {
148
147
  (_a = maps[code]) == null ? void 0 : _a.clear();
149
148
  return;
150
149
  }
151
- clearObj(maps);
150
+ Object.values(maps).forEach((map) => map.clear());
152
151
  }
153
152
  function _defineDict(defineDictInternalOptions, code, defineDictOptions) {
154
153
  const { pickValues, omitValues, extendCode } = defineDictInternalOptions;
155
154
  if (maps[code]) {
156
155
  warn(`code "${code}" already exists`);
156
+ } else {
157
+ maps[code] = /* @__PURE__ */ new Map();
157
158
  }
158
159
  const _defineDictOptions = Object.assign(
159
160
  {
@@ -167,9 +168,8 @@ function createDictManager(createDictManagerOptions = {}) {
167
168
  );
168
169
  defineDictOptionsMap.set(code, cloneDeep(_defineDictOptions));
169
170
  const { data, remote, fetch, extra, transformer, itemTransformer } = _defineDictOptions;
170
- const globalLoadPromise = vue.shallowRef(null);
171
- let loaded = false;
172
- maps[code] = /* @__PURE__ */ new Map();
171
+ let globalLoadPromise = null;
172
+ let init = false;
173
173
  async function loadDict(options, mapRef) {
174
174
  var _a;
175
175
  const dataMap = toMap(cloneDeep(data), { pickValues, omitValues, transformer });
@@ -191,21 +191,23 @@ function createDictManager(createDictManagerOptions = {}) {
191
191
  useDictOptions
192
192
  );
193
193
  const { clone, immediate, refresh } = useDictOptions;
194
- const loadPromise = !clone ? globalLoadPromise : vue.shallowRef(createPromise());
195
- const mapRef = !clone ? vue.toRef(maps, code) : vue.ref();
194
+ const loadPromise = vue.shallowRef(
195
+ !clone ? globalLoadPromise : createPromise()
196
+ );
197
+ const mapRef = !clone ? vue.toRef(maps, code) : vue.ref(/* @__PURE__ */ new Map());
196
198
  const objRef = vue.ref(/* @__PURE__ */ Object.create(null));
197
199
  const listRef = vue.ref([]);
198
200
  if (!remote || immediate) {
199
201
  if (clone) {
200
202
  load();
201
203
  } else {
202
- if (!globalLoadPromise.value) {
203
- globalLoadPromise.value = createPromise();
204
+ if (!globalLoadPromise) {
205
+ globalLoadPromise = createPromise();
204
206
  load();
205
207
  } else {
206
- globalLoadPromise.value.then(() => {
207
- if (!loaded) {
208
- loaded = true;
208
+ globalLoadPromise.then(() => {
209
+ if (!init) {
210
+ init = true;
209
211
  load();
210
212
  } else if (refresh) {
211
213
  load();
@@ -214,9 +216,9 @@ function createDictManager(createDictManagerOptions = {}) {
214
216
  }
215
217
  }
216
218
  } else {
217
- if (!globalLoadPromise.value) {
218
- globalLoadPromise.value = createPromise();
219
- globalLoadPromise.value.resolve();
219
+ if (!globalLoadPromise) {
220
+ globalLoadPromise = createPromise();
221
+ globalLoadPromise.resolve();
220
222
  }
221
223
  }
222
224
  function load(options) {
@@ -229,24 +231,30 @@ function createDictManager(createDictManagerOptions = {}) {
229
231
  return loadPromise.value;
230
232
  }
231
233
  function _clear() {
232
- var _a;
233
- (_a = mapRef.value) == null ? void 0 : _a.clear();
234
+ mapRef.value.clear();
234
235
  }
235
236
  vue.watch(
236
237
  mapRef,
237
238
  (newValue) => {
238
239
  newValue != null ? newValue : newValue = /* @__PURE__ */ new Map();
239
- mapToObj(newValue, objRef.value, itemTransformer);
240
- mapToList(newValue, listRef.value, itemTransformer);
240
+ mapToObj(newValue, {
241
+ obj: objRef.value,
242
+ itemTransformer
243
+ });
244
+ mapToList(newValue, {
245
+ list: listRef.value,
246
+ itemTransformer
247
+ });
241
248
  },
242
249
  { deep: true, immediate: true }
243
250
  );
244
251
  const E = vue.computed(() => {
252
+ var _a;
245
253
  const result = {};
246
254
  if (!mapRef.value)
247
255
  return result;
248
256
  for (const key of mapRef.value.keys()) {
249
- result[key] = key;
257
+ result[key] = (_a = transformer == null ? void 0 : transformer(key)) != null ? _a : key;
250
258
  }
251
259
  return result;
252
260
  });
@@ -266,7 +274,9 @@ function createDictManager(createDictManagerOptions = {}) {
266
274
  const reactiveCtx = vue.reactive(ctx);
267
275
  return vue.reactive({
268
276
  ...ctx,
277
+ // @ts-ignore
269
278
  ...managerExtra == null ? void 0 : managerExtra(reactiveCtx),
279
+ // @ts-ignore
270
280
  ...extra == null ? void 0 : extra(reactiveCtx)
271
281
  });
272
282
  }
package/dist/index.d.ts CHANGED
@@ -1,3 +1 @@
1
- export type * from './types';
2
- export * from './dict-manager';
3
- export { defineDictData } from './util';
1
+ export * from './vue';
package/dist/index.js CHANGED
@@ -1,8 +1,7 @@
1
- import { clearObj, isFunction, cloneDeep, createPromise, mapToObj, mapToList, toMap, merge } from './chunk-QAVWCRC2.js';
2
- export { defineDictData } from './chunk-QAVWCRC2.js';
1
+ import { warn, isFunction, cloneDeep, createPromise, mapToObj, mapToList, toMap, merge } from './chunk-SXX4ZFIR.js';
2
+ export { defineDictData } from './chunk-SXX4ZFIR.js';
3
3
  import { reactive, readonly, shallowRef, toRef, ref, watch, computed } from 'vue';
4
4
 
5
- var warn = (msg) => console.warn(`[v-dict]: ${msg}`);
6
5
  function createDictManager(createDictManagerOptions = {}) {
7
6
  const {
8
7
  fetch: managerFetch,
@@ -18,12 +17,14 @@ function createDictManager(createDictManagerOptions = {}) {
18
17
  (_a = maps[code]) == null ? void 0 : _a.clear();
19
18
  return;
20
19
  }
21
- clearObj(maps);
20
+ Object.values(maps).forEach((map) => map.clear());
22
21
  }
23
22
  function _defineDict(defineDictInternalOptions, code, defineDictOptions) {
24
23
  const { pickValues, omitValues, extendCode } = defineDictInternalOptions;
25
24
  if (maps[code]) {
26
25
  warn(`code "${code}" already exists`);
26
+ } else {
27
+ maps[code] = /* @__PURE__ */ new Map();
27
28
  }
28
29
  const _defineDictOptions = Object.assign(
29
30
  {
@@ -37,9 +38,8 @@ function createDictManager(createDictManagerOptions = {}) {
37
38
  );
38
39
  defineDictOptionsMap.set(code, cloneDeep(_defineDictOptions));
39
40
  const { data, remote, fetch, extra, transformer, itemTransformer } = _defineDictOptions;
40
- const globalLoadPromise = shallowRef(null);
41
- let loaded = false;
42
- maps[code] = /* @__PURE__ */ new Map();
41
+ let globalLoadPromise = null;
42
+ let init = false;
43
43
  async function loadDict(options, mapRef) {
44
44
  var _a;
45
45
  const dataMap = toMap(cloneDeep(data), { pickValues, omitValues, transformer });
@@ -61,21 +61,23 @@ function createDictManager(createDictManagerOptions = {}) {
61
61
  useDictOptions
62
62
  );
63
63
  const { clone, immediate, refresh } = useDictOptions;
64
- const loadPromise = !clone ? globalLoadPromise : shallowRef(createPromise());
65
- const mapRef = !clone ? toRef(maps, code) : ref();
64
+ const loadPromise = shallowRef(
65
+ !clone ? globalLoadPromise : createPromise()
66
+ );
67
+ const mapRef = !clone ? toRef(maps, code) : ref(/* @__PURE__ */ new Map());
66
68
  const objRef = ref(/* @__PURE__ */ Object.create(null));
67
69
  const listRef = ref([]);
68
70
  if (!remote || immediate) {
69
71
  if (clone) {
70
72
  load();
71
73
  } else {
72
- if (!globalLoadPromise.value) {
73
- globalLoadPromise.value = createPromise();
74
+ if (!globalLoadPromise) {
75
+ globalLoadPromise = createPromise();
74
76
  load();
75
77
  } else {
76
- globalLoadPromise.value.then(() => {
77
- if (!loaded) {
78
- loaded = true;
78
+ globalLoadPromise.then(() => {
79
+ if (!init) {
80
+ init = true;
79
81
  load();
80
82
  } else if (refresh) {
81
83
  load();
@@ -84,9 +86,9 @@ function createDictManager(createDictManagerOptions = {}) {
84
86
  }
85
87
  }
86
88
  } else {
87
- if (!globalLoadPromise.value) {
88
- globalLoadPromise.value = createPromise();
89
- globalLoadPromise.value.resolve();
89
+ if (!globalLoadPromise) {
90
+ globalLoadPromise = createPromise();
91
+ globalLoadPromise.resolve();
90
92
  }
91
93
  }
92
94
  function load(options) {
@@ -99,24 +101,30 @@ function createDictManager(createDictManagerOptions = {}) {
99
101
  return loadPromise.value;
100
102
  }
101
103
  function _clear() {
102
- var _a;
103
- (_a = mapRef.value) == null ? void 0 : _a.clear();
104
+ mapRef.value.clear();
104
105
  }
105
106
  watch(
106
107
  mapRef,
107
108
  (newValue) => {
108
109
  newValue != null ? newValue : newValue = /* @__PURE__ */ new Map();
109
- mapToObj(newValue, objRef.value, itemTransformer);
110
- mapToList(newValue, listRef.value, itemTransformer);
110
+ mapToObj(newValue, {
111
+ obj: objRef.value,
112
+ itemTransformer
113
+ });
114
+ mapToList(newValue, {
115
+ list: listRef.value,
116
+ itemTransformer
117
+ });
111
118
  },
112
119
  { deep: true, immediate: true }
113
120
  );
114
121
  const E = computed(() => {
122
+ var _a;
115
123
  const result = {};
116
124
  if (!mapRef.value)
117
125
  return result;
118
126
  for (const key of mapRef.value.keys()) {
119
- result[key] = key;
127
+ result[key] = (_a = transformer == null ? void 0 : transformer(key)) != null ? _a : key;
120
128
  }
121
129
  return result;
122
130
  });
@@ -136,7 +144,9 @@ function createDictManager(createDictManagerOptions = {}) {
136
144
  const reactiveCtx = reactive(ctx);
137
145
  return reactive({
138
146
  ...ctx,
147
+ // @ts-ignore
139
148
  ...managerExtra == null ? void 0 : managerExtra(reactiveCtx),
149
+ // @ts-ignore
140
150
  ...extra == null ? void 0 : extra(reactiveCtx)
141
151
  });
142
152
  }
@@ -25,6 +25,7 @@ function createPromise(executor) {
25
25
  }
26
26
 
27
27
  // src/util.ts
28
+ var warn = (msg) => console.warn(`[v-dict]: ${msg}`);
28
29
  function isFunction(fn) {
29
30
  return typeof fn === "function";
30
31
  }
@@ -33,7 +34,10 @@ function clearObj(obj) {
33
34
  delete obj[key];
34
35
  }
35
36
  }
36
- function mapToObj(map, obj = {}, itemTransformer) {
37
+ function mapToObj(map, {
38
+ obj = {},
39
+ itemTransformer
40
+ } = {}) {
37
41
  var _a;
38
42
  clearObj(obj);
39
43
  for (const [key, value] of map) {
@@ -49,21 +53,17 @@ function checkObjItem(item, key, transformer) {
49
53
  item.value = transformer(item.value);
50
54
  }
51
55
  }
52
- function mapToList(map, list = [], itemTransformer) {
53
- const values = itemTransformer ? map.values().map(itemTransformer) : map.values();
56
+ function mapToList(map, {
57
+ list = [],
58
+ itemTransformer
59
+ } = {}) {
60
+ const values = isFunction(itemTransformer) ? map.values().map(itemTransformer) : map.values();
54
61
  list.splice(0, list.length, ...values);
55
62
  return list;
56
63
  }
57
- function listToMap(list) {
58
- return new Map(list.map((item) => [item.value, item]));
59
- }
60
- function toMap(data, options = {}) {
61
- const { pickValues = [], omitValues = [], transformer } = options;
64
+ function toMap(data, { map = /* @__PURE__ */ new Map(), pickValues = [], omitValues = [], transformer } = {}) {
62
65
  const filterFn = (value) => (pickValues.length === 0 || pickValues.includes(value)) && !omitValues.includes(value);
63
- if (Array.isArray(data)) {
64
- return listToMap(data.filter((item) => filterFn(item.value)));
65
- }
66
- const map = /* @__PURE__ */ new Map();
66
+ map.clear();
67
67
  Object.entries(data).filter(([key, item]) => {
68
68
  checkObjItem(item, key, transformer);
69
69
  return filterFn(item.value);
@@ -132,7 +132,6 @@ function cloneDeep(value) {
132
132
  }
133
133
 
134
134
  // src/react/react-dict-manager.ts
135
- var warn = (msg) => console.warn(`[v-dict/react]: ${msg}`);
136
135
  function createDictManager(createDictManagerOptions = {}) {
137
136
  const {
138
137
  fetch: managerFetch,
@@ -140,20 +139,24 @@ function createDictManager(createDictManagerOptions = {}) {
140
139
  transformer: managerTransformer,
141
140
  itemTransformer: managerItemTransformer
142
141
  } = createDictManagerOptions;
143
- const maps = /* @__PURE__ */ Object.create(null);
144
142
  const defineDictOptionsMap = /* @__PURE__ */ new Map();
143
+ const maps = /* @__PURE__ */ Object.create(null);
144
+ const versionMap = /* @__PURE__ */ Object.create(null);
145
145
  function clear(code) {
146
146
  var _a;
147
147
  if (code) {
148
148
  (_a = maps[code]) == null ? void 0 : _a.clear();
149
149
  return;
150
150
  }
151
- clearObj(maps);
151
+ Object.values(maps).forEach((map) => map.clear());
152
152
  }
153
153
  function _defineDict(defineDictInternalOptions, code, defineDictOptions) {
154
154
  const { pickValues, omitValues, extendCode } = defineDictInternalOptions;
155
155
  if (maps[code]) {
156
156
  warn(`code "${code}" already exists`);
157
+ } else {
158
+ maps[code] = /* @__PURE__ */ new Map();
159
+ versionMap[code] = 0;
157
160
  }
158
161
  const _defineDictOptions = Object.assign(
159
162
  {
@@ -168,82 +171,81 @@ function createDictManager(createDictManagerOptions = {}) {
168
171
  defineDictOptionsMap.set(code, cloneDeep(_defineDictOptions));
169
172
  const { data, remote, fetch, extra, transformer, itemTransformer } = _defineDictOptions;
170
173
  let globalLoadPromise = null;
171
- let loaded = false;
172
- maps[code] = /* @__PURE__ */ new Map();
174
+ let init = false;
173
175
  async function loadDict(options, mapRef) {
174
176
  var _a;
175
- const dataMap = toMap(cloneDeep(data), { pickValues, omitValues, transformer });
176
177
  if (remote) {
177
178
  const res = (_a = await (fetch == null ? void 0 : fetch(extendCode != null ? extendCode : code, options))) != null ? _a : [];
178
- mapRef.current = toMap(res, { pickValues, omitValues, transformer });
179
- dataMap.forEach((value, key) => {
180
- if (mapRef.current.has(key)) {
181
- merge(mapRef.current.get(key), value);
179
+ toMap(res, { pickValues, omitValues, transformer, map: mapRef.current });
180
+ toMap(cloneDeep(data), { pickValues, omitValues, transformer }).forEach(
181
+ (value, key) => {
182
+ if (mapRef.current.has(key)) {
183
+ merge(mapRef.current.get(key), value);
184
+ }
182
185
  }
183
- });
186
+ );
184
187
  } else {
185
- mapRef.current = dataMap;
188
+ toMap(cloneDeep(data), { pickValues, omitValues, transformer, map: mapRef.current });
186
189
  }
190
+ versionMap[code] += 1;
187
191
  }
188
192
  function useDict(useDictOptions = {}) {
189
- const mergedOptions = Object.assign(
190
- { clone: false, immediate: true, refresh: false },
191
- useDictOptions
192
- );
193
+ const mergedOptions = {
194
+ clone: false,
195
+ immediate: true,
196
+ refresh: false,
197
+ ...useDictOptions
198
+ };
193
199
  const { clone, immediate, refresh } = mergedOptions;
194
200
  const loadPromiseRef = react.useRef(
195
- !clone ? globalLoadPromise != null ? globalLoadPromise : createPromise() : createPromise()
201
+ !clone ? globalLoadPromise : createPromise()
196
202
  );
197
203
  const mapRef = react.useRef(!clone ? maps[code] : /* @__PURE__ */ new Map());
198
- const objRef = react.useRef(/* @__PURE__ */ Object.create(null));
199
- const listRef = react.useRef([]);
200
- const synMapRef = () => {
204
+ const versionRef = react.useRef(0);
205
+ const getStateFromMapRef = () => {
201
206
  const newObj = /* @__PURE__ */ Object.create(null);
202
207
  const newList = [];
203
- mapToObj(mapRef.current, newObj, itemTransformer);
204
- mapToList(mapRef.current, newList, itemTransformer);
205
- objRef.current = newObj;
206
- listRef.current = newList;
207
- };
208
- const extractE = () => {
209
- return Object.fromEntries(
210
- Array.from(mapRef.current.keys()).map((key) => [String(key), String(key)])
208
+ mapToObj(mapRef.current, {
209
+ obj: newObj,
210
+ itemTransformer
211
+ });
212
+ mapToList(mapRef.current, {
213
+ list: newList,
214
+ itemTransformer
215
+ });
216
+ const newE = Object.fromEntries(
217
+ Array.from(mapRef.current.keys()).map((key) => {
218
+ var _a;
219
+ return [key, (_a = transformer == null ? void 0 : transformer(key)) != null ? _a : key];
220
+ })
211
221
  );
222
+ return {
223
+ map: newObj,
224
+ list: newList,
225
+ E: newE
226
+ };
212
227
  };
213
- synMapRef();
214
- const [state, setState] = react.useState({
215
- map: objRef.current,
216
- list: listRef.current,
217
- E: extractE()
218
- });
228
+ const [state, setState] = react.useState(getStateFromMapRef());
229
+ if (versionRef.current !== versionMap[code]) {
230
+ versionRef.current = versionMap[code];
231
+ setState(getStateFromMapRef());
232
+ }
219
233
  const load = react.useCallback((options) => {
220
234
  const oldLoadPromise = loadPromiseRef.current;
221
- const newLoadPromise = createPromise();
222
- loadPromiseRef.current = newLoadPromise;
223
- loadDict(Object.assign({}, mergedOptions, options), mapRef).then(() => {
224
- synMapRef();
225
- setState({
226
- map: objRef.current,
227
- list: listRef.current,
228
- E: extractE()
229
- });
235
+ loadPromiseRef.current = createPromise();
236
+ loadDict({ ...mergedOptions, ...options }, mapRef).then(() => {
237
+ setState(getStateFromMapRef());
230
238
  oldLoadPromise == null ? void 0 : oldLoadPromise.resolve(void 0);
231
- newLoadPromise.resolve(void 0);
239
+ loadPromiseRef.current.resolve(void 0);
232
240
  });
233
- return newLoadPromise;
241
+ return loadPromiseRef.current;
234
242
  }, []);
235
243
  const clear2 = react.useCallback(() => {
236
- var _a;
237
- (_a = mapRef.current) == null ? void 0 : _a.clear();
238
- setState({
239
- map: /* @__PURE__ */ Object.create(null),
240
- list: [],
241
- E: {}
242
- });
244
+ mapRef.current.clear();
245
+ setState(getStateFromMapRef());
243
246
  }, []);
244
247
  const getItem = react.useCallback((value) => {
245
- var _a;
246
- return value !== null && value !== void 0 ? (_a = mapRef.current) == null ? void 0 : _a.get(value) : null;
248
+ return value !== null && value !== void 0 ? mapRef.current.get(value) : null;
247
249
  }, []);
248
250
  react.useEffect(() => {
249
251
  if (!remote || immediate) {
@@ -255,8 +257,8 @@ function createDictManager(createDictManagerOptions = {}) {
255
257
  load();
256
258
  } else {
257
259
  globalLoadPromise.then(() => {
258
- if (!loaded) {
259
- loaded = true;
260
+ if (!init) {
261
+ init = true;
260
262
  load();
261
263
  } else if (refresh) {
262
264
  load();
@@ -283,7 +285,9 @@ function createDictManager(createDictManagerOptions = {}) {
283
285
  };
284
286
  return {
285
287
  ..._ctx,
288
+ // @ts-ignore
286
289
  ...managerExtra == null ? void 0 : managerExtra(_ctx),
290
+ // @ts-ignore
287
291
  ...extra == null ? void 0 : extra(_ctx)
288
292
  };
289
293
  }, [state]);
@@ -1,8 +1,7 @@
1
- import { clearObj, isFunction, cloneDeep, createPromise, toMap, merge, mapToObj, mapToList } from '../chunk-QAVWCRC2.js';
2
- export { defineDictData } from '../chunk-QAVWCRC2.js';
1
+ import { warn, isFunction, cloneDeep, createPromise, toMap, merge, mapToObj, mapToList } from '../chunk-SXX4ZFIR.js';
2
+ export { defineDictData } from '../chunk-SXX4ZFIR.js';
3
3
  import { useRef, useState, useCallback, useEffect, useMemo } from 'react';
4
4
 
5
- var warn = (msg) => console.warn(`[v-dict/react]: ${msg}`);
6
5
  function createDictManager(createDictManagerOptions = {}) {
7
6
  const {
8
7
  fetch: managerFetch,
@@ -10,20 +9,24 @@ function createDictManager(createDictManagerOptions = {}) {
10
9
  transformer: managerTransformer,
11
10
  itemTransformer: managerItemTransformer
12
11
  } = createDictManagerOptions;
13
- const maps = /* @__PURE__ */ Object.create(null);
14
12
  const defineDictOptionsMap = /* @__PURE__ */ new Map();
13
+ const maps = /* @__PURE__ */ Object.create(null);
14
+ const versionMap = /* @__PURE__ */ Object.create(null);
15
15
  function clear(code) {
16
16
  var _a;
17
17
  if (code) {
18
18
  (_a = maps[code]) == null ? void 0 : _a.clear();
19
19
  return;
20
20
  }
21
- clearObj(maps);
21
+ Object.values(maps).forEach((map) => map.clear());
22
22
  }
23
23
  function _defineDict(defineDictInternalOptions, code, defineDictOptions) {
24
24
  const { pickValues, omitValues, extendCode } = defineDictInternalOptions;
25
25
  if (maps[code]) {
26
26
  warn(`code "${code}" already exists`);
27
+ } else {
28
+ maps[code] = /* @__PURE__ */ new Map();
29
+ versionMap[code] = 0;
27
30
  }
28
31
  const _defineDictOptions = Object.assign(
29
32
  {
@@ -38,82 +41,81 @@ function createDictManager(createDictManagerOptions = {}) {
38
41
  defineDictOptionsMap.set(code, cloneDeep(_defineDictOptions));
39
42
  const { data, remote, fetch, extra, transformer, itemTransformer } = _defineDictOptions;
40
43
  let globalLoadPromise = null;
41
- let loaded = false;
42
- maps[code] = /* @__PURE__ */ new Map();
44
+ let init = false;
43
45
  async function loadDict(options, mapRef) {
44
46
  var _a;
45
- const dataMap = toMap(cloneDeep(data), { pickValues, omitValues, transformer });
46
47
  if (remote) {
47
48
  const res = (_a = await (fetch == null ? void 0 : fetch(extendCode != null ? extendCode : code, options))) != null ? _a : [];
48
- mapRef.current = toMap(res, { pickValues, omitValues, transformer });
49
- dataMap.forEach((value, key) => {
50
- if (mapRef.current.has(key)) {
51
- merge(mapRef.current.get(key), value);
49
+ toMap(res, { pickValues, omitValues, transformer, map: mapRef.current });
50
+ toMap(cloneDeep(data), { pickValues, omitValues, transformer }).forEach(
51
+ (value, key) => {
52
+ if (mapRef.current.has(key)) {
53
+ merge(mapRef.current.get(key), value);
54
+ }
52
55
  }
53
- });
56
+ );
54
57
  } else {
55
- mapRef.current = dataMap;
58
+ toMap(cloneDeep(data), { pickValues, omitValues, transformer, map: mapRef.current });
56
59
  }
60
+ versionMap[code] += 1;
57
61
  }
58
62
  function useDict(useDictOptions = {}) {
59
- const mergedOptions = Object.assign(
60
- { clone: false, immediate: true, refresh: false },
61
- useDictOptions
62
- );
63
+ const mergedOptions = {
64
+ clone: false,
65
+ immediate: true,
66
+ refresh: false,
67
+ ...useDictOptions
68
+ };
63
69
  const { clone, immediate, refresh } = mergedOptions;
64
70
  const loadPromiseRef = useRef(
65
- !clone ? globalLoadPromise != null ? globalLoadPromise : createPromise() : createPromise()
71
+ !clone ? globalLoadPromise : createPromise()
66
72
  );
67
73
  const mapRef = useRef(!clone ? maps[code] : /* @__PURE__ */ new Map());
68
- const objRef = useRef(/* @__PURE__ */ Object.create(null));
69
- const listRef = useRef([]);
70
- const synMapRef = () => {
74
+ const versionRef = useRef(0);
75
+ const getStateFromMapRef = () => {
71
76
  const newObj = /* @__PURE__ */ Object.create(null);
72
77
  const newList = [];
73
- mapToObj(mapRef.current, newObj, itemTransformer);
74
- mapToList(mapRef.current, newList, itemTransformer);
75
- objRef.current = newObj;
76
- listRef.current = newList;
77
- };
78
- const extractE = () => {
79
- return Object.fromEntries(
80
- Array.from(mapRef.current.keys()).map((key) => [String(key), String(key)])
78
+ mapToObj(mapRef.current, {
79
+ obj: newObj,
80
+ itemTransformer
81
+ });
82
+ mapToList(mapRef.current, {
83
+ list: newList,
84
+ itemTransformer
85
+ });
86
+ const newE = Object.fromEntries(
87
+ Array.from(mapRef.current.keys()).map((key) => {
88
+ var _a;
89
+ return [key, (_a = transformer == null ? void 0 : transformer(key)) != null ? _a : key];
90
+ })
81
91
  );
92
+ return {
93
+ map: newObj,
94
+ list: newList,
95
+ E: newE
96
+ };
82
97
  };
83
- synMapRef();
84
- const [state, setState] = useState({
85
- map: objRef.current,
86
- list: listRef.current,
87
- E: extractE()
88
- });
98
+ const [state, setState] = useState(getStateFromMapRef());
99
+ if (versionRef.current !== versionMap[code]) {
100
+ versionRef.current = versionMap[code];
101
+ setState(getStateFromMapRef());
102
+ }
89
103
  const load = useCallback((options) => {
90
104
  const oldLoadPromise = loadPromiseRef.current;
91
- const newLoadPromise = createPromise();
92
- loadPromiseRef.current = newLoadPromise;
93
- loadDict(Object.assign({}, mergedOptions, options), mapRef).then(() => {
94
- synMapRef();
95
- setState({
96
- map: objRef.current,
97
- list: listRef.current,
98
- E: extractE()
99
- });
105
+ loadPromiseRef.current = createPromise();
106
+ loadDict({ ...mergedOptions, ...options }, mapRef).then(() => {
107
+ setState(getStateFromMapRef());
100
108
  oldLoadPromise == null ? void 0 : oldLoadPromise.resolve(void 0);
101
- newLoadPromise.resolve(void 0);
109
+ loadPromiseRef.current.resolve(void 0);
102
110
  });
103
- return newLoadPromise;
111
+ return loadPromiseRef.current;
104
112
  }, []);
105
113
  const clear2 = useCallback(() => {
106
- var _a;
107
- (_a = mapRef.current) == null ? void 0 : _a.clear();
108
- setState({
109
- map: /* @__PURE__ */ Object.create(null),
110
- list: [],
111
- E: {}
112
- });
114
+ mapRef.current.clear();
115
+ setState(getStateFromMapRef());
113
116
  }, []);
114
117
  const getItem = useCallback((value) => {
115
- var _a;
116
- return value !== null && value !== void 0 ? (_a = mapRef.current) == null ? void 0 : _a.get(value) : null;
118
+ return value !== null && value !== void 0 ? mapRef.current.get(value) : null;
117
119
  }, []);
118
120
  useEffect(() => {
119
121
  if (!remote || immediate) {
@@ -125,8 +127,8 @@ function createDictManager(createDictManagerOptions = {}) {
125
127
  load();
126
128
  } else {
127
129
  globalLoadPromise.then(() => {
128
- if (!loaded) {
129
- loaded = true;
130
+ if (!init) {
131
+ init = true;
130
132
  load();
131
133
  } else if (refresh) {
132
134
  load();
@@ -153,7 +155,9 @@ function createDictManager(createDictManagerOptions = {}) {
153
155
  };
154
156
  return {
155
157
  ..._ctx,
158
+ // @ts-ignore
156
159
  ...managerExtra == null ? void 0 : managerExtra(_ctx),
160
+ // @ts-ignore
157
161
  ...extra == null ? void 0 : extra(_ctx)
158
162
  };
159
163
  }, [state]);
package/dist/util.d.ts CHANGED
@@ -1,15 +1,22 @@
1
1
  import type { AnyFn, DictItemRecord, DictMap, DictValue, Merge, PlainObject, Recordable } from './types';
2
+ export declare const warn: (msg: string) => void;
2
3
  export declare function isFunction(fn: unknown): fn is AnyFn;
3
4
  export declare function clearObj(obj: Recordable): void;
4
- export declare function mapToObj(map: DictMap, obj?: Recordable<DictItemRecord>, itemTransformer?: (item: DictItemRecord) => any): Recordable<DictItemRecord>;
5
- export declare function mapToList(map: DictMap, list?: DictItemRecord[], itemTransformer?: (item: DictItemRecord) => any): DictItemRecord[];
6
- export declare function listToMap(list: DictItemRecord[]): Map<DictValue, DictItemRecord>;
5
+ export declare function mapToObj(map: DictMap, { obj, itemTransformer }?: {
6
+ obj?: Recordable<DictItemRecord>;
7
+ itemTransformer?: (item: DictItemRecord) => any;
8
+ }): Recordable<DictItemRecord>;
9
+ export declare function mapToList(map: DictMap, { list, itemTransformer }?: {
10
+ list?: DictItemRecord[];
11
+ itemTransformer?: (item: DictItemRecord) => any;
12
+ }): DictItemRecord[];
7
13
  type MapOptions = {
14
+ map?: DictMap;
8
15
  pickValues?: DictValue[];
9
16
  omitValues?: DictValue[];
10
17
  transformer?: (value: DictValue) => DictValue;
11
18
  };
12
- export declare function toMap(data: Recordable<DictItemRecord> | DictItemRecord[], options?: MapOptions): DictMap;
19
+ export declare function toMap(data: Recordable<DictItemRecord> | DictItemRecord[], { map, pickValues, omitValues, transformer }?: MapOptions): DictMap;
13
20
  export declare const defineDictData: <T>(data: T) => T;
14
21
  export declare function isPlainObject(obj: any): obj is PlainObject;
15
22
  export declare function merge<T extends PlainObject, S extends PlainObject[]>(target: T, ...sources: S): Merge<[T, ...S]>;
@@ -0,0 +1,3 @@
1
+ export type * from '../types';
2
+ export * from './vue-dict-manager';
3
+ export { defineDictData } from '../util';
@@ -1,4 +1,4 @@
1
- import type { CreateDictManagerOptions, DefineDict, DictValue, ExtraGetter, Fetch } from './types';
1
+ import type { CreateDictManagerOptions, DefineDict, DictValue, ExtraGetter, Fetch } from '../types';
2
2
  export declare function createDictManager<E extends ExtraGetter, F extends Fetch>(createDictManagerOptions?: CreateDictManagerOptions<E, F>): {
3
3
  defineDict: DefineDict<E, F>;
4
4
  clear: (code?: string) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "v-dict",
3
- "version": "1.2.11",
3
+ "version": "2.0.0",
4
4
  "type": "module",
5
5
  "description": "Vue3 & React Dict Manager",
6
6
  "repository": {