@deppon/deppon-router 2.2.1 → 2.2.2

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/LICENSE CHANGED
@@ -1,22 +1,22 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 Deppon
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
22
-
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Deppon
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/es/composable.js CHANGED
@@ -36,24 +36,24 @@ function createRouteProxy(routeRef, router) {
36
36
  });
37
37
  }
38
38
 
39
- /**
40
- * Composition API: useRouter
41
- * 在 Vue 3 Composition API 中使用 router
42
- *
43
- * @example
44
- * import { useRouter } from '@deppon/deppon-router'
45
- *
46
- * export default {
47
- * setup() {
48
- * const router = useRouter()
49
- *
50
- * const handleClick = () => {
51
- * router.push('/home')
52
- * }
53
- *
54
- * return { handleClick }
55
- * }
56
- * }
39
+ /**
40
+ * Composition API: useRouter
41
+ * 在 Vue 3 Composition API 中使用 router
42
+ *
43
+ * @example
44
+ * import { useRouter } from '@deppon/deppon-router'
45
+ *
46
+ * export default {
47
+ * setup() {
48
+ * const router = useRouter()
49
+ *
50
+ * const handleClick = () => {
51
+ * router.push('/home')
52
+ * }
53
+ *
54
+ * return { handleClick }
55
+ * }
56
+ * }
57
57
  */
58
58
  function useRouter() {
59
59
  // 优先从 provide 获取增强的 router
@@ -78,28 +78,28 @@ function useRouter() {
78
78
  return routerFromProvide;
79
79
  }
80
80
 
81
- /**
82
- * Composition API: useRoute
83
- * 在 Vue 3 Composition API 中使用当前路由
84
- *
85
- * @example
86
- * import { useRoute } from '@deppon/deppon-router'
87
- *
88
- * export default {
89
- * setup() {
90
- * const route = useRoute()
91
- *
92
- * console.log(route.path)
93
- * console.log(route.params)
94
- * console.log(route.query)
95
- *
96
- * // 使用 getQueryByRoute 获取参数(自动适配 iframe 环境)
97
- * const allParams = route.getQueryByRoute();
98
- * const sourceType = route.getQueryByRoute('sourceType');
99
- *
100
- * return {}
101
- * }
102
- * }
81
+ /**
82
+ * Composition API: useRoute
83
+ * 在 Vue 3 Composition API 中使用当前路由
84
+ *
85
+ * @example
86
+ * import { useRoute } from '@deppon/deppon-router'
87
+ *
88
+ * export default {
89
+ * setup() {
90
+ * const route = useRoute()
91
+ *
92
+ * console.log(route.path)
93
+ * console.log(route.params)
94
+ * console.log(route.query)
95
+ *
96
+ * // 使用 getQueryByRoute 获取参数(自动适配 iframe 环境)
97
+ * const allParams = route.getQueryByRoute();
98
+ * const sourceType = route.getQueryByRoute('sourceType');
99
+ *
100
+ * return {}
101
+ * }
102
+ * }
103
103
  */
104
104
  function useRoute() {
105
105
  try {
package/es/guards.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- /**
2
- * 设置路由守卫
3
- * @param {Object} router - Vue Router 实例
4
- * @param {Object} guards - 守卫配置
5
- * @param {Object} log - 日志实例
6
- * @param {Function} onRouteChange - 路由变化回调
7
- */
8
- export function setupGuards(router: Object, guards: Object | undefined, log: Object, onRouteChange: Function): void;
1
+ /**
2
+ * 设置路由守卫
3
+ * @param {Object} router - Vue Router 实例
4
+ * @param {Object} guards - 守卫配置
5
+ * @param {Object} log - 日志实例
6
+ * @param {Function} onRouteChange - 路由变化回调
7
+ */
8
+ export function setupGuards(router: Object, guards: Object | undefined, log: Object, onRouteChange: Function): void;
package/es/guards.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import './_virtual/_rollup-plugin-inject-process-env.js';
2
2
 
3
- /**
4
- * 设置路由守卫
5
- * @param {Object} router - Vue Router 实例
6
- * @param {Object} guards - 守卫配置
7
- * @param {Object} log - 日志实例
8
- * @param {Function} onRouteChange - 路由变化回调
3
+ /**
4
+ * 设置路由守卫
5
+ * @param {Object} router - Vue Router 实例
6
+ * @param {Object} guards - 守卫配置
7
+ * @param {Object} log - 日志实例
8
+ * @param {Function} onRouteChange - 路由变化回调
9
9
  */
10
10
  function setupGuards(router) {
11
11
  var guards = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
package/es/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- /**
2
- * 重新导出 vue-router 的类型(供其他包使用)
3
- */
4
- export type { RouterView, Router, RouteRecordRaw, NavigationGuardNext, RouteLocationNormalized } from 'vue-router';
1
+ /**
2
+ * 重新导出 vue-router 的类型(供其他包使用)
3
+ */
4
+ export type { RouterView, Router, RouteRecordRaw, NavigationGuardNext, RouteLocationNormalized } from 'vue-router';
package/es/utils.d.ts CHANGED
@@ -1,142 +1,142 @@
1
- export function createRouterUtils(router: any, defaultViewTab?: null): {
2
- /**
3
- * 包装后的 push 方法,自动应用默认的 _viewTab 配置
4
- * @param {Object|String} location - 路由位置
5
- * @param {Function} onComplete - 成功回调
6
- * @param {Function} onAbort - 失败回调
7
- */
8
- push(location: Object | string, onComplete: Function, onAbort: Function): Promise<any>;
9
- /**
10
- * 安全的路由跳转(带错误处理)
11
- * @param {Object|String} location - 路由位置
12
- * @param {Function} onComplete - 成功回调
13
- * @param {Function} onAbort - 失败回调
14
- */
15
- safePush(location: Object | string, onComplete: Function, onAbort: Function): any;
16
- /**
17
- * 安全的路由替换(带错误处理)
18
- * @param {Object|String} location - 路由位置
19
- * @param {Function} onComplete - 成功回调
20
- * @param {Function} onAbort - 失败回调
21
- */
22
- safeReplace(location: Object | string, onComplete: Function, onAbort: Function): any;
23
- /**
24
- * 根据路由名称跳转
25
- * @param {String} name - 路由名称
26
- * @param {Object} params - 路由参数
27
- * @param {Object} query - 查询参数
28
- */
29
- pushByName(name: string, params?: Object, query?: Object): any;
30
- /**
31
- * 根据路由路径跳转
32
- * @param {String} path - 路由路径
33
- * @param {Object} query - 查询参数
34
- */
35
- pushByPath(path: string, query?: Object): any;
36
- /**
37
- * 返回上一页
38
- * @param {Number} delta - 返回的步数,默认为 1
39
- */
40
- goBack(delta?: number): void;
41
- /**
42
- * 关闭当前标签页
43
- * @param {string} [url] - 标签页 URL(默认使用当前页面的 location.href)
44
- * @param {string} [type='IFRAME'] - 标签页类型(默认:'IFRAME')
45
- */
46
- closeCurrentTab(url?: string | undefined, type?: string | undefined): void;
47
- /**
48
- * 检查路由是否存在(包括动态添加的路由)
49
- * @param {String} name - 路由名称
50
- * @returns {Boolean}
51
- */
52
- hasRoute(name: string): boolean;
53
- /**
54
- * 获取路由配置(包括动态添加的路由)
55
- * @param {String} name - 路由名称
56
- * @returns {Object|null}
57
- */
58
- getRouteConfig(name: string): Object | null;
59
- /**
60
- * 智能获取路由参数:在 iframe 环境中优先从父级获取,否则从当前路由 query 获取
61
- * 与 depponPush 的参数获取逻辑保持一致
62
- * @param {String} [key] - 参数键名,如果不提供则返回所有参数对象
63
- * @returns {any} 参数值(如果提供了 key)或参数对象(如果未提供 key)
64
- *
65
- * @example
66
- * // 获取所有参数
67
- * const params = router.getQueryByRoute();
68
- *
69
- * // 获取指定参数
70
- * const sourceType = router.getQueryByRoute('sourceType');
71
- */
72
- getQueryByRoute(key?: string | undefined): any;
73
- /**
74
- * 智能路由跳转:在 iframe 环境中自动使用 viewTab,否则使用 router.push
75
- * 参数传递方式与 router.push 完全一致,在 iframe 环境中会自动适配 viewTab
76
- * @param {Object|String} location - 路由位置(与 router.push 一致)
77
- * - 如果是字符串:路径字符串,如 '/home' 或 '/home?id=1'
78
- * - 如果是对象,可以包含以下属性:
79
- * - path: 路径
80
- * - name: 路由名称
81
- * - params: 路由参数(在 iframe 环境中会传递给 viewTab 的 params)
82
- * - query: 查询参数(会转换为 URL 的 query string)
83
- * - _viewTab: viewTab 选项对象(可选,仅在 iframe 环境中生效)
84
- * - title: 标签页标题(默认使用路由 meta.title 或 '新页面')
85
- * - uumsFunction: UUMS 功能配置
86
- * - functionCode: 功能代码
87
- * - sourceSystem: 来源系统
88
- * - closeCurrentTab: 是否关闭当前标签页(默认 false)
89
- * @param {Function} [onComplete] - 成功回调(与 router.push 一致)
90
- * @param {Function} [onAbort] - 失败回调(与 router.push 一致)
91
- * @returns {Promise} 跳转 Promise
92
- *
93
- * @example
94
- * // 基本用法(与 router.push 完全一致,在 iframe 环境中自动使用 viewTab)
95
- * router.depponPush('/home');
96
- * router.depponPush({ path: '/home', query: { id: 1 } });
97
- * router.depponPush({ name: 'Home', params: { id: 1 } });
98
- *
99
- * // 在 iframe 环境中自定义 viewTab 选项
100
- * router.depponPush({
101
- * path: '/preferInfo',
102
- * query: { sourceType: 'insert' },
103
- * params: { custNumber: '701265308', preferId: '1312' },
104
- * _viewTab: {
105
- * title: 'CMC-产品折扣新增',
106
- * uumsFunction: {
107
- * functionCode: 'CMC_FUNCTION_00002',
108
- * sourceSystem: 'CMC',
109
- * },
110
- * closeCurrentTab: true,
111
- * },
112
- * });
113
- *
114
- * // 替换原有代码示例:
115
- * // 原代码:
116
- * // if (top.viewTab) {
117
- * // let params = { sourceType: 'insert' };
118
- * // let url = location.origin + '/#/preferInfo?sourceType=insert';
119
- * // let tabUrl = top.Ext.urlAppend(url, 'isUap=true');
120
- * // top.closeTab(tabUrl, 'IFRAME');
121
- * // top.viewTab('CMC-产品折扣新增', url, 'iframe', params, { ... });
122
- * // } else {
123
- * // this.$router.push({ path: '/preferInfo', query: { sourceType: 'insert' } });
124
- * // }
125
- * //
126
- * // 新代码(自动适配):
127
- * router.depponPush({
128
- * path: '/preferInfo',
129
- * query: { sourceType: 'insert' },
130
- * params: { sourceType: 'insert' },
131
- * _viewTab: {
132
- * title: 'CMC-产品折扣新增',
133
- * uumsFunction: {
134
- * functionCode: 'CMC_FUNCTION_00002',
135
- * sourceSystem: 'CMC',
136
- * },
137
- * closeCurrentTab: true,
138
- * },
139
- * });
140
- */
141
- depponPush(location: Object | string, onComplete?: Function | undefined, onAbort?: Function | undefined): Promise<any>;
142
- };
1
+ export function createRouterUtils(router: any, defaultViewTab?: null): {
2
+ /**
3
+ * 包装后的 push 方法,自动应用默认的 _viewTab 配置
4
+ * @param {Object|String} location - 路由位置
5
+ * @param {Function} onComplete - 成功回调
6
+ * @param {Function} onAbort - 失败回调
7
+ */
8
+ push(location: Object | string, onComplete: Function, onAbort: Function): Promise<any>;
9
+ /**
10
+ * 安全的路由跳转(带错误处理)
11
+ * @param {Object|String} location - 路由位置
12
+ * @param {Function} onComplete - 成功回调
13
+ * @param {Function} onAbort - 失败回调
14
+ */
15
+ safePush(location: Object | string, onComplete: Function, onAbort: Function): any;
16
+ /**
17
+ * 安全的路由替换(带错误处理)
18
+ * @param {Object|String} location - 路由位置
19
+ * @param {Function} onComplete - 成功回调
20
+ * @param {Function} onAbort - 失败回调
21
+ */
22
+ safeReplace(location: Object | string, onComplete: Function, onAbort: Function): any;
23
+ /**
24
+ * 根据路由名称跳转
25
+ * @param {String} name - 路由名称
26
+ * @param {Object} params - 路由参数
27
+ * @param {Object} query - 查询参数
28
+ */
29
+ pushByName(name: string, params?: Object, query?: Object): any;
30
+ /**
31
+ * 根据路由路径跳转
32
+ * @param {String} path - 路由路径
33
+ * @param {Object} query - 查询参数
34
+ */
35
+ pushByPath(path: string, query?: Object): any;
36
+ /**
37
+ * 返回上一页
38
+ * @param {Number} delta - 返回的步数,默认为 1
39
+ */
40
+ goBack(delta?: number): void;
41
+ /**
42
+ * 关闭当前标签页
43
+ * @param {string} [url] - 标签页 URL(默认使用当前页面的 location.href)
44
+ * @param {string} [type='IFRAME'] - 标签页类型(默认:'IFRAME')
45
+ */
46
+ closeCurrentTab(url?: string | undefined, type?: string | undefined): void;
47
+ /**
48
+ * 检查路由是否存在(包括动态添加的路由)
49
+ * @param {String} name - 路由名称
50
+ * @returns {Boolean}
51
+ */
52
+ hasRoute(name: string): boolean;
53
+ /**
54
+ * 获取路由配置(包括动态添加的路由)
55
+ * @param {String} name - 路由名称
56
+ * @returns {Object|null}
57
+ */
58
+ getRouteConfig(name: string): Object | null;
59
+ /**
60
+ * 智能获取路由参数:在 iframe 环境中优先从父级获取,否则从当前路由 query 获取
61
+ * 与 depponPush 的参数获取逻辑保持一致
62
+ * @param {String} [key] - 参数键名,如果不提供则返回所有参数对象
63
+ * @returns {any} 参数值(如果提供了 key)或参数对象(如果未提供 key)
64
+ *
65
+ * @example
66
+ * // 获取所有参数
67
+ * const params = router.getQueryByRoute();
68
+ *
69
+ * // 获取指定参数
70
+ * const sourceType = router.getQueryByRoute('sourceType');
71
+ */
72
+ getQueryByRoute(key?: string | undefined): any;
73
+ /**
74
+ * 智能路由跳转:在 iframe 环境中自动使用 viewTab,否则使用 router.push
75
+ * 参数传递方式与 router.push 完全一致,在 iframe 环境中会自动适配 viewTab
76
+ * @param {Object|String} location - 路由位置(与 router.push 一致)
77
+ * - 如果是字符串:路径字符串,如 '/home' 或 '/home?id=1'
78
+ * - 如果是对象,可以包含以下属性:
79
+ * - path: 路径
80
+ * - name: 路由名称
81
+ * - params: 路由参数(在 iframe 环境中会传递给 viewTab 的 params)
82
+ * - query: 查询参数(会转换为 URL 的 query string)
83
+ * - _viewTab: viewTab 选项对象(可选,仅在 iframe 环境中生效)
84
+ * - title: 标签页标题(默认使用路由 meta.title 或 '新页面')
85
+ * - uumsFunction: UUMS 功能配置
86
+ * - functionCode: 功能代码
87
+ * - sourceSystem: 来源系统
88
+ * - closeCurrentTab: 是否关闭当前标签页(默认 false)
89
+ * @param {Function} [onComplete] - 成功回调(与 router.push 一致)
90
+ * @param {Function} [onAbort] - 失败回调(与 router.push 一致)
91
+ * @returns {Promise} 跳转 Promise
92
+ *
93
+ * @example
94
+ * // 基本用法(与 router.push 完全一致,在 iframe 环境中自动使用 viewTab)
95
+ * router.depponPush('/home');
96
+ * router.depponPush({ path: '/home', query: { id: 1 } });
97
+ * router.depponPush({ name: 'Home', params: { id: 1 } });
98
+ *
99
+ * // 在 iframe 环境中自定义 viewTab 选项
100
+ * router.depponPush({
101
+ * path: '/preferInfo',
102
+ * query: { sourceType: 'insert' },
103
+ * params: { custNumber: '701265308', preferId: '1312' },
104
+ * _viewTab: {
105
+ * title: 'CMC-产品折扣新增',
106
+ * uumsFunction: {
107
+ * functionCode: 'CMC_FUNCTION_00002',
108
+ * sourceSystem: 'CMC',
109
+ * },
110
+ * closeCurrentTab: true,
111
+ * },
112
+ * });
113
+ *
114
+ * // 替换原有代码示例:
115
+ * // 原代码:
116
+ * // if (top.viewTab) {
117
+ * // let params = { sourceType: 'insert' };
118
+ * // let url = location.origin + '/#/preferInfo?sourceType=insert';
119
+ * // let tabUrl = top.Ext.urlAppend(url, 'isUap=true');
120
+ * // top.closeTab(tabUrl, 'IFRAME');
121
+ * // top.viewTab('CMC-产品折扣新增', url, 'iframe', params, { ... });
122
+ * // } else {
123
+ * // this.$router.push({ path: '/preferInfo', query: { sourceType: 'insert' } });
124
+ * // }
125
+ * //
126
+ * // 新代码(自动适配):
127
+ * router.depponPush({
128
+ * path: '/preferInfo',
129
+ * query: { sourceType: 'insert' },
130
+ * params: { sourceType: 'insert' },
131
+ * _viewTab: {
132
+ * title: 'CMC-产品折扣新增',
133
+ * uumsFunction: {
134
+ * functionCode: 'CMC_FUNCTION_00002',
135
+ * sourceSystem: 'CMC',
136
+ * },
137
+ * closeCurrentTab: true,
138
+ * },
139
+ * });
140
+ */
141
+ depponPush(location: Object | string, onComplete?: Function | undefined, onAbort?: Function | undefined): Promise<any>;
142
+ };
package/es/vue.d.ts CHANGED
@@ -1,16 +1,16 @@
1
- declare namespace _default {
2
- export { install };
3
- }
4
- export default _default;
5
- /**
6
- * Vue 插件安装函数
7
- * @param {Object} app - Vue 应用实例
8
- * @param {Object|Array} options - 配置选项或路由配置数组
9
- * @param {Object} options.router - 已创建的 router 实例(如果提供,将直接使用)
10
- * @param {Array} options.routes - 路由配置数组
11
- * @param {Object} options.routerOptions - Vue Router 原始配置选项
12
- * @param {Object} options.guards - 路由守卫配置
13
- * @param {Object} options.log - 日志实例(可选,用于路由追踪)
14
- * @param {Function} options.onRouteChange - 路由变化回调(可选)
15
- */
16
- declare function install(app: Object, options?: Object | any[]): void;
1
+ declare namespace _default {
2
+ export { install };
3
+ }
4
+ export default _default;
5
+ /**
6
+ * Vue 插件安装函数
7
+ * @param {Object} app - Vue 应用实例
8
+ * @param {Object|Array} options - 配置选项或路由配置数组
9
+ * @param {Object} options.router - 已创建的 router 实例(如果提供,将直接使用)
10
+ * @param {Array} options.routes - 路由配置数组
11
+ * @param {Object} options.routerOptions - Vue Router 原始配置选项
12
+ * @param {Object} options.guards - 路由守卫配置
13
+ * @param {Object} options.log - 日志实例(可选,用于路由追踪)
14
+ * @param {Function} options.onRouteChange - 路由变化回调(可选)
15
+ */
16
+ declare function install(app: Object, options?: Object | any[]): void;
package/es/vue.js CHANGED
@@ -1,16 +1,16 @@
1
1
  import './_virtual/_rollup-plugin-inject-process-env.js';
2
2
  import { createDepponRouter } from './index.js';
3
3
 
4
- /**
5
- * Vue 插件安装函数
6
- * @param {Object} app - Vue 应用实例
7
- * @param {Object|Array} options - 配置选项或路由配置数组
8
- * @param {Object} options.router - 已创建的 router 实例(如果提供,将直接使用)
9
- * @param {Array} options.routes - 路由配置数组
10
- * @param {Object} options.routerOptions - Vue Router 原始配置选项
11
- * @param {Object} options.guards - 路由守卫配置
12
- * @param {Object} options.log - 日志实例(可选,用于路由追踪)
13
- * @param {Function} options.onRouteChange - 路由变化回调(可选)
4
+ /**
5
+ * Vue 插件安装函数
6
+ * @param {Object} app - Vue 应用实例
7
+ * @param {Object|Array} options - 配置选项或路由配置数组
8
+ * @param {Object} options.router - 已创建的 router 实例(如果提供,将直接使用)
9
+ * @param {Array} options.routes - 路由配置数组
10
+ * @param {Object} options.routerOptions - Vue Router 原始配置选项
11
+ * @param {Object} options.guards - 路由守卫配置
12
+ * @param {Object} options.log - 日志实例(可选,用于路由追踪)
13
+ * @param {Function} options.onRouteChange - 路由变化回调(可选)
14
14
  */
15
15
  function install(app) {
16
16
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deppon/deppon-router",
3
- "version": "2.2.1",
3
+ "version": "2.2.2",
4
4
  "description": "Vue Router 4 wrapper package",
5
5
  "license": "MIT",
6
6
  "homepage": "",