@jnrs/vue-core 1.2.46 → 1.2.48
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/AGENTS.md +9 -6
- package/CHANGELOG.md +16 -0
- package/dist/components/index.js +1 -1
- package/dist/{index-GnfhAnhF.js → index-B3d_yqVP.js} +26 -21
- package/dist/{index-qf5rNcN2.js → index-DLqUnm8-.js} +42 -40
- package/dist/index.js +2 -2
- package/dist/piniaStore/index.js +1 -1
- package/dist/vueRouter/createVueRouter.d.ts +3 -3
- package/dist/vueRouter/index.js +1 -1
- package/package.json +2 -2
package/AGENTS.md
CHANGED
|
@@ -303,14 +303,14 @@ const router = createVueRouter({
|
|
|
303
303
|
|
|
304
304
|
##### handleRouter
|
|
305
305
|
|
|
306
|
-
|
|
306
|
+
路由跳转、替换或新开标签页
|
|
307
307
|
|
|
308
308
|
**参数:**
|
|
309
309
|
|
|
310
|
-
| 参数名 | 类型
|
|
311
|
-
| ------ |
|
|
312
|
-
| to | `RouteLocationRaw`
|
|
313
|
-
| type | `'push' \| 'replace'` | - | 跳转方式,默认 'push' |
|
|
310
|
+
| 参数名 | 类型 | 必填 | 说明 |
|
|
311
|
+
| ------ | --------------------------- | ---- | --------------------------------------- |
|
|
312
|
+
| to | `RouteLocationRaw` | ✓ | 路由跳转参数 |
|
|
313
|
+
| type | `'push' \| 'replace' \| '_blank'` | - | 跳转方式,默认 'push';'_blank' 新开标签页 |
|
|
314
314
|
|
|
315
315
|
**返回值:** `Promise<boolean \| void>`
|
|
316
316
|
|
|
@@ -324,12 +324,15 @@ await handleRouter({ name: 'dashboard' })
|
|
|
324
324
|
|
|
325
325
|
// replace 跳转
|
|
326
326
|
await handleRouter({ path: '/user/profile' }, 'replace')
|
|
327
|
+
|
|
328
|
+
// 新开标签页打开(解析出完整 URL 后 window.open)
|
|
329
|
+
await handleRouter({ path: '/lingshuSmart/previewPage' }, '_blank')
|
|
327
330
|
```
|
|
328
331
|
|
|
329
332
|
**特性:**
|
|
330
333
|
|
|
331
334
|
- 自动捕获路由跳转错误
|
|
332
|
-
- 失败时跳转到 404
|
|
335
|
+
- push / replace 失败时跳转到 404 页面;`_blank` 模式不处理 404,仅输出警告日志
|
|
333
336
|
- 输出警告日志
|
|
334
337
|
|
|
335
338
|
##### getRoutes
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# 发版日志
|
|
2
2
|
|
|
3
|
+
## [1.2.48] - 2026-08-21 【latest】
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- `useMenuStore.asyncSetMenus` 路由生成使用完整菜单「隐藏项仍可访问」,侧边栏展示过滤 `meta.hidden` 的菜单项(`filterVisibleMenus` 递归过滤)
|
|
8
|
+
|
|
9
|
+
### Chore
|
|
10
|
+
|
|
11
|
+
- `createVueRouter` 的 `handleRouter` JSDoc 注释修正
|
|
12
|
+
|
|
13
|
+
## [1.2.47] - 2026-08-15 【latest】
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
- `handleRouter` 支持 `_blank` 新开标签页:通过 `router.resolve` 解析完整 URL 后 `window.open(href, '_blank', 'noopener,noreferrer')` 打开,`_blank` 模式不跳转 404
|
|
18
|
+
|
|
3
19
|
## [1.2.46] - 2026-08-15 【latest】
|
|
4
20
|
|
|
5
21
|
### Chore
|
package/dist/components/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { defineComponent as q, ref as V, createBlock as F, openBlock as d, unref as l, withCtx as p, createElementVNode as j, createVNode as E, toDisplayString as C, isRef as ta, createElementBlock as k, Fragment as J, renderList as Z, createTextVNode as H, computed as X, normalizeClass as te, normalizeStyle as ke, createCommentVNode as T, renderSlot as fe, withDirectives as Xe, vShow as aa, nextTick as se, withModifiers as He, watch as de, onMounted as jt, mergeProps as na } from "vue";
|
|
3
3
|
import { storeToRefs as la } from "pinia";
|
|
4
4
|
import { ElDrawer as ia, ElSwitch as oa, ElRadioGroup as Ue, ElRadio as ze, ElImage as ra, ElIcon as G, ElButton as R, ElDialog as Tt, ElUpload as sa, vLoading as Oe, ElMessage as Y, ElForm as Ut, ElFormItem as ua, ElMessageBox as lt, ElLoading as Fe, ElPagination as zt, ElTable as Ft, ElTableColumn as Ie, ElSelect as Lt, ElOption as Vt, ElCheckbox as ca, ElButtonGroup as da, ElDatePicker as Aa } from "element-plus";
|
|
5
|
-
import { u as fa, a as ga, L as ma, M as va, C as ha } from "../index-
|
|
5
|
+
import { u as fa, a as ga, L as ma, M as va, C as ha } from "../index-DLqUnm8-.js";
|
|
6
6
|
import { Back as ya, Right as pa, DArrowRight as ba, ZoomOut as Ia, ZoomIn as Ca, Switch as Ea, RefreshLeft as wa, Refresh as Sa, Download as Ne, View as ka, Delete as it, Upload as Qa, ArrowLeft as Da, ArrowRight as Ba } from "@element-plus/icons-vue";
|
|
7
7
|
import { downloadByUrl as xt, downloadByBlob as ot, objectToFormData as Pa } from "@jnrs/shared";
|
|
8
8
|
import { useI18n as he } from "vue-i18n";
|
|
@@ -1,35 +1,40 @@
|
|
|
1
1
|
import { createWebHistory as p, createRouter as d } from "vue-router";
|
|
2
|
-
const
|
|
2
|
+
const f = {
|
|
3
3
|
history: p(),
|
|
4
4
|
routes: []
|
|
5
5
|
};
|
|
6
|
-
let
|
|
7
|
-
const
|
|
8
|
-
async (c,
|
|
9
|
-
),
|
|
6
|
+
let n, s, i, m;
|
|
7
|
+
const h = ({ options: o, fileModules: t, layoutName: e, globalComponent: a, handleBeforeEach: r }) => (s = t, e && (i = e), a && (m = a), n = d({ ...f, ...o }), n.beforeEach(
|
|
8
|
+
async (c, u) => r?.(c, u)
|
|
9
|
+
), n), g = async (o, t = "push") => {
|
|
10
10
|
try {
|
|
11
|
-
|
|
11
|
+
if (t === "_blank") {
|
|
12
|
+
const { href: a } = n.resolve(o);
|
|
13
|
+
window.open(a, "_blank", "noopener,noreferrer");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
return await n[t](o);
|
|
12
17
|
} catch (e) {
|
|
13
|
-
|
|
18
|
+
t !== "_blank" && n[t]({ name: "404" }), console.warn(`router.${t} 失败`, {
|
|
14
19
|
code: "ROUTER_NOT_MATCH",
|
|
15
20
|
message: "未匹配到有效路由",
|
|
16
21
|
error: o || e,
|
|
17
22
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
18
23
|
});
|
|
19
24
|
}
|
|
20
|
-
}, _ = (o) => s[`/src/views${o}.vue`],
|
|
25
|
+
}, _ = (o) => s[`/src/views${o}.vue`], l = async (o, t) => {
|
|
21
26
|
for (const e of o) {
|
|
22
27
|
if (e.meta.fullPathTitle = t ? t.meta.fullPathTitle + "," + e.meta.title : e.meta.title, !e.component) {
|
|
23
|
-
e.redirect &&
|
|
28
|
+
e.redirect && n.addRoute({
|
|
24
29
|
path: e.path,
|
|
25
30
|
name: e.name,
|
|
26
31
|
meta: e.meta,
|
|
27
32
|
redirect: e.redirect
|
|
28
|
-
}), e.children && e.children.length > 0 && await
|
|
33
|
+
}), e.children && e.children.length > 0 && await l(e.children, e);
|
|
29
34
|
continue;
|
|
30
35
|
}
|
|
31
|
-
const
|
|
32
|
-
if (!
|
|
36
|
+
const a = e.component.replace(/[^a-zA-Z0-9/._-]/g, "");
|
|
37
|
+
if (!a.startsWith("/") || a.includes("..")) {
|
|
33
38
|
console.warn("[Router] 组件加载失败", {
|
|
34
39
|
code: "INVALID_COMPONENT_PATH",
|
|
35
40
|
message: "组件路径拼写不符合规则,应以 '/' 开头且不能包含 '..',请检查 component 字段是否配置正确",
|
|
@@ -42,7 +47,7 @@ const f = ({ options: o, fileModules: t, layoutName: e, globalComponent: n, hand
|
|
|
42
47
|
});
|
|
43
48
|
continue;
|
|
44
49
|
}
|
|
45
|
-
const r = _(
|
|
50
|
+
const r = _(a);
|
|
46
51
|
if (!r) {
|
|
47
52
|
console.warn("[Router] 组件加载失败", {
|
|
48
53
|
code: "COMPONENT_NOT_FOUND",
|
|
@@ -77,21 +82,21 @@ const f = ({ options: o, fileModules: t, layoutName: e, globalComponent: n, hand
|
|
|
77
82
|
component: () => r()
|
|
78
83
|
}
|
|
79
84
|
]
|
|
80
|
-
}),
|
|
85
|
+
}), n.addRoute(c)) : n.addRoute(i, c);
|
|
81
86
|
}
|
|
82
87
|
}, O = () => {
|
|
83
88
|
const o = [];
|
|
84
|
-
for (const t of
|
|
89
|
+
for (const t of n.getRoutes())
|
|
85
90
|
o.push({
|
|
86
91
|
name: t.name,
|
|
87
92
|
path: t.path,
|
|
88
93
|
meta: t.meta
|
|
89
94
|
});
|
|
90
95
|
return o;
|
|
91
|
-
},
|
|
96
|
+
}, b = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
92
97
|
__proto__: null,
|
|
93
|
-
asyncGenerateRoute:
|
|
94
|
-
createVueRouter:
|
|
98
|
+
asyncGenerateRoute: l,
|
|
99
|
+
createVueRouter: h,
|
|
95
100
|
getRoutes: O,
|
|
96
101
|
handleRouter: g
|
|
97
102
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
@@ -100,9 +105,9 @@ console.log(
|
|
|
100
105
|
'background: #42B883; color: #39495C; font-weight: bold; padding: 4px 8px; border-radius: 4px; font-family: "Helvetica Neue", sans-serif;'
|
|
101
106
|
);
|
|
102
107
|
export {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
108
|
+
l as a,
|
|
109
|
+
h as b,
|
|
110
|
+
b as c,
|
|
106
111
|
O as g,
|
|
107
112
|
g as h
|
|
108
113
|
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import "pinia-plugin-persistedstate";
|
|
2
|
-
import { defineStore as
|
|
3
|
-
import { ref as
|
|
2
|
+
import { defineStore as d } from "pinia";
|
|
3
|
+
import { ref as c, computed as b, watch as v } from "vue";
|
|
4
4
|
import { Fullscreen as S } from "@jnrs/shared";
|
|
5
5
|
import { usePreferredDark as f } from "@vueuse/core";
|
|
6
|
-
import { a as k } from "./index-
|
|
7
|
-
const O =
|
|
6
|
+
import { a as k } from "./index-B3d_yqVP.js";
|
|
7
|
+
const O = d(
|
|
8
8
|
"@jnrs/vue-core/pinia:mock",
|
|
9
|
-
() => ({ useMockServe:
|
|
9
|
+
() => ({ useMockServe: c(!1) }),
|
|
10
10
|
{
|
|
11
11
|
persist: {
|
|
12
12
|
pick: ["useMockServe"]
|
|
@@ -52,38 +52,38 @@ function U(e) {
|
|
|
52
52
|
function j(e) {
|
|
53
53
|
return typeof e == "string" && e.trim() !== "";
|
|
54
54
|
}
|
|
55
|
-
const x =
|
|
55
|
+
const x = d(
|
|
56
56
|
"@jnrs/vue-core/pinia:system",
|
|
57
57
|
() => {
|
|
58
|
-
const e =
|
|
59
|
-
await
|
|
60
|
-
},
|
|
58
|
+
const e = c(!1), o = () => e.value = !e.value, i = new S(), l = c(!1), m = async () => {
|
|
59
|
+
await i.toggle(), l.value = i.isFullscreen();
|
|
60
|
+
}, a = c({
|
|
61
61
|
locale: C[0].value,
|
|
62
62
|
mode: M[0].value,
|
|
63
63
|
primaryColor: w[0].value
|
|
64
|
-
}),
|
|
65
|
-
return
|
|
66
|
-
[() =>
|
|
67
|
-
([r,
|
|
64
|
+
}), s = b(() => a.value.mode === "auto" ? n.value ? "dark" : "light" : a.value.mode), n = f();
|
|
65
|
+
return v(
|
|
66
|
+
[() => a.value.mode, n, () => a.value.primaryColor],
|
|
67
|
+
([r, y, g]) => {
|
|
68
68
|
const u = document.documentElement;
|
|
69
|
-
u.classList.remove("light", "dark"), r === "auto" ? u.classList.add(
|
|
69
|
+
u.classList.remove("light", "dark"), r === "auto" ? u.classList.add(y ? "dark" : "light") : u.classList.add(r), g ? u.style.setProperty("--jnrs-color-primary", g) : u.style.removeProperty("--jnrs-color-primary");
|
|
70
70
|
},
|
|
71
71
|
{ immediate: !0 }
|
|
72
72
|
), {
|
|
73
|
-
theme:
|
|
74
|
-
computedThemeMode:
|
|
73
|
+
theme: a,
|
|
74
|
+
computedThemeMode: s,
|
|
75
75
|
menuCollapse: e,
|
|
76
76
|
documentFullscreen: l,
|
|
77
77
|
toggleCollapse: o,
|
|
78
|
-
toggleFullScreen:
|
|
78
|
+
toggleFullScreen: m,
|
|
79
79
|
setLocale: (r) => {
|
|
80
|
-
G(r) && (
|
|
80
|
+
G(r) && (a.value.locale = r);
|
|
81
81
|
},
|
|
82
82
|
setMode: (r) => {
|
|
83
|
-
U(r) && (
|
|
83
|
+
U(r) && (a.value.mode = r);
|
|
84
84
|
},
|
|
85
85
|
setPrimaryColor: (r) => {
|
|
86
|
-
j(r) && (
|
|
86
|
+
j(r) && (a.value.primaryColor = r);
|
|
87
87
|
}
|
|
88
88
|
};
|
|
89
89
|
},
|
|
@@ -98,45 +98,47 @@ for (let e = 0; e < 256; ++e)
|
|
|
98
98
|
function L(e, o = 0) {
|
|
99
99
|
return (t[e[o + 0]] + t[e[o + 1]] + t[e[o + 2]] + t[e[o + 3]] + "-" + t[e[o + 4]] + t[e[o + 5]] + "-" + t[e[o + 6]] + t[e[o + 7]] + "-" + t[e[o + 8]] + t[e[o + 9]] + "-" + t[e[o + 10]] + t[e[o + 11]] + t[e[o + 12]] + t[e[o + 13]] + t[e[o + 14]] + t[e[o + 15]]).toLowerCase();
|
|
100
100
|
}
|
|
101
|
-
let
|
|
101
|
+
let p;
|
|
102
102
|
const P = new Uint8Array(16);
|
|
103
103
|
function R() {
|
|
104
|
-
if (!
|
|
104
|
+
if (!p) {
|
|
105
105
|
if (typeof crypto > "u" || !crypto.getRandomValues)
|
|
106
106
|
throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
|
|
107
|
-
|
|
107
|
+
p = crypto.getRandomValues.bind(crypto);
|
|
108
108
|
}
|
|
109
|
-
return
|
|
109
|
+
return p(P);
|
|
110
110
|
}
|
|
111
|
-
const D = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto),
|
|
112
|
-
function I(e, o,
|
|
111
|
+
const D = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), h = { randomUUID: D };
|
|
112
|
+
function I(e, o, i) {
|
|
113
113
|
e = e || {};
|
|
114
114
|
const l = e.random ?? e.rng?.() ?? R();
|
|
115
115
|
if (l.length < 16)
|
|
116
116
|
throw new Error("Random bytes length must be >= 16");
|
|
117
117
|
return l[6] = l[6] & 15 | 64, l[8] = l[8] & 63 | 128, L(l);
|
|
118
118
|
}
|
|
119
|
-
function _(e, o,
|
|
120
|
-
return
|
|
119
|
+
function _(e, o, i) {
|
|
120
|
+
return h.randomUUID && !e ? h.randomUUID() : I(e);
|
|
121
121
|
}
|
|
122
|
-
const T =
|
|
122
|
+
const T = d(
|
|
123
123
|
"@jnrs/vue-core/pinia:menu",
|
|
124
124
|
() => {
|
|
125
|
-
const e =
|
|
125
|
+
const e = c(!1), o = c([]), i = async (s) => {
|
|
126
126
|
if (e.value)
|
|
127
127
|
return o.value;
|
|
128
|
-
l(
|
|
128
|
+
l(s);
|
|
129
129
|
try {
|
|
130
|
-
await k(
|
|
131
|
-
} catch (
|
|
132
|
-
throw
|
|
130
|
+
await k(s);
|
|
131
|
+
} catch (n) {
|
|
132
|
+
throw n;
|
|
133
133
|
}
|
|
134
|
-
return o.value;
|
|
135
|
-
}, l = (
|
|
136
|
-
for (const
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
|
|
134
|
+
return o.value = m(s), e.value = !0, o.value;
|
|
135
|
+
}, l = (s) => {
|
|
136
|
+
for (const n of s)
|
|
137
|
+
n.meta.uuid = _(), n.children && l(n.children);
|
|
138
|
+
}, m = (s) => s.filter((n) => !n.meta.hidden).map(
|
|
139
|
+
(n) => n.children ? { ...n, children: m(n.children) } : n
|
|
140
|
+
);
|
|
141
|
+
return { hasFetchedAsyncMenus: e, menus: o, asyncSetMenus: i, clearMenu: () => {
|
|
140
142
|
e.value = !1, o.value = [];
|
|
141
143
|
} };
|
|
142
144
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as r } from "./index-
|
|
2
|
-
import { i } from "./index-
|
|
1
|
+
import { c as r } from "./index-B3d_yqVP.js";
|
|
2
|
+
import { i } from "./index-DLqUnm8-.js";
|
|
3
3
|
console.log(
|
|
4
4
|
"%c✨ 欢迎使用 @jnrs/vue-core",
|
|
5
5
|
'background: #42B883; color: #39495C; font-weight: bold; padding: 4px 8px; border-radius: 4px; font-family: "Helvetica Neue", sans-serif;'
|
package/dist/piniaStore/index.js
CHANGED
|
@@ -12,12 +12,12 @@ import { CreateVueRouter } from './types';
|
|
|
12
12
|
*/
|
|
13
13
|
declare const createVueRouter: ({ options, fileModules, layoutName, globalComponent, handleBeforeEach }: CreateVueRouter) => Router;
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* 路由跳转、替换或新开标签页
|
|
16
16
|
* @param to 路由跳转参数
|
|
17
|
-
* @param type 默认为push
|
|
17
|
+
* @param type 默认为 'push',可选值为 'push' | 'replace' | '_blank'
|
|
18
18
|
* @returns Promise<boolean | void>
|
|
19
19
|
*/
|
|
20
|
-
declare const handleRouter: (to: RouteLocationRaw, type?: "push" | "replace") => Promise<void | import('vue-router').NavigationFailure>;
|
|
20
|
+
declare const handleRouter: (to: RouteLocationRaw, type?: "push" | "replace" | "_blank") => Promise<void | import('vue-router').NavigationFailure>;
|
|
21
21
|
/**
|
|
22
22
|
* 设置动态路由,生成路由记录
|
|
23
23
|
* @param menus 菜单项
|
package/dist/vueRouter/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jnrs/vue-core",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.48",
|
|
4
4
|
"description": "巨能(JNRS)前端工程化开发,Vue 专用核心功能包。",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jnrs",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"vue": "^3.5.22",
|
|
61
61
|
"vue-i18n": "^11.2.8",
|
|
62
62
|
"vue-router": "^4.5.1",
|
|
63
|
-
"@jnrs/shared": "1.1.
|
|
63
|
+
"@jnrs/shared": "1.1.38"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@vitejs/plugin-vue": "^6.0.1",
|