@zl-ui-kit/composables 0.5.0 → 0.6.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.
- package/README.md +8 -8
- package/dist/index.js +86 -67
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
|
|
6
6
|
ZL UI 组合式函数库(TypeScript):
|
|
7
7
|
|
|
8
|
-
| 模块
|
|
9
|
-
|
|
|
10
|
-
| `useRequest/useDataRequest/usePaginationRequest/usePageableRequest` | 请求体系(插件机制:loading/ready/refreshDeps/download,可 `defineUseRequestPlugin` 自定义)
|
|
11
|
-
| `useGlobalMessage`
|
|
12
|
-
| `useGlobalData`
|
|
13
|
-
| `useDict/useDictStore/useDictProvider/setDictSource`
|
|
14
|
-
| `useLocale`
|
|
15
|
-
| `useSash/useServiceType/useUKey/createCacheComputed`
|
|
8
|
+
| 模块 | 说明 |
|
|
9
|
+
| ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
|
|
10
|
+
| `useRequest/useDataRequest/usePaginationRequest/usePageableRequest` | 请求体系(插件机制:loading/ready/refreshDeps/download,可 `defineUseRequestPlugin` 自定义) |
|
|
11
|
+
| `useGlobalMessage` | **Element Plus 版** ElMessage/ElMessageBox/ElNotification 封装;`Modal.confirmPromise` 语义与参考实现一致 |
|
|
12
|
+
| `useGlobalData` | 全局应用数据(locale / theme / token / 用户 / 权限 / config),纯 `localStorage` 持久化 |
|
|
13
|
+
| `useDict/useDictStore/useDictProvider/setDictSource` | 字典(独立 Vue3 状态管理 store 缓存,不依赖全局数据;支持组件直传 / 局部 source / 全局 source 三级注入) |
|
|
14
|
+
| `useLocale` | vue-i18n + 全局语言联动(`elLocaleMessages` 对接 EP locale) |
|
|
15
|
+
| `useSash/useServiceType/useUKey/createCacheComputed` | 其他工具 hook |
|
|
16
16
|
|
|
17
17
|
## 运行前提
|
|
18
18
|
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,10 @@ function createCacheComputed(getter) {
|
|
|
5
5
|
const cache = /* @__PURE__ */ new Map();
|
|
6
6
|
const useComputed = (obj) => {
|
|
7
7
|
if (!cache.has(obj)) {
|
|
8
|
-
cache.set(
|
|
8
|
+
cache.set(
|
|
9
|
+
obj,
|
|
10
|
+
computed(() => getter(obj))
|
|
11
|
+
);
|
|
9
12
|
}
|
|
10
13
|
return cache.get(obj);
|
|
11
14
|
};
|
|
@@ -31,8 +34,7 @@ function deepMerge(base, override) {
|
|
|
31
34
|
function mergeMessages(base, ...overrides) {
|
|
32
35
|
let result = { ...base ?? {} };
|
|
33
36
|
for (const override of overrides) {
|
|
34
|
-
if (!override)
|
|
35
|
-
continue;
|
|
37
|
+
if (!override) continue;
|
|
36
38
|
result = deepMerge(result, override);
|
|
37
39
|
}
|
|
38
40
|
return result;
|
|
@@ -142,8 +144,7 @@ var useGlobalData = createGlobalState2(() => {
|
|
|
142
144
|
const globalData = ref2(createInitialState(storages));
|
|
143
145
|
const waiters = /* @__PURE__ */ new Set();
|
|
144
146
|
function updateBodyAttribute(key, value) {
|
|
145
|
-
if (typeof document === "undefined")
|
|
146
|
-
return;
|
|
147
|
+
if (typeof document === "undefined") return;
|
|
147
148
|
document.body.setAttribute(key, String(value ?? ""));
|
|
148
149
|
}
|
|
149
150
|
updateBodyAttribute("data-theme", storages.theme.value);
|
|
@@ -153,38 +154,39 @@ var useGlobalData = createGlobalState2(() => {
|
|
|
153
154
|
(values) => {
|
|
154
155
|
values.forEach((value, index) => {
|
|
155
156
|
const key = SYNC_KEYS[index];
|
|
156
|
-
if (storages[key].value === value)
|
|
157
|
-
return;
|
|
157
|
+
if (storages[key].value === value) return;
|
|
158
158
|
storages[key].value = value;
|
|
159
|
-
if (key === "theme")
|
|
160
|
-
|
|
161
|
-
if (key === "locale")
|
|
162
|
-
updateBodyAttribute("data-locale", value);
|
|
159
|
+
if (key === "theme") updateBodyAttribute("data-theme", value);
|
|
160
|
+
if (key === "locale") updateBodyAttribute("data-locale", value);
|
|
163
161
|
});
|
|
164
162
|
}
|
|
165
163
|
);
|
|
166
|
-
watch(
|
|
167
|
-
|
|
168
|
-
|
|
164
|
+
watch(
|
|
165
|
+
globalData,
|
|
166
|
+
() => {
|
|
167
|
+
waiters.forEach((fn) => fn());
|
|
168
|
+
},
|
|
169
|
+
{ deep: true }
|
|
170
|
+
);
|
|
169
171
|
function getConfig(key, defaultValue) {
|
|
170
172
|
return globalData.value.config?.[key] ?? defaultValue;
|
|
171
173
|
}
|
|
172
174
|
function isConfig(key, compareValue = "true") {
|
|
173
175
|
return globalData.value.config?.[key] === compareValue;
|
|
174
176
|
}
|
|
175
|
-
async function setAndWaitUntil({
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
177
|
+
async function setAndWaitUntil({
|
|
178
|
+
set,
|
|
179
|
+
until
|
|
180
|
+
}) {
|
|
181
|
+
if (!set && !isFunction(until)) return;
|
|
182
|
+
if (isPlainObject2(set)) globalData.value = { ...globalData.value, ...set };
|
|
180
183
|
if (!isFunction(until)) {
|
|
181
184
|
await nextTick();
|
|
182
185
|
return;
|
|
183
186
|
}
|
|
184
187
|
const { resolve, promise } = withResolvers();
|
|
185
188
|
const waiter = () => {
|
|
186
|
-
if (!until(globalData.value))
|
|
187
|
-
return;
|
|
189
|
+
if (!until(globalData.value)) return;
|
|
188
190
|
waiters.delete(waiter);
|
|
189
191
|
resolve();
|
|
190
192
|
};
|
|
@@ -288,8 +290,7 @@ var elLocaleMessagesStore = {};
|
|
|
288
290
|
function useLocale(options = {}, loader) {
|
|
289
291
|
const { locale, localeMessages, elLocaleMessages, isI18nKeyVisible } = useGlobalData();
|
|
290
292
|
function postTranslation(translated, key) {
|
|
291
|
-
if (isI18nKeyVisible.value)
|
|
292
|
-
return key;
|
|
293
|
+
if (isI18nKeyVisible.value) return key;
|
|
293
294
|
return options.postTranslation ? options.postTranslation(translated, key) : translated;
|
|
294
295
|
}
|
|
295
296
|
const i18n = createI18n({
|
|
@@ -302,22 +303,25 @@ function useLocale(options = {}, loader) {
|
|
|
302
303
|
localeMessages.value = options.messages;
|
|
303
304
|
}
|
|
304
305
|
const loadedLocale = [];
|
|
305
|
-
watch2(
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
if (
|
|
311
|
-
|
|
312
|
-
|
|
306
|
+
watch2(
|
|
307
|
+
locale,
|
|
308
|
+
async (value) => {
|
|
309
|
+
if (!value) return;
|
|
310
|
+
i18n.global.locale.value = value;
|
|
311
|
+
if (loader) {
|
|
312
|
+
if (loadedLocale.includes(value)) {
|
|
313
|
+
elLocaleMessages.value = elLocaleMessagesStore[value];
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const messages = await loader(value);
|
|
317
|
+
loadedLocale.push(value);
|
|
318
|
+
localeMessages.value = messages.localeMessages;
|
|
319
|
+
elLocaleMessages.value = messages.elLocaleMessages;
|
|
320
|
+
elLocaleMessagesStore[value] = messages.elLocaleMessages;
|
|
313
321
|
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
elLocaleMessages.value = messages.elLocaleMessages;
|
|
318
|
-
elLocaleMessagesStore[value] = messages.elLocaleMessages;
|
|
319
|
-
}
|
|
320
|
-
}, { immediate: true });
|
|
322
|
+
},
|
|
323
|
+
{ immediate: true }
|
|
324
|
+
);
|
|
321
325
|
let storeLocale;
|
|
322
326
|
watch2(isI18nKeyVisible, (visible) => {
|
|
323
327
|
const currentLocale = toValue(i18n.global.locale);
|
|
@@ -329,20 +333,21 @@ function useLocale(options = {}, loader) {
|
|
|
329
333
|
storeLocale = void 0;
|
|
330
334
|
}
|
|
331
335
|
});
|
|
332
|
-
watch2(
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
i18n.global.setLocaleMessage(loc2, msg);
|
|
336
|
+
watch2(
|
|
337
|
+
localeMessages,
|
|
338
|
+
(messages) => {
|
|
339
|
+
if (!messages || typeof messages !== "object") return;
|
|
340
|
+
if (!("locale" in messages)) {
|
|
341
|
+
for (const [loc2, msg] of Object.entries(messages)) {
|
|
342
|
+
if (msg && typeof msg === "object") i18n.global.setLocaleMessage(loc2, msg);
|
|
343
|
+
}
|
|
344
|
+
return;
|
|
339
345
|
}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
}, { immediate: true });
|
|
346
|
+
const { locale: loc, ...rest } = messages;
|
|
347
|
+
if (loc) i18n.global.setLocaleMessage(loc, rest);
|
|
348
|
+
},
|
|
349
|
+
{ immediate: true }
|
|
350
|
+
);
|
|
346
351
|
return {
|
|
347
352
|
i18n,
|
|
348
353
|
isI18nKeyVisible,
|
|
@@ -546,18 +551,16 @@ var useLoadingPlugin_default = definePlugin((requestInstance, options = {}) => {
|
|
|
546
551
|
};
|
|
547
552
|
},
|
|
548
553
|
onRequest(service) {
|
|
549
|
-
if (!toValue3(loadingKeep))
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
} else {
|
|
558
|
-
return Promise.reject(res.reason);
|
|
554
|
+
if (!toValue3(loadingKeep)) return () => service();
|
|
555
|
+
return () => Promise.allSettled([service(), promiseTimeout(toValue3(loadingDelay) + toValue3(loadingKeep))]).then(
|
|
556
|
+
([res]) => {
|
|
557
|
+
if (res.status === "fulfilled") {
|
|
558
|
+
return res.value;
|
|
559
|
+
} else {
|
|
560
|
+
return Promise.reject(res.reason);
|
|
561
|
+
}
|
|
559
562
|
}
|
|
560
|
-
|
|
563
|
+
);
|
|
561
564
|
},
|
|
562
565
|
onCancel() {
|
|
563
566
|
stop();
|
|
@@ -573,9 +576,13 @@ import { whenever } from "@vueuse/core";
|
|
|
573
576
|
import { ref as ref4, toValue as toValue4 } from "vue";
|
|
574
577
|
var useReadyPlugin_default = definePlugin((requestInstance, options = {}) => {
|
|
575
578
|
const { ready = ref4(true), defaultParams = [] } = options;
|
|
576
|
-
whenever(
|
|
577
|
-
|
|
578
|
-
|
|
579
|
+
whenever(
|
|
580
|
+
() => toValue4(ready),
|
|
581
|
+
() => {
|
|
582
|
+
requestInstance.context.run(...defaultParams);
|
|
583
|
+
},
|
|
584
|
+
{ flush: "sync" }
|
|
585
|
+
);
|
|
579
586
|
return {
|
|
580
587
|
onBefore() {
|
|
581
588
|
if (!toValue4(ready)) {
|
|
@@ -613,7 +620,13 @@ function useRequestImpl(service, options = {}, plugins = []) {
|
|
|
613
620
|
};
|
|
614
621
|
const { manual = false, defaultParams = [] } = _options;
|
|
615
622
|
const requestInstance = createRequest(service, _options);
|
|
616
|
-
requestInstance.plugins.value = [
|
|
623
|
+
requestInstance.plugins.value = [
|
|
624
|
+
...plugins,
|
|
625
|
+
useLoadingPlugin_default,
|
|
626
|
+
useReadyPlugin_default,
|
|
627
|
+
useRefreshDepsPlugin_default,
|
|
628
|
+
useDownloadPlugin_default
|
|
629
|
+
].map((plugin) => plugin(requestInstance, _options));
|
|
617
630
|
if (!manual) {
|
|
618
631
|
const params = requestInstance.params.value || defaultParams;
|
|
619
632
|
requestInstance.context.run(...params);
|
|
@@ -658,7 +671,13 @@ import { computed as computed5, inject as inject3 } from "vue";
|
|
|
658
671
|
function usePaginationRequest(service, options, plugins) {
|
|
659
672
|
const { pagination = {}, ...restOptions } = options || {};
|
|
660
673
|
const injectedGlobalOptions = inject3(GLOBAL_OPTIONS_PROVIDER_KEY, {});
|
|
661
|
-
const { currentKey, pageSizeKey, totalKey, dataKey } = Object.assign(
|
|
674
|
+
const { currentKey, pageSizeKey, totalKey, dataKey } = Object.assign(
|
|
675
|
+
{},
|
|
676
|
+
DEFAULT_PAGINATION_OPTIONS,
|
|
677
|
+
getGlobalOptions().pagination,
|
|
678
|
+
injectedGlobalOptions.pagination,
|
|
679
|
+
pagination
|
|
680
|
+
);
|
|
662
681
|
const finalOptions = {
|
|
663
682
|
defaultParams: [{ [currentKey]: 1, [pageSizeKey]: 30 }],
|
|
664
683
|
...restOptions
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zl-ui-kit/composables",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "ZL UI 组合式函数库:useRequest 请求体系、微前端通信层、全局消息、字典、国际化等",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
],
|
|
20
20
|
"sideEffects": false,
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@zl-ui-kit/utils": "0.
|
|
22
|
+
"@zl-ui-kit/utils": "0.6.0"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"@vueuse/core": "^12.3.0",
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"cross-env": "^7.0.3",
|
|
41
41
|
"tsup": "^8.3.5",
|
|
42
42
|
"typescript": "^5.7.3",
|
|
43
|
-
"@jichuang/
|
|
44
|
-
"@jichuang/
|
|
43
|
+
"@jichuang/eslint-config": "1.0.0",
|
|
44
|
+
"@jichuang/tsconfig": "1.0.0"
|
|
45
45
|
},
|
|
46
46
|
"repository": {
|
|
47
47
|
"type": "git",
|