├── .browserslistrc
├── .gitignore
├── LICENSE
├── README.md
├── babel.config.js
├── dist
├── vue-page-stack-router.common.js
├── vue-page-stack-router.esm.js
└── vue-page-stack-router.js
├── package.json
├── pnpm-lock.yaml
├── rollup.config.js
├── src
├── components
│ └── PageStackRouterView.vue
├── history
│ └── common.js
├── index.js
├── injectionSymbols.js
├── pageStackRouter.js
├── scrollBehavior.js
├── useApi.js
└── utils
│ ├── index.js
│ └── scroll.js
└── types
└── index.d.ts
/.browserslistrc:
--------------------------------------------------------------------------------
1 | Chrome >= 51
2 | iOS >= 10
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 |
4 | # Editor directories and files
5 | .idea
6 | *.suo
7 | *.ntvs*
8 | *.njsproj
9 | *.sln
10 | *.7z
11 | *.zip
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Joeshu
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 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # vue-page-stack-router
2 |
3 | > vue-page-stack-router 是一个 [Vue.js](https://vuejs.org/) 的页面栈路由管理器,支持 Vue 2 和 Vue 3
4 |
5 | ## 功能特性
6 |
7 | - 针对移动端 web 而设计
8 | - 类似原生 APP 应用,小程序应用的导航体验,即前进刷新后退不刷新
9 | - 保存滚动位置(默认为 `true`),在离开该页面时自动保存滚动位置,待返回后恢复保存的滚动位置
10 |
11 | ## 版本提示
12 |
13 | 你当前浏览的是 **vue-page-stack-router 3.x 版本** 的文档,适用于 Vue 3 开发。如果你在使用 Vue 2,请浏览 [vue-page-stack-router@2 文档](https://github.com/JoeshuTT/vue-page-stack-router/tree/v2)。
14 |
15 | ## 🔥 例子
16 |
17 | - 线上案例,可查看 [v-shop 商城](https://github.com/JoeshuTT/v-shop)
18 |
19 | ## 安装
20 |
21 | ```shell
22 | # Vue 3 项目,安装
23 | npm install vue-page-stack-router --save
24 | # Vue 2 项目,安装
25 | npm install vue-page-stack-router@2 --save
26 | ```
27 |
28 | ## 浏览器支持
29 | `vue-page-stack-router 3.x` 支持现代浏览器以及 Chrome >= 51、iOS >= 10.0(与 Vue 3 一致)。
30 |
31 | ## 使用
32 |
33 | **main.js**
34 |
35 | ```js
36 | import { createApp } from 'vue';
37 | import App from './App.vue';
38 | import { router } from './router';
39 | import { createPageStackRouter } from 'vue-page-stack-router';
40 |
41 | // app
42 | const app = createApp(App);
43 |
44 | // pageStackRouter
45 | const pageStackRouter = createPageStackRouter({ router });
46 |
47 | app.use(router);
48 | app.use(pageStackRouter);
49 | app.mount('#app');
50 | ```
51 |
52 | **App.vue**
53 |
54 | ```vue
55 |
56 |
59 |
60 | ```
61 |
62 | **routes.js**
63 |
64 | ```js
65 | import { createRouter, createWebHashHistory } from "vue-router";
66 |
67 | export const router = createRouter({
68 | history: createWebHashHistory(),
69 | routes: [
70 | {
71 | path: "/",
72 | redirect: "/home",
73 | },
74 | {
75 | path: "/home",
76 | name: "Home", // 与组件 name 保持一致
77 | component: () => import("@/views/home/index.vue"),
78 | meta: {
79 | title: "首页",
80 | },
81 | },
82 | {
83 | path: "/good/detail",
84 | name: "GoodDetail", // 与组件 name 保持一致
85 | component: () => import("@/views/good/detail.vue"),
86 | meta: {
87 | title: "商品详情",
88 | },
89 | },
90 | ],
91 | });
92 | ```
93 |
94 | ## API
95 |
96 | `VuePageStackRouter` 插件参数说明:
97 |
98 | | 参数 | 说明 | 类型 | 默认值 |
99 | | ------------------------- | ---------------------------- | --------- | ------ |
100 | | router | vue-router 实例 | `object` | - |
101 | | el | Vue 应用实例挂载容器元素 | `string` | '#app' |
102 | | max | 最多可以缓存多少页面组件实例 | `number` | 10 |
103 | | disableSaveScrollPosition | 禁用自动保存滚动位置 | `boolean` | false |
104 |
105 | ## 配置路由元信息(可选)
106 |
107 | 可以根据业务需要,自定义配置路由的 `meta` 字段:
108 |
109 | ```js
110 | {
111 | path: '/login',
112 | name: 'login',
113 | component: () => import('@/views/login/index.vue'),
114 | meta: {
115 | title: '登录',
116 | // `keepAlive`字段,是否参与页面栈导航。默认全部参与
117 | keepAlive: true,
118 | // `scrollingElement`字段,手动指定页面内滚动容器元素。默认查询全部
119 | scrollingElement: [".list-scroller", ".header-bd-radio-group"],
120 | // `disableSaveScrollPosition`字段,禁用自动保存滚动位置。默认为 `false`
121 | disableSaveScrollPosition: false,
122 | },
123 | },
124 | ```
125 |
126 | ## 使用注意
127 |
128 | 1. 路由的`name`和组件的`name`都需要设置成一样,缓存才会生效。
129 | 2. 只支持一级路由,不支持嵌套路由。
130 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | presets: [["@babel/preset-env", { modules: false }]],
3 | };
4 |
--------------------------------------------------------------------------------
/dist/vue-page-stack-router.common.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * vue-page-stack-router v3.2.6
3 | * (c) 2022-2023 JoeshuTT
4 | * Released under the MIT License.
5 | */
6 | 'use strict';
7 |
8 | var vue = require('vue');
9 |
10 | /**
11 | *
12 | * @internal
13 | */
14 | var pageStackRouterKey = Symbol("page stack router");
15 |
16 | /**
17 | *
18 | * @internal
19 | */
20 | var pageStackRouteKey = Symbol("page stack route");
21 |
22 | /**
23 | *
24 | * @internal
25 | */
26 | var pageStackListKey = Symbol("page stack list");
27 |
28 | /**
29 | * 返回 PageStackRouter 实例
30 | */
31 | function usePageStackRouter() {
32 | return vue.inject(pageStackRouterKey);
33 | }
34 |
35 | /**
36 | * 返回 PageStackRouter 当前页面
37 | */
38 | function usePageStackRoute() {
39 | return vue.inject(pageStackRouteKey);
40 | }
41 |
42 | /**
43 | * 返回 PageStackRouter 页面栈列表
44 | */
45 | function usePageStackList() {
46 | return vue.inject(pageStackListKey);
47 | }
48 |
49 | var version = "3.2.6";
50 |
51 | var script = {
52 | name: "PageStackRouterView",
53 | setup() {
54 | const pageStackList = usePageStackList();
55 | const cachedViews = vue.computed(() => pageStackList.map((v) => v.name));
56 |
57 | return {
58 | pageStackList,
59 | cachedViews,
60 | };
61 | },
62 | };
63 |
64 | function render(_ctx, _cache, $props, $setup, $data, $options) {
65 | const _component_router_view = vue.resolveComponent("router-view");
66 |
67 | return (vue.openBlock(), vue.createBlock(_component_router_view, null, {
68 | default: vue.withCtx(({ Component, route }) => [
69 | (vue.openBlock(), vue.createBlock(vue.KeepAlive, { include: $setup.cachedViews }, [
70 | (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(Component), {
71 | key: route.fullPath
72 | }))
73 | ], 1032 /* PROPS, DYNAMIC_SLOTS */, ["include"]))
74 | ]),
75 | _: 1 /* STABLE */
76 | }))
77 | }
78 |
79 | script.render = render;
80 | script.__file = "src/components/PageStackRouterView.vue";
81 |
82 | /**
83 | * 路由跳转,对应着栈的三种操作方式
84 | */
85 | var navigationType = {
86 | pop: "pop",
87 | push: "push",
88 | replace: "replace"
89 | };
90 |
91 | /**
92 | * 路由导航方向
93 | */
94 | var navigationDirection = {
95 | back: "back",
96 | forward: "forward",
97 | unknown: ""
98 | };
99 |
100 | /**
101 | * 是否是滚动元素
102 | * @param {Element} node
103 | */
104 | function isScrollableNode(node) {
105 | if (!node) {
106 | return false;
107 | }
108 | var overflowScrollReg = /scroll|auto/i;
109 | var {
110 | overflow
111 | } = window.getComputedStyle(node);
112 | return overflowScrollReg.test(overflow);
113 | }
114 |
115 | /**
116 | * 获取手动标记的滚动元素的集合
117 | * @param {string | string[]} el
118 | */
119 | function getManualScrollingNodes(el) {
120 | var elementList = Array.isArray(el) ? [...el] : [...[el]];
121 | return [...new Set(elementList)].map(v => document.querySelector(v));
122 | }
123 |
124 | var body = document.body;
125 | var screenScrollingElement = document.documentElement;
126 | var scrollPositions = new Map();
127 |
128 | /**
129 | * 保存该页面下各个滚动元素的滚动位置
130 | */
131 | function saveScrollPosition(from) {
132 | var appRoot = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "#app";
133 | // DOM 操作有风险,try catch 护体
134 | try {
135 | var _from$meta;
136 | var screenNodeList = [screenScrollingElement, body]; // 屏幕滚动容器元素
137 | var appRootNode = document.querySelector(appRoot); // Vue 应用实例挂载容器元素
138 | var pageNodeList = [];
139 | if ((_from$meta = from.meta) !== null && _from$meta !== void 0 && _from$meta.scrollingElement) {
140 | pageNodeList = [appRootNode, ...getManualScrollingNodes(from.meta.scrollingElement)];
141 | } else {
142 | pageNodeList = [appRootNode, ...appRootNode.querySelectorAll("*")];
143 | }
144 | // prettier-ignore
145 | var scrollableNodeList = [...screenNodeList, ...pageNodeList].filter(isScrollableNode);
146 | var saver = scrollableNodeList.map(node => [node, {
147 | left: node.scrollLeft,
148 | top: node.scrollTop
149 | }]);
150 | var scrollKey = from.fullPath;
151 | scrollPositions.set(scrollKey, saver);
152 | } catch (err) {
153 | console.error("[pageStack saveScrollPosition]", err);
154 | }
155 | }
156 | function getSavedScrollPosition(key) {
157 | var scroll = scrollPositions.get(key);
158 | scrollPositions.delete(key);
159 | return scroll;
160 | }
161 |
162 | /**
163 | * 恢复该页面下各个滚动元素的滚动位置
164 | */
165 | function revertScrollPosition(to) {
166 | var scrollKey = to.fullPath;
167 | var scrollPosition = getSavedScrollPosition(scrollKey);
168 | if (scrollPosition) {
169 | // DOM 操作有风险,try catch 护体
170 | try {
171 | vue.nextTick(() => {
172 | scrollPosition.forEach(_ref => {
173 | var [node, {
174 | left,
175 | top
176 | }] = _ref;
177 | left && (node.scrollLeft = left);
178 | top && (node.scrollTop = top);
179 | });
180 | });
181 | } catch (err) {
182 | console.error("[pageStack revertScrollPosition]", err);
183 | }
184 | }
185 | }
186 |
187 | /**
188 | * 是否有值
189 | * @param {*} val
190 | */
191 | function isDef(val) {
192 | return val !== undefined && val !== null;
193 | }
194 |
195 | /**
196 | * 根据 key 获取对应路由元信息字段值,值默认为 `true`
197 | */
198 | function getRouteMetaValue(key) {
199 | var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
200 | var meta = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
201 | var value = meta[key];
202 | if (!isDef(value)) {
203 | value = defaultValue;
204 | }
205 | return value;
206 | }
207 |
208 | function createPageStackRouter(options) {
209 | var currentPage = vue.reactive({});
210 | var pageStackList = vue.reactive([]);
211 | var {
212 | router,
213 | el = "#app",
214 | max = 10,
215 | disableSaveScrollPosition = false
216 | } = options;
217 | if (!router) {
218 | throw new Error("vue-router \u5B9E\u4F8B\u5FC5\u987B\u5B58\u5728\uFF01");
219 | }
220 | function navigate(to, from) {
221 | var toLocation = getRouteInfo(to);
222 | var fromLocation = getRouteInfo(from);
223 | if (toLocation.meta.keepAlive) {
224 | var historyState = window.history.state;
225 | var lastPageState = pageStackList.length ? pageStackList[pageStackList.length - 1].state : null;
226 | var delta = lastPageState ? historyState.position - lastPageState.position : 0;
227 |
228 | // 在浏览器环境中,浏览器的后退等同于 pop ,前进等同于 push
229 | if (delta > 0) {
230 | toLocation.navigationType = navigationType.push;
231 | toLocation.navigationDirection = navigationDirection.forward;
232 | push(toLocation);
233 | !fromLocation.meta.disableSaveScrollPosition && saveScrollPosition(fromLocation, el);
234 | } else if (delta < 0) {
235 | toLocation.navigationType = navigationType.pop;
236 | toLocation.navigationDirection = navigationDirection.back;
237 | pop();
238 | var index = getIndexByName(toLocation.name);
239 | if (~index) {
240 | !toLocation.meta.disableSaveScrollPosition && revertScrollPosition(toLocation);
241 | }
242 | } else {
243 | toLocation.navigationType = navigationType.replace;
244 | toLocation.navigationDirection = navigationDirection.unknown;
245 | replace(toLocation);
246 | }
247 | }
248 | Object.keys(toLocation).forEach(key => {
249 | currentPage[key] = toLocation[key];
250 | });
251 | }
252 |
253 | /**
254 | * push 方法会在当前栈顶推入一个页面
255 | */
256 | function push(location) {
257 | if (pageStackList.length >= max) {
258 | pageStackList.splice(0, 1);
259 | }
260 | pageStackList.push(location);
261 | }
262 |
263 | /**
264 | * pop 方法会推出栈顶的一个页面
265 | */
266 | function pop() {
267 | pageStackList.splice(pageStackList.length - 1);
268 | }
269 |
270 | /**
271 | * replace 方法会替换当前栈顶的页面
272 | */
273 | function replace(location) {
274 | var index = getIndexByName(location.name);
275 | if (~index) {
276 | pageStackList.splice(index + 1);
277 | } else {
278 | pageStackList.length && pageStackList.splice(pageStackList.length - 1);
279 | pageStackList.push(location);
280 | }
281 | }
282 | function getIndexByName(name) {
283 | return pageStackList.findIndex(v => v.name === name);
284 | }
285 | function getRouteInfo(location) {
286 | var historyState = window.history.state;
287 | return {
288 | name: location.name,
289 | path: location.path,
290 | fullPath: location.fullPath,
291 | meta: Object.assign({}, location.meta, {
292 | keepAlive: getRouteMetaValue("keepAlive", true, location.meta),
293 | disableSaveScrollPosition: getRouteMetaValue("disableSaveScrollPosition", disableSaveScrollPosition, location.meta)
294 | }),
295 | state: historyState,
296 | navigationType: "",
297 | navigationDirection: ""
298 | };
299 | }
300 | var pageStackRouter = {
301 | version,
302 | pageStackList,
303 | currentPage,
304 | install(app) {
305 | // eslint-disable-next-line @typescript-eslint/no-this-alias
306 | var pageStackRouter = this;
307 | router.afterEach((to, from) => {
308 | if (to.name) {
309 | navigate(to, from);
310 | }
311 | });
312 | app.component("PageStackRouterView", script);
313 | app.provide(pageStackRouterKey, pageStackRouter);
314 | app.provide(pageStackRouteKey, currentPage);
315 | app.provide(pageStackListKey, pageStackList);
316 | }
317 | };
318 | return pageStackRouter;
319 | }
320 |
321 | exports.createPageStackRouter = createPageStackRouter;
322 | exports.pageStackListKey = pageStackListKey;
323 | exports.pageStackRouteKey = pageStackRouteKey;
324 | exports.pageStackRouterKey = pageStackRouterKey;
325 | exports.usePageStackList = usePageStackList;
326 | exports.usePageStackRoute = usePageStackRoute;
327 | exports.usePageStackRouter = usePageStackRouter;
328 |
--------------------------------------------------------------------------------
/dist/vue-page-stack-router.esm.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * vue-page-stack-router v3.2.6
3 | * (c) 2022-2023 JoeshuTT
4 | * Released under the MIT License.
5 | */
6 | import { inject, computed, resolveComponent, openBlock, createBlock, withCtx, KeepAlive, resolveDynamicComponent, nextTick, reactive } from 'vue';
7 |
8 | /**
9 | *
10 | * @internal
11 | */
12 | var pageStackRouterKey = Symbol("page stack router");
13 |
14 | /**
15 | *
16 | * @internal
17 | */
18 | var pageStackRouteKey = Symbol("page stack route");
19 |
20 | /**
21 | *
22 | * @internal
23 | */
24 | var pageStackListKey = Symbol("page stack list");
25 |
26 | /**
27 | * 返回 PageStackRouter 实例
28 | */
29 | function usePageStackRouter() {
30 | return inject(pageStackRouterKey);
31 | }
32 |
33 | /**
34 | * 返回 PageStackRouter 当前页面
35 | */
36 | function usePageStackRoute() {
37 | return inject(pageStackRouteKey);
38 | }
39 |
40 | /**
41 | * 返回 PageStackRouter 页面栈列表
42 | */
43 | function usePageStackList() {
44 | return inject(pageStackListKey);
45 | }
46 |
47 | var version = "3.2.6";
48 |
49 | var script = {
50 | name: "PageStackRouterView",
51 | setup() {
52 | const pageStackList = usePageStackList();
53 | const cachedViews = computed(() => pageStackList.map((v) => v.name));
54 |
55 | return {
56 | pageStackList,
57 | cachedViews,
58 | };
59 | },
60 | };
61 |
62 | function render(_ctx, _cache, $props, $setup, $data, $options) {
63 | const _component_router_view = resolveComponent("router-view");
64 |
65 | return (openBlock(), createBlock(_component_router_view, null, {
66 | default: withCtx(({ Component, route }) => [
67 | (openBlock(), createBlock(KeepAlive, { include: $setup.cachedViews }, [
68 | (openBlock(), createBlock(resolveDynamicComponent(Component), {
69 | key: route.fullPath
70 | }))
71 | ], 1032 /* PROPS, DYNAMIC_SLOTS */, ["include"]))
72 | ]),
73 | _: 1 /* STABLE */
74 | }))
75 | }
76 |
77 | script.render = render;
78 | script.__file = "src/components/PageStackRouterView.vue";
79 |
80 | /**
81 | * 路由跳转,对应着栈的三种操作方式
82 | */
83 | var navigationType = {
84 | pop: "pop",
85 | push: "push",
86 | replace: "replace"
87 | };
88 |
89 | /**
90 | * 路由导航方向
91 | */
92 | var navigationDirection = {
93 | back: "back",
94 | forward: "forward",
95 | unknown: ""
96 | };
97 |
98 | /**
99 | * 是否是滚动元素
100 | * @param {Element} node
101 | */
102 | function isScrollableNode(node) {
103 | if (!node) {
104 | return false;
105 | }
106 | var overflowScrollReg = /scroll|auto/i;
107 | var {
108 | overflow
109 | } = window.getComputedStyle(node);
110 | return overflowScrollReg.test(overflow);
111 | }
112 |
113 | /**
114 | * 获取手动标记的滚动元素的集合
115 | * @param {string | string[]} el
116 | */
117 | function getManualScrollingNodes(el) {
118 | var elementList = Array.isArray(el) ? [...el] : [...[el]];
119 | return [...new Set(elementList)].map(v => document.querySelector(v));
120 | }
121 |
122 | var body = document.body;
123 | var screenScrollingElement = document.documentElement;
124 | var scrollPositions = new Map();
125 |
126 | /**
127 | * 保存该页面下各个滚动元素的滚动位置
128 | */
129 | function saveScrollPosition(from) {
130 | var appRoot = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "#app";
131 | // DOM 操作有风险,try catch 护体
132 | try {
133 | var _from$meta;
134 | var screenNodeList = [screenScrollingElement, body]; // 屏幕滚动容器元素
135 | var appRootNode = document.querySelector(appRoot); // Vue 应用实例挂载容器元素
136 | var pageNodeList = [];
137 | if ((_from$meta = from.meta) !== null && _from$meta !== void 0 && _from$meta.scrollingElement) {
138 | pageNodeList = [appRootNode, ...getManualScrollingNodes(from.meta.scrollingElement)];
139 | } else {
140 | pageNodeList = [appRootNode, ...appRootNode.querySelectorAll("*")];
141 | }
142 | // prettier-ignore
143 | var scrollableNodeList = [...screenNodeList, ...pageNodeList].filter(isScrollableNode);
144 | var saver = scrollableNodeList.map(node => [node, {
145 | left: node.scrollLeft,
146 | top: node.scrollTop
147 | }]);
148 | var scrollKey = from.fullPath;
149 | scrollPositions.set(scrollKey, saver);
150 | } catch (err) {
151 | console.error("[pageStack saveScrollPosition]", err);
152 | }
153 | }
154 | function getSavedScrollPosition(key) {
155 | var scroll = scrollPositions.get(key);
156 | scrollPositions.delete(key);
157 | return scroll;
158 | }
159 |
160 | /**
161 | * 恢复该页面下各个滚动元素的滚动位置
162 | */
163 | function revertScrollPosition(to) {
164 | var scrollKey = to.fullPath;
165 | var scrollPosition = getSavedScrollPosition(scrollKey);
166 | if (scrollPosition) {
167 | // DOM 操作有风险,try catch 护体
168 | try {
169 | nextTick(() => {
170 | scrollPosition.forEach(_ref => {
171 | var [node, {
172 | left,
173 | top
174 | }] = _ref;
175 | left && (node.scrollLeft = left);
176 | top && (node.scrollTop = top);
177 | });
178 | });
179 | } catch (err) {
180 | console.error("[pageStack revertScrollPosition]", err);
181 | }
182 | }
183 | }
184 |
185 | /**
186 | * 是否有值
187 | * @param {*} val
188 | */
189 | function isDef(val) {
190 | return val !== undefined && val !== null;
191 | }
192 |
193 | /**
194 | * 根据 key 获取对应路由元信息字段值,值默认为 `true`
195 | */
196 | function getRouteMetaValue(key) {
197 | var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
198 | var meta = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
199 | var value = meta[key];
200 | if (!isDef(value)) {
201 | value = defaultValue;
202 | }
203 | return value;
204 | }
205 |
206 | function createPageStackRouter(options) {
207 | var currentPage = reactive({});
208 | var pageStackList = reactive([]);
209 | var {
210 | router,
211 | el = "#app",
212 | max = 10,
213 | disableSaveScrollPosition = false
214 | } = options;
215 | if (!router) {
216 | throw new Error("vue-router \u5B9E\u4F8B\u5FC5\u987B\u5B58\u5728\uFF01");
217 | }
218 | function navigate(to, from) {
219 | var toLocation = getRouteInfo(to);
220 | var fromLocation = getRouteInfo(from);
221 | if (toLocation.meta.keepAlive) {
222 | var historyState = window.history.state;
223 | var lastPageState = pageStackList.length ? pageStackList[pageStackList.length - 1].state : null;
224 | var delta = lastPageState ? historyState.position - lastPageState.position : 0;
225 |
226 | // 在浏览器环境中,浏览器的后退等同于 pop ,前进等同于 push
227 | if (delta > 0) {
228 | toLocation.navigationType = navigationType.push;
229 | toLocation.navigationDirection = navigationDirection.forward;
230 | push(toLocation);
231 | !fromLocation.meta.disableSaveScrollPosition && saveScrollPosition(fromLocation, el);
232 | } else if (delta < 0) {
233 | toLocation.navigationType = navigationType.pop;
234 | toLocation.navigationDirection = navigationDirection.back;
235 | pop();
236 | var index = getIndexByName(toLocation.name);
237 | if (~index) {
238 | !toLocation.meta.disableSaveScrollPosition && revertScrollPosition(toLocation);
239 | }
240 | } else {
241 | toLocation.navigationType = navigationType.replace;
242 | toLocation.navigationDirection = navigationDirection.unknown;
243 | replace(toLocation);
244 | }
245 | }
246 | Object.keys(toLocation).forEach(key => {
247 | currentPage[key] = toLocation[key];
248 | });
249 | }
250 |
251 | /**
252 | * push 方法会在当前栈顶推入一个页面
253 | */
254 | function push(location) {
255 | if (pageStackList.length >= max) {
256 | pageStackList.splice(0, 1);
257 | }
258 | pageStackList.push(location);
259 | }
260 |
261 | /**
262 | * pop 方法会推出栈顶的一个页面
263 | */
264 | function pop() {
265 | pageStackList.splice(pageStackList.length - 1);
266 | }
267 |
268 | /**
269 | * replace 方法会替换当前栈顶的页面
270 | */
271 | function replace(location) {
272 | var index = getIndexByName(location.name);
273 | if (~index) {
274 | pageStackList.splice(index + 1);
275 | } else {
276 | pageStackList.length && pageStackList.splice(pageStackList.length - 1);
277 | pageStackList.push(location);
278 | }
279 | }
280 | function getIndexByName(name) {
281 | return pageStackList.findIndex(v => v.name === name);
282 | }
283 | function getRouteInfo(location) {
284 | var historyState = window.history.state;
285 | return {
286 | name: location.name,
287 | path: location.path,
288 | fullPath: location.fullPath,
289 | meta: Object.assign({}, location.meta, {
290 | keepAlive: getRouteMetaValue("keepAlive", true, location.meta),
291 | disableSaveScrollPosition: getRouteMetaValue("disableSaveScrollPosition", disableSaveScrollPosition, location.meta)
292 | }),
293 | state: historyState,
294 | navigationType: "",
295 | navigationDirection: ""
296 | };
297 | }
298 | var pageStackRouter = {
299 | version,
300 | pageStackList,
301 | currentPage,
302 | install(app) {
303 | // eslint-disable-next-line @typescript-eslint/no-this-alias
304 | var pageStackRouter = this;
305 | router.afterEach((to, from) => {
306 | if (to.name) {
307 | navigate(to, from);
308 | }
309 | });
310 | app.component("PageStackRouterView", script);
311 | app.provide(pageStackRouterKey, pageStackRouter);
312 | app.provide(pageStackRouteKey, currentPage);
313 | app.provide(pageStackListKey, pageStackList);
314 | }
315 | };
316 | return pageStackRouter;
317 | }
318 |
319 | export { createPageStackRouter, pageStackListKey, pageStackRouteKey, pageStackRouterKey, usePageStackList, usePageStackRoute, usePageStackRouter };
320 |
--------------------------------------------------------------------------------
/dist/vue-page-stack-router.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * vue-page-stack-router v3.2.6
3 | * (c) 2022-2023 JoeshuTT
4 | * Released under the MIT License.
5 | */
6 | (function (global, factory) {
7 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('vue')) :
8 | typeof define === 'function' && define.amd ? define(['exports', 'vue'], factory) :
9 | (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.VuePageStackRouter = {}, global.Vue));
10 | })(this, (function (exports, vue) { 'use strict';
11 |
12 | /**
13 | *
14 | * @internal
15 | */
16 | var pageStackRouterKey = Symbol("page stack router");
17 |
18 | /**
19 | *
20 | * @internal
21 | */
22 | var pageStackRouteKey = Symbol("page stack route");
23 |
24 | /**
25 | *
26 | * @internal
27 | */
28 | var pageStackListKey = Symbol("page stack list");
29 |
30 | /**
31 | * 返回 PageStackRouter 实例
32 | */
33 | function usePageStackRouter() {
34 | return vue.inject(pageStackRouterKey);
35 | }
36 |
37 | /**
38 | * 返回 PageStackRouter 当前页面
39 | */
40 | function usePageStackRoute() {
41 | return vue.inject(pageStackRouteKey);
42 | }
43 |
44 | /**
45 | * 返回 PageStackRouter 页面栈列表
46 | */
47 | function usePageStackList() {
48 | return vue.inject(pageStackListKey);
49 | }
50 |
51 | var version = "3.2.6";
52 |
53 | var script = {
54 | name: "PageStackRouterView",
55 | setup() {
56 | const pageStackList = usePageStackList();
57 | const cachedViews = vue.computed(() => pageStackList.map((v) => v.name));
58 |
59 | return {
60 | pageStackList,
61 | cachedViews,
62 | };
63 | },
64 | };
65 |
66 | function render(_ctx, _cache, $props, $setup, $data, $options) {
67 | const _component_router_view = vue.resolveComponent("router-view");
68 |
69 | return (vue.openBlock(), vue.createBlock(_component_router_view, null, {
70 | default: vue.withCtx(({ Component, route }) => [
71 | (vue.openBlock(), vue.createBlock(vue.KeepAlive, { include: $setup.cachedViews }, [
72 | (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(Component), {
73 | key: route.fullPath
74 | }))
75 | ], 1032 /* PROPS, DYNAMIC_SLOTS */, ["include"]))
76 | ]),
77 | _: 1 /* STABLE */
78 | }))
79 | }
80 |
81 | script.render = render;
82 | script.__file = "src/components/PageStackRouterView.vue";
83 |
84 | /**
85 | * 路由跳转,对应着栈的三种操作方式
86 | */
87 | var navigationType = {
88 | pop: "pop",
89 | push: "push",
90 | replace: "replace"
91 | };
92 |
93 | /**
94 | * 路由导航方向
95 | */
96 | var navigationDirection = {
97 | back: "back",
98 | forward: "forward",
99 | unknown: ""
100 | };
101 |
102 | /**
103 | * 是否是滚动元素
104 | * @param {Element} node
105 | */
106 | function isScrollableNode(node) {
107 | if (!node) {
108 | return false;
109 | }
110 | var overflowScrollReg = /scroll|auto/i;
111 | var {
112 | overflow
113 | } = window.getComputedStyle(node);
114 | return overflowScrollReg.test(overflow);
115 | }
116 |
117 | /**
118 | * 获取手动标记的滚动元素的集合
119 | * @param {string | string[]} el
120 | */
121 | function getManualScrollingNodes(el) {
122 | var elementList = Array.isArray(el) ? [...el] : [...[el]];
123 | return [...new Set(elementList)].map(v => document.querySelector(v));
124 | }
125 |
126 | var body = document.body;
127 | var screenScrollingElement = document.documentElement;
128 | var scrollPositions = new Map();
129 |
130 | /**
131 | * 保存该页面下各个滚动元素的滚动位置
132 | */
133 | function saveScrollPosition(from) {
134 | var appRoot = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "#app";
135 | // DOM 操作有风险,try catch 护体
136 | try {
137 | var _from$meta;
138 | var screenNodeList = [screenScrollingElement, body]; // 屏幕滚动容器元素
139 | var appRootNode = document.querySelector(appRoot); // Vue 应用实例挂载容器元素
140 | var pageNodeList = [];
141 | if ((_from$meta = from.meta) !== null && _from$meta !== void 0 && _from$meta.scrollingElement) {
142 | pageNodeList = [appRootNode, ...getManualScrollingNodes(from.meta.scrollingElement)];
143 | } else {
144 | pageNodeList = [appRootNode, ...appRootNode.querySelectorAll("*")];
145 | }
146 | // prettier-ignore
147 | var scrollableNodeList = [...screenNodeList, ...pageNodeList].filter(isScrollableNode);
148 | var saver = scrollableNodeList.map(node => [node, {
149 | left: node.scrollLeft,
150 | top: node.scrollTop
151 | }]);
152 | var scrollKey = from.fullPath;
153 | scrollPositions.set(scrollKey, saver);
154 | } catch (err) {
155 | console.error("[pageStack saveScrollPosition]", err);
156 | }
157 | }
158 | function getSavedScrollPosition(key) {
159 | var scroll = scrollPositions.get(key);
160 | scrollPositions.delete(key);
161 | return scroll;
162 | }
163 |
164 | /**
165 | * 恢复该页面下各个滚动元素的滚动位置
166 | */
167 | function revertScrollPosition(to) {
168 | var scrollKey = to.fullPath;
169 | var scrollPosition = getSavedScrollPosition(scrollKey);
170 | if (scrollPosition) {
171 | // DOM 操作有风险,try catch 护体
172 | try {
173 | vue.nextTick(() => {
174 | scrollPosition.forEach(_ref => {
175 | var [node, {
176 | left,
177 | top
178 | }] = _ref;
179 | left && (node.scrollLeft = left);
180 | top && (node.scrollTop = top);
181 | });
182 | });
183 | } catch (err) {
184 | console.error("[pageStack revertScrollPosition]", err);
185 | }
186 | }
187 | }
188 |
189 | /**
190 | * 是否有值
191 | * @param {*} val
192 | */
193 | function isDef(val) {
194 | return val !== undefined && val !== null;
195 | }
196 |
197 | /**
198 | * 根据 key 获取对应路由元信息字段值,值默认为 `true`
199 | */
200 | function getRouteMetaValue(key) {
201 | var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
202 | var meta = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
203 | var value = meta[key];
204 | if (!isDef(value)) {
205 | value = defaultValue;
206 | }
207 | return value;
208 | }
209 |
210 | function createPageStackRouter(options) {
211 | var currentPage = vue.reactive({});
212 | var pageStackList = vue.reactive([]);
213 | var {
214 | router,
215 | el = "#app",
216 | max = 10,
217 | disableSaveScrollPosition = false
218 | } = options;
219 | if (!router) {
220 | throw new Error("vue-router \u5B9E\u4F8B\u5FC5\u987B\u5B58\u5728\uFF01");
221 | }
222 | function navigate(to, from) {
223 | var toLocation = getRouteInfo(to);
224 | var fromLocation = getRouteInfo(from);
225 | if (toLocation.meta.keepAlive) {
226 | var historyState = window.history.state;
227 | var lastPageState = pageStackList.length ? pageStackList[pageStackList.length - 1].state : null;
228 | var delta = lastPageState ? historyState.position - lastPageState.position : 0;
229 |
230 | // 在浏览器环境中,浏览器的后退等同于 pop ,前进等同于 push
231 | if (delta > 0) {
232 | toLocation.navigationType = navigationType.push;
233 | toLocation.navigationDirection = navigationDirection.forward;
234 | push(toLocation);
235 | !fromLocation.meta.disableSaveScrollPosition && saveScrollPosition(fromLocation, el);
236 | } else if (delta < 0) {
237 | toLocation.navigationType = navigationType.pop;
238 | toLocation.navigationDirection = navigationDirection.back;
239 | pop();
240 | var index = getIndexByName(toLocation.name);
241 | if (~index) {
242 | !toLocation.meta.disableSaveScrollPosition && revertScrollPosition(toLocation);
243 | }
244 | } else {
245 | toLocation.navigationType = navigationType.replace;
246 | toLocation.navigationDirection = navigationDirection.unknown;
247 | replace(toLocation);
248 | }
249 | }
250 | Object.keys(toLocation).forEach(key => {
251 | currentPage[key] = toLocation[key];
252 | });
253 | }
254 |
255 | /**
256 | * push 方法会在当前栈顶推入一个页面
257 | */
258 | function push(location) {
259 | if (pageStackList.length >= max) {
260 | pageStackList.splice(0, 1);
261 | }
262 | pageStackList.push(location);
263 | }
264 |
265 | /**
266 | * pop 方法会推出栈顶的一个页面
267 | */
268 | function pop() {
269 | pageStackList.splice(pageStackList.length - 1);
270 | }
271 |
272 | /**
273 | * replace 方法会替换当前栈顶的页面
274 | */
275 | function replace(location) {
276 | var index = getIndexByName(location.name);
277 | if (~index) {
278 | pageStackList.splice(index + 1);
279 | } else {
280 | pageStackList.length && pageStackList.splice(pageStackList.length - 1);
281 | pageStackList.push(location);
282 | }
283 | }
284 | function getIndexByName(name) {
285 | return pageStackList.findIndex(v => v.name === name);
286 | }
287 | function getRouteInfo(location) {
288 | var historyState = window.history.state;
289 | return {
290 | name: location.name,
291 | path: location.path,
292 | fullPath: location.fullPath,
293 | meta: Object.assign({}, location.meta, {
294 | keepAlive: getRouteMetaValue("keepAlive", true, location.meta),
295 | disableSaveScrollPosition: getRouteMetaValue("disableSaveScrollPosition", disableSaveScrollPosition, location.meta)
296 | }),
297 | state: historyState,
298 | navigationType: "",
299 | navigationDirection: ""
300 | };
301 | }
302 | var pageStackRouter = {
303 | version,
304 | pageStackList,
305 | currentPage,
306 | install(app) {
307 | // eslint-disable-next-line @typescript-eslint/no-this-alias
308 | var pageStackRouter = this;
309 | router.afterEach((to, from) => {
310 | if (to.name) {
311 | navigate(to, from);
312 | }
313 | });
314 | app.component("PageStackRouterView", script);
315 | app.provide(pageStackRouterKey, pageStackRouter);
316 | app.provide(pageStackRouteKey, currentPage);
317 | app.provide(pageStackListKey, pageStackList);
318 | }
319 | };
320 | return pageStackRouter;
321 | }
322 |
323 | exports.createPageStackRouter = createPageStackRouter;
324 | exports.pageStackListKey = pageStackListKey;
325 | exports.pageStackRouteKey = pageStackRouteKey;
326 | exports.pageStackRouterKey = pageStackRouterKey;
327 | exports.usePageStackList = usePageStackList;
328 | exports.usePageStackRoute = usePageStackRoute;
329 | exports.usePageStackRouter = usePageStackRouter;
330 |
331 | }));
332 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-page-stack-router",
3 | "version": "3.2.6",
4 | "description": "一个 Vue.js 的页面栈路由管理器",
5 | "author": "JoeshuTT",
6 | "license": "MIT",
7 | "keywords": [
8 | "vue",
9 | "router",
10 | "page-stack"
11 | ],
12 | "types": "types/index.d.ts",
13 | "main": "dist/vue-page-stack-router.common.js",
14 | "module": "dist/vue-page-stack-router.esm.js",
15 | "browser": "dist/vue-page-stack-router.js",
16 | "unpkg": "dist/vue-page-stack-router.js",
17 | "jsdelivr": "dist/vue-page-stack-router.js",
18 | "engines": {
19 | "node": ">=14"
20 | },
21 | "scripts": {
22 | "build": "rollup -c",
23 | "dev": "rollup -c -w"
24 | },
25 | "type": "module",
26 | "peerDependencies": {
27 | "vue": "^3.0.0",
28 | "vue-router": "^4.0.0"
29 | },
30 | "bugs": {
31 | "url": "https://github.com/JoeshuTT/vue-page-stack-router/issues"
32 | },
33 | "homepage": "https://github.com/JoeshuTT/vue-page-stack-router/#readme",
34 | "devDependencies": {
35 | "@babel/core": "^7.20.2",
36 | "@babel/preset-env": "^7.20.2",
37 | "@rollup/plugin-babel": "^6.0.2",
38 | "@rollup/plugin-json": "^5.0.1",
39 | "@rollup/plugin-node-resolve": "^15.0.1",
40 | "@vue/compiler-sfc": "^3.2.41",
41 | "rollup": "^3.2.5",
42 | "rollup-plugin-vue": "^6.0.0"
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | dependencies:
4 | vue:
5 | specifier: ^3.0.0
6 | version: 3.0.0
7 | vue-router:
8 | specifier: ^4.0.0
9 | version: 4.0.0(vue@3.0.0)
10 |
11 | devDependencies:
12 | '@babel/core':
13 | specifier: ^7.20.2
14 | version: 7.20.2
15 | '@babel/preset-env':
16 | specifier: ^7.20.2
17 | version: 7.20.2(@babel/core@7.20.2)
18 | '@rollup/plugin-babel':
19 | specifier: ^6.0.2
20 | version: 6.0.2(@babel/core@7.20.2)(rollup@3.2.5)
21 | '@rollup/plugin-json':
22 | specifier: ^5.0.1
23 | version: 5.0.1(rollup@3.2.5)
24 | '@rollup/plugin-node-resolve':
25 | specifier: ^15.0.1
26 | version: 15.0.1(rollup@3.2.5)
27 | '@vue/compiler-sfc':
28 | specifier: ^3.2.41
29 | version: 3.2.41
30 | rollup:
31 | specifier: ^3.2.5
32 | version: 3.2.5
33 | rollup-plugin-vue:
34 | specifier: ^6.0.0
35 | version: 6.0.0(@vue/compiler-sfc@3.2.41)
36 |
37 | packages:
38 |
39 | /@ampproject/remapping@2.2.0:
40 | resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==}
41 | engines: {node: '>=6.0.0'}
42 | dependencies:
43 | '@jridgewell/gen-mapping': 0.1.1
44 | '@jridgewell/trace-mapping': 0.3.17
45 | dev: true
46 |
47 | /@babel/code-frame@7.18.6:
48 | resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
49 | engines: {node: '>=6.9.0'}
50 | dependencies:
51 | '@babel/highlight': 7.18.6
52 | dev: true
53 |
54 | /@babel/compat-data@7.20.1:
55 | resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==}
56 | engines: {node: '>=6.9.0'}
57 | dev: true
58 |
59 | /@babel/core@7.20.2:
60 | resolution: {integrity: sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==}
61 | engines: {node: '>=6.9.0'}
62 | dependencies:
63 | '@ampproject/remapping': 2.2.0
64 | '@babel/code-frame': 7.18.6
65 | '@babel/generator': 7.20.2
66 | '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2)
67 | '@babel/helper-module-transforms': 7.20.2
68 | '@babel/helpers': 7.20.1
69 | '@babel/parser': 7.20.2
70 | '@babel/template': 7.18.10
71 | '@babel/traverse': 7.20.1
72 | '@babel/types': 7.20.2
73 | convert-source-map: 1.9.0
74 | debug: 4.3.4
75 | gensync: 1.0.0-beta.2
76 | json5: 2.2.1
77 | semver: 6.3.0
78 | transitivePeerDependencies:
79 | - supports-color
80 | dev: true
81 |
82 | /@babel/generator@7.20.2:
83 | resolution: {integrity: sha512-SD75PMIK6i9H8G/tfGvB4KKl4Nw6Ssos9nGgYwxbgyTP0iX/Z55DveoH86rmUB/YHTQQ+ZC0F7xxaY8l2OF44Q==}
84 | engines: {node: '>=6.9.0'}
85 | dependencies:
86 | '@babel/types': 7.20.2
87 | '@jridgewell/gen-mapping': 0.3.2
88 | jsesc: 2.5.2
89 | dev: true
90 |
91 | /@babel/helper-annotate-as-pure@7.18.6:
92 | resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==}
93 | engines: {node: '>=6.9.0'}
94 | dependencies:
95 | '@babel/types': 7.20.2
96 | dev: true
97 |
98 | /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9:
99 | resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==}
100 | engines: {node: '>=6.9.0'}
101 | dependencies:
102 | '@babel/helper-explode-assignable-expression': 7.18.6
103 | '@babel/types': 7.20.2
104 | dev: true
105 |
106 | /@babel/helper-compilation-targets@7.20.0(@babel/core@7.20.2):
107 | resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==}
108 | engines: {node: '>=6.9.0'}
109 | peerDependencies:
110 | '@babel/core': ^7.0.0
111 | dependencies:
112 | '@babel/compat-data': 7.20.1
113 | '@babel/core': 7.20.2
114 | '@babel/helper-validator-option': 7.18.6
115 | browserslist: 4.21.4
116 | semver: 6.3.0
117 | dev: true
118 |
119 | /@babel/helper-create-class-features-plugin@7.20.2(@babel/core@7.20.2):
120 | resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==}
121 | engines: {node: '>=6.9.0'}
122 | peerDependencies:
123 | '@babel/core': ^7.0.0
124 | dependencies:
125 | '@babel/core': 7.20.2
126 | '@babel/helper-annotate-as-pure': 7.18.6
127 | '@babel/helper-environment-visitor': 7.18.9
128 | '@babel/helper-function-name': 7.19.0
129 | '@babel/helper-member-expression-to-functions': 7.18.9
130 | '@babel/helper-optimise-call-expression': 7.18.6
131 | '@babel/helper-replace-supers': 7.19.1
132 | '@babel/helper-split-export-declaration': 7.18.6
133 | transitivePeerDependencies:
134 | - supports-color
135 | dev: true
136 |
137 | /@babel/helper-create-regexp-features-plugin@7.19.0(@babel/core@7.20.2):
138 | resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==}
139 | engines: {node: '>=6.9.0'}
140 | peerDependencies:
141 | '@babel/core': ^7.0.0
142 | dependencies:
143 | '@babel/core': 7.20.2
144 | '@babel/helper-annotate-as-pure': 7.18.6
145 | regexpu-core: 5.2.1
146 | dev: true
147 |
148 | /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.20.2):
149 | resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==}
150 | peerDependencies:
151 | '@babel/core': ^7.4.0-0
152 | dependencies:
153 | '@babel/core': 7.20.2
154 | '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2)
155 | '@babel/helper-plugin-utils': 7.20.2
156 | debug: 4.3.4
157 | lodash.debounce: 4.0.8
158 | resolve: 1.22.1
159 | semver: 6.3.0
160 | transitivePeerDependencies:
161 | - supports-color
162 | dev: true
163 |
164 | /@babel/helper-environment-visitor@7.18.9:
165 | resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==}
166 | engines: {node: '>=6.9.0'}
167 | dev: true
168 |
169 | /@babel/helper-explode-assignable-expression@7.18.6:
170 | resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==}
171 | engines: {node: '>=6.9.0'}
172 | dependencies:
173 | '@babel/types': 7.20.2
174 | dev: true
175 |
176 | /@babel/helper-function-name@7.19.0:
177 | resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==}
178 | engines: {node: '>=6.9.0'}
179 | dependencies:
180 | '@babel/template': 7.18.10
181 | '@babel/types': 7.20.2
182 | dev: true
183 |
184 | /@babel/helper-hoist-variables@7.18.6:
185 | resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
186 | engines: {node: '>=6.9.0'}
187 | dependencies:
188 | '@babel/types': 7.20.2
189 | dev: true
190 |
191 | /@babel/helper-member-expression-to-functions@7.18.9:
192 | resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==}
193 | engines: {node: '>=6.9.0'}
194 | dependencies:
195 | '@babel/types': 7.20.2
196 | dev: true
197 |
198 | /@babel/helper-module-imports@7.18.6:
199 | resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
200 | engines: {node: '>=6.9.0'}
201 | dependencies:
202 | '@babel/types': 7.20.2
203 | dev: true
204 |
205 | /@babel/helper-module-transforms@7.20.2:
206 | resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==}
207 | engines: {node: '>=6.9.0'}
208 | dependencies:
209 | '@babel/helper-environment-visitor': 7.18.9
210 | '@babel/helper-module-imports': 7.18.6
211 | '@babel/helper-simple-access': 7.20.2
212 | '@babel/helper-split-export-declaration': 7.18.6
213 | '@babel/helper-validator-identifier': 7.19.1
214 | '@babel/template': 7.18.10
215 | '@babel/traverse': 7.20.1
216 | '@babel/types': 7.20.2
217 | transitivePeerDependencies:
218 | - supports-color
219 | dev: true
220 |
221 | /@babel/helper-optimise-call-expression@7.18.6:
222 | resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==}
223 | engines: {node: '>=6.9.0'}
224 | dependencies:
225 | '@babel/types': 7.20.2
226 | dev: true
227 |
228 | /@babel/helper-plugin-utils@7.20.2:
229 | resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==}
230 | engines: {node: '>=6.9.0'}
231 | dev: true
232 |
233 | /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.20.2):
234 | resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==}
235 | engines: {node: '>=6.9.0'}
236 | peerDependencies:
237 | '@babel/core': ^7.0.0
238 | dependencies:
239 | '@babel/core': 7.20.2
240 | '@babel/helper-annotate-as-pure': 7.18.6
241 | '@babel/helper-environment-visitor': 7.18.9
242 | '@babel/helper-wrap-function': 7.19.0
243 | '@babel/types': 7.20.2
244 | transitivePeerDependencies:
245 | - supports-color
246 | dev: true
247 |
248 | /@babel/helper-replace-supers@7.19.1:
249 | resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==}
250 | engines: {node: '>=6.9.0'}
251 | dependencies:
252 | '@babel/helper-environment-visitor': 7.18.9
253 | '@babel/helper-member-expression-to-functions': 7.18.9
254 | '@babel/helper-optimise-call-expression': 7.18.6
255 | '@babel/traverse': 7.20.1
256 | '@babel/types': 7.20.2
257 | transitivePeerDependencies:
258 | - supports-color
259 | dev: true
260 |
261 | /@babel/helper-simple-access@7.20.2:
262 | resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==}
263 | engines: {node: '>=6.9.0'}
264 | dependencies:
265 | '@babel/types': 7.20.2
266 | dev: true
267 |
268 | /@babel/helper-skip-transparent-expression-wrappers@7.20.0:
269 | resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==}
270 | engines: {node: '>=6.9.0'}
271 | dependencies:
272 | '@babel/types': 7.20.2
273 | dev: true
274 |
275 | /@babel/helper-split-export-declaration@7.18.6:
276 | resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
277 | engines: {node: '>=6.9.0'}
278 | dependencies:
279 | '@babel/types': 7.20.2
280 | dev: true
281 |
282 | /@babel/helper-string-parser@7.19.4:
283 | resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
284 | engines: {node: '>=6.9.0'}
285 |
286 | /@babel/helper-validator-identifier@7.19.1:
287 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
288 | engines: {node: '>=6.9.0'}
289 |
290 | /@babel/helper-validator-option@7.18.6:
291 | resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==}
292 | engines: {node: '>=6.9.0'}
293 | dev: true
294 |
295 | /@babel/helper-wrap-function@7.19.0:
296 | resolution: {integrity: sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==}
297 | engines: {node: '>=6.9.0'}
298 | dependencies:
299 | '@babel/helper-function-name': 7.19.0
300 | '@babel/template': 7.18.10
301 | '@babel/traverse': 7.20.1
302 | '@babel/types': 7.20.2
303 | transitivePeerDependencies:
304 | - supports-color
305 | dev: true
306 |
307 | /@babel/helpers@7.20.1:
308 | resolution: {integrity: sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==}
309 | engines: {node: '>=6.9.0'}
310 | dependencies:
311 | '@babel/template': 7.18.10
312 | '@babel/traverse': 7.20.1
313 | '@babel/types': 7.20.2
314 | transitivePeerDependencies:
315 | - supports-color
316 | dev: true
317 |
318 | /@babel/highlight@7.18.6:
319 | resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
320 | engines: {node: '>=6.9.0'}
321 | dependencies:
322 | '@babel/helper-validator-identifier': 7.19.1
323 | chalk: 2.4.2
324 | js-tokens: 4.0.0
325 | dev: true
326 |
327 | /@babel/parser@7.20.2:
328 | resolution: {integrity: sha512-afk318kh2uKbo7BEj2QtEi8HVCGrwHUffrYDy7dgVcSa2j9lY3LDjPzcyGdpX7xgm35aWqvciZJ4WKmdF/SxYg==}
329 | engines: {node: '>=6.0.0'}
330 | hasBin: true
331 | dependencies:
332 | '@babel/types': 7.20.2
333 |
334 | /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.20.2):
335 | resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==}
336 | engines: {node: '>=6.9.0'}
337 | peerDependencies:
338 | '@babel/core': ^7.0.0
339 | dependencies:
340 | '@babel/core': 7.20.2
341 | '@babel/helper-plugin-utils': 7.20.2
342 | dev: true
343 |
344 | /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.18.9(@babel/core@7.20.2):
345 | resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==}
346 | engines: {node: '>=6.9.0'}
347 | peerDependencies:
348 | '@babel/core': ^7.13.0
349 | dependencies:
350 | '@babel/core': 7.20.2
351 | '@babel/helper-plugin-utils': 7.20.2
352 | '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
353 | '@babel/plugin-proposal-optional-chaining': 7.18.9(@babel/core@7.20.2)
354 | dev: true
355 |
356 | /@babel/plugin-proposal-async-generator-functions@7.20.1(@babel/core@7.20.2):
357 | resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==}
358 | engines: {node: '>=6.9.0'}
359 | peerDependencies:
360 | '@babel/core': ^7.0.0-0
361 | dependencies:
362 | '@babel/core': 7.20.2
363 | '@babel/helper-environment-visitor': 7.18.9
364 | '@babel/helper-plugin-utils': 7.20.2
365 | '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.20.2)
366 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.2)
367 | transitivePeerDependencies:
368 | - supports-color
369 | dev: true
370 |
371 | /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.20.2):
372 | resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==}
373 | engines: {node: '>=6.9.0'}
374 | peerDependencies:
375 | '@babel/core': ^7.0.0-0
376 | dependencies:
377 | '@babel/core': 7.20.2
378 | '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2)
379 | '@babel/helper-plugin-utils': 7.20.2
380 | transitivePeerDependencies:
381 | - supports-color
382 | dev: true
383 |
384 | /@babel/plugin-proposal-class-static-block@7.18.6(@babel/core@7.20.2):
385 | resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==}
386 | engines: {node: '>=6.9.0'}
387 | peerDependencies:
388 | '@babel/core': ^7.12.0
389 | dependencies:
390 | '@babel/core': 7.20.2
391 | '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2)
392 | '@babel/helper-plugin-utils': 7.20.2
393 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.2)
394 | transitivePeerDependencies:
395 | - supports-color
396 | dev: true
397 |
398 | /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.20.2):
399 | resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==}
400 | engines: {node: '>=6.9.0'}
401 | peerDependencies:
402 | '@babel/core': ^7.0.0-0
403 | dependencies:
404 | '@babel/core': 7.20.2
405 | '@babel/helper-plugin-utils': 7.20.2
406 | '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.2)
407 | dev: true
408 |
409 | /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.20.2):
410 | resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==}
411 | engines: {node: '>=6.9.0'}
412 | peerDependencies:
413 | '@babel/core': ^7.0.0-0
414 | dependencies:
415 | '@babel/core': 7.20.2
416 | '@babel/helper-plugin-utils': 7.20.2
417 | '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.2)
418 | dev: true
419 |
420 | /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.20.2):
421 | resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==}
422 | engines: {node: '>=6.9.0'}
423 | peerDependencies:
424 | '@babel/core': ^7.0.0-0
425 | dependencies:
426 | '@babel/core': 7.20.2
427 | '@babel/helper-plugin-utils': 7.20.2
428 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.2)
429 | dev: true
430 |
431 | /@babel/plugin-proposal-logical-assignment-operators@7.18.9(@babel/core@7.20.2):
432 | resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==}
433 | engines: {node: '>=6.9.0'}
434 | peerDependencies:
435 | '@babel/core': ^7.0.0-0
436 | dependencies:
437 | '@babel/core': 7.20.2
438 | '@babel/helper-plugin-utils': 7.20.2
439 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.2)
440 | dev: true
441 |
442 | /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.20.2):
443 | resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==}
444 | engines: {node: '>=6.9.0'}
445 | peerDependencies:
446 | '@babel/core': ^7.0.0-0
447 | dependencies:
448 | '@babel/core': 7.20.2
449 | '@babel/helper-plugin-utils': 7.20.2
450 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.2)
451 | dev: true
452 |
453 | /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.20.2):
454 | resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==}
455 | engines: {node: '>=6.9.0'}
456 | peerDependencies:
457 | '@babel/core': ^7.0.0-0
458 | dependencies:
459 | '@babel/core': 7.20.2
460 | '@babel/helper-plugin-utils': 7.20.2
461 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.2)
462 | dev: true
463 |
464 | /@babel/plugin-proposal-object-rest-spread@7.20.2(@babel/core@7.20.2):
465 | resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==}
466 | engines: {node: '>=6.9.0'}
467 | peerDependencies:
468 | '@babel/core': ^7.0.0-0
469 | dependencies:
470 | '@babel/compat-data': 7.20.1
471 | '@babel/core': 7.20.2
472 | '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2)
473 | '@babel/helper-plugin-utils': 7.20.2
474 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.2)
475 | '@babel/plugin-transform-parameters': 7.20.1(@babel/core@7.20.2)
476 | dev: true
477 |
478 | /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.20.2):
479 | resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==}
480 | engines: {node: '>=6.9.0'}
481 | peerDependencies:
482 | '@babel/core': ^7.0.0-0
483 | dependencies:
484 | '@babel/core': 7.20.2
485 | '@babel/helper-plugin-utils': 7.20.2
486 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.2)
487 | dev: true
488 |
489 | /@babel/plugin-proposal-optional-chaining@7.18.9(@babel/core@7.20.2):
490 | resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==}
491 | engines: {node: '>=6.9.0'}
492 | peerDependencies:
493 | '@babel/core': ^7.0.0-0
494 | dependencies:
495 | '@babel/core': 7.20.2
496 | '@babel/helper-plugin-utils': 7.20.2
497 | '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
498 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.2)
499 | dev: true
500 |
501 | /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.20.2):
502 | resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==}
503 | engines: {node: '>=6.9.0'}
504 | peerDependencies:
505 | '@babel/core': ^7.0.0-0
506 | dependencies:
507 | '@babel/core': 7.20.2
508 | '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2)
509 | '@babel/helper-plugin-utils': 7.20.2
510 | transitivePeerDependencies:
511 | - supports-color
512 | dev: true
513 |
514 | /@babel/plugin-proposal-private-property-in-object@7.18.6(@babel/core@7.20.2):
515 | resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==}
516 | engines: {node: '>=6.9.0'}
517 | peerDependencies:
518 | '@babel/core': ^7.0.0-0
519 | dependencies:
520 | '@babel/core': 7.20.2
521 | '@babel/helper-annotate-as-pure': 7.18.6
522 | '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2)
523 | '@babel/helper-plugin-utils': 7.20.2
524 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.2)
525 | transitivePeerDependencies:
526 | - supports-color
527 | dev: true
528 |
529 | /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.20.2):
530 | resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==}
531 | engines: {node: '>=4'}
532 | peerDependencies:
533 | '@babel/core': ^7.0.0-0
534 | dependencies:
535 | '@babel/core': 7.20.2
536 | '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2)
537 | '@babel/helper-plugin-utils': 7.20.2
538 | dev: true
539 |
540 | /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.20.2):
541 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
542 | peerDependencies:
543 | '@babel/core': ^7.0.0-0
544 | dependencies:
545 | '@babel/core': 7.20.2
546 | '@babel/helper-plugin-utils': 7.20.2
547 | dev: true
548 |
549 | /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.20.2):
550 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
551 | peerDependencies:
552 | '@babel/core': ^7.0.0-0
553 | dependencies:
554 | '@babel/core': 7.20.2
555 | '@babel/helper-plugin-utils': 7.20.2
556 | dev: true
557 |
558 | /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.20.2):
559 | resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
560 | engines: {node: '>=6.9.0'}
561 | peerDependencies:
562 | '@babel/core': ^7.0.0-0
563 | dependencies:
564 | '@babel/core': 7.20.2
565 | '@babel/helper-plugin-utils': 7.20.2
566 | dev: true
567 |
568 | /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.20.2):
569 | resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
570 | peerDependencies:
571 | '@babel/core': ^7.0.0-0
572 | dependencies:
573 | '@babel/core': 7.20.2
574 | '@babel/helper-plugin-utils': 7.20.2
575 | dev: true
576 |
577 | /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.20.2):
578 | resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
579 | peerDependencies:
580 | '@babel/core': ^7.0.0-0
581 | dependencies:
582 | '@babel/core': 7.20.2
583 | '@babel/helper-plugin-utils': 7.20.2
584 | dev: true
585 |
586 | /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.20.2):
587 | resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==}
588 | engines: {node: '>=6.9.0'}
589 | peerDependencies:
590 | '@babel/core': ^7.0.0-0
591 | dependencies:
592 | '@babel/core': 7.20.2
593 | '@babel/helper-plugin-utils': 7.20.2
594 | dev: true
595 |
596 | /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.20.2):
597 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
598 | peerDependencies:
599 | '@babel/core': ^7.0.0-0
600 | dependencies:
601 | '@babel/core': 7.20.2
602 | '@babel/helper-plugin-utils': 7.20.2
603 | dev: true
604 |
605 | /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.20.2):
606 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
607 | peerDependencies:
608 | '@babel/core': ^7.0.0-0
609 | dependencies:
610 | '@babel/core': 7.20.2
611 | '@babel/helper-plugin-utils': 7.20.2
612 | dev: true
613 |
614 | /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.20.2):
615 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
616 | peerDependencies:
617 | '@babel/core': ^7.0.0-0
618 | dependencies:
619 | '@babel/core': 7.20.2
620 | '@babel/helper-plugin-utils': 7.20.2
621 | dev: true
622 |
623 | /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.20.2):
624 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
625 | peerDependencies:
626 | '@babel/core': ^7.0.0-0
627 | dependencies:
628 | '@babel/core': 7.20.2
629 | '@babel/helper-plugin-utils': 7.20.2
630 | dev: true
631 |
632 | /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.20.2):
633 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
634 | peerDependencies:
635 | '@babel/core': ^7.0.0-0
636 | dependencies:
637 | '@babel/core': 7.20.2
638 | '@babel/helper-plugin-utils': 7.20.2
639 | dev: true
640 |
641 | /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.20.2):
642 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
643 | peerDependencies:
644 | '@babel/core': ^7.0.0-0
645 | dependencies:
646 | '@babel/core': 7.20.2
647 | '@babel/helper-plugin-utils': 7.20.2
648 | dev: true
649 |
650 | /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.20.2):
651 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
652 | peerDependencies:
653 | '@babel/core': ^7.0.0-0
654 | dependencies:
655 | '@babel/core': 7.20.2
656 | '@babel/helper-plugin-utils': 7.20.2
657 | dev: true
658 |
659 | /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.20.2):
660 | resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
661 | engines: {node: '>=6.9.0'}
662 | peerDependencies:
663 | '@babel/core': ^7.0.0-0
664 | dependencies:
665 | '@babel/core': 7.20.2
666 | '@babel/helper-plugin-utils': 7.20.2
667 | dev: true
668 |
669 | /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.20.2):
670 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
671 | engines: {node: '>=6.9.0'}
672 | peerDependencies:
673 | '@babel/core': ^7.0.0-0
674 | dependencies:
675 | '@babel/core': 7.20.2
676 | '@babel/helper-plugin-utils': 7.20.2
677 | dev: true
678 |
679 | /@babel/plugin-transform-arrow-functions@7.18.6(@babel/core@7.20.2):
680 | resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==}
681 | engines: {node: '>=6.9.0'}
682 | peerDependencies:
683 | '@babel/core': ^7.0.0-0
684 | dependencies:
685 | '@babel/core': 7.20.2
686 | '@babel/helper-plugin-utils': 7.20.2
687 | dev: true
688 |
689 | /@babel/plugin-transform-async-to-generator@7.18.6(@babel/core@7.20.2):
690 | resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==}
691 | engines: {node: '>=6.9.0'}
692 | peerDependencies:
693 | '@babel/core': ^7.0.0-0
694 | dependencies:
695 | '@babel/core': 7.20.2
696 | '@babel/helper-module-imports': 7.18.6
697 | '@babel/helper-plugin-utils': 7.20.2
698 | '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.20.2)
699 | transitivePeerDependencies:
700 | - supports-color
701 | dev: true
702 |
703 | /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.20.2):
704 | resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==}
705 | engines: {node: '>=6.9.0'}
706 | peerDependencies:
707 | '@babel/core': ^7.0.0-0
708 | dependencies:
709 | '@babel/core': 7.20.2
710 | '@babel/helper-plugin-utils': 7.20.2
711 | dev: true
712 |
713 | /@babel/plugin-transform-block-scoping@7.20.2(@babel/core@7.20.2):
714 | resolution: {integrity: sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==}
715 | engines: {node: '>=6.9.0'}
716 | peerDependencies:
717 | '@babel/core': ^7.0.0-0
718 | dependencies:
719 | '@babel/core': 7.20.2
720 | '@babel/helper-plugin-utils': 7.20.2
721 | dev: true
722 |
723 | /@babel/plugin-transform-classes@7.20.2(@babel/core@7.20.2):
724 | resolution: {integrity: sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==}
725 | engines: {node: '>=6.9.0'}
726 | peerDependencies:
727 | '@babel/core': ^7.0.0-0
728 | dependencies:
729 | '@babel/core': 7.20.2
730 | '@babel/helper-annotate-as-pure': 7.18.6
731 | '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2)
732 | '@babel/helper-environment-visitor': 7.18.9
733 | '@babel/helper-function-name': 7.19.0
734 | '@babel/helper-optimise-call-expression': 7.18.6
735 | '@babel/helper-plugin-utils': 7.20.2
736 | '@babel/helper-replace-supers': 7.19.1
737 | '@babel/helper-split-export-declaration': 7.18.6
738 | globals: 11.12.0
739 | transitivePeerDependencies:
740 | - supports-color
741 | dev: true
742 |
743 | /@babel/plugin-transform-computed-properties@7.18.9(@babel/core@7.20.2):
744 | resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==}
745 | engines: {node: '>=6.9.0'}
746 | peerDependencies:
747 | '@babel/core': ^7.0.0-0
748 | dependencies:
749 | '@babel/core': 7.20.2
750 | '@babel/helper-plugin-utils': 7.20.2
751 | dev: true
752 |
753 | /@babel/plugin-transform-destructuring@7.20.2(@babel/core@7.20.2):
754 | resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==}
755 | engines: {node: '>=6.9.0'}
756 | peerDependencies:
757 | '@babel/core': ^7.0.0-0
758 | dependencies:
759 | '@babel/core': 7.20.2
760 | '@babel/helper-plugin-utils': 7.20.2
761 | dev: true
762 |
763 | /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.20.2):
764 | resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==}
765 | engines: {node: '>=6.9.0'}
766 | peerDependencies:
767 | '@babel/core': ^7.0.0-0
768 | dependencies:
769 | '@babel/core': 7.20.2
770 | '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2)
771 | '@babel/helper-plugin-utils': 7.20.2
772 | dev: true
773 |
774 | /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.20.2):
775 | resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==}
776 | engines: {node: '>=6.9.0'}
777 | peerDependencies:
778 | '@babel/core': ^7.0.0-0
779 | dependencies:
780 | '@babel/core': 7.20.2
781 | '@babel/helper-plugin-utils': 7.20.2
782 | dev: true
783 |
784 | /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.20.2):
785 | resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==}
786 | engines: {node: '>=6.9.0'}
787 | peerDependencies:
788 | '@babel/core': ^7.0.0-0
789 | dependencies:
790 | '@babel/core': 7.20.2
791 | '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9
792 | '@babel/helper-plugin-utils': 7.20.2
793 | dev: true
794 |
795 | /@babel/plugin-transform-for-of@7.18.8(@babel/core@7.20.2):
796 | resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==}
797 | engines: {node: '>=6.9.0'}
798 | peerDependencies:
799 | '@babel/core': ^7.0.0-0
800 | dependencies:
801 | '@babel/core': 7.20.2
802 | '@babel/helper-plugin-utils': 7.20.2
803 | dev: true
804 |
805 | /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.20.2):
806 | resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==}
807 | engines: {node: '>=6.9.0'}
808 | peerDependencies:
809 | '@babel/core': ^7.0.0-0
810 | dependencies:
811 | '@babel/core': 7.20.2
812 | '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2)
813 | '@babel/helper-function-name': 7.19.0
814 | '@babel/helper-plugin-utils': 7.20.2
815 | dev: true
816 |
817 | /@babel/plugin-transform-literals@7.18.9(@babel/core@7.20.2):
818 | resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==}
819 | engines: {node: '>=6.9.0'}
820 | peerDependencies:
821 | '@babel/core': ^7.0.0-0
822 | dependencies:
823 | '@babel/core': 7.20.2
824 | '@babel/helper-plugin-utils': 7.20.2
825 | dev: true
826 |
827 | /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.20.2):
828 | resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==}
829 | engines: {node: '>=6.9.0'}
830 | peerDependencies:
831 | '@babel/core': ^7.0.0-0
832 | dependencies:
833 | '@babel/core': 7.20.2
834 | '@babel/helper-plugin-utils': 7.20.2
835 | dev: true
836 |
837 | /@babel/plugin-transform-modules-amd@7.19.6(@babel/core@7.20.2):
838 | resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==}
839 | engines: {node: '>=6.9.0'}
840 | peerDependencies:
841 | '@babel/core': ^7.0.0-0
842 | dependencies:
843 | '@babel/core': 7.20.2
844 | '@babel/helper-module-transforms': 7.20.2
845 | '@babel/helper-plugin-utils': 7.20.2
846 | transitivePeerDependencies:
847 | - supports-color
848 | dev: true
849 |
850 | /@babel/plugin-transform-modules-commonjs@7.19.6(@babel/core@7.20.2):
851 | resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==}
852 | engines: {node: '>=6.9.0'}
853 | peerDependencies:
854 | '@babel/core': ^7.0.0-0
855 | dependencies:
856 | '@babel/core': 7.20.2
857 | '@babel/helper-module-transforms': 7.20.2
858 | '@babel/helper-plugin-utils': 7.20.2
859 | '@babel/helper-simple-access': 7.20.2
860 | transitivePeerDependencies:
861 | - supports-color
862 | dev: true
863 |
864 | /@babel/plugin-transform-modules-systemjs@7.19.6(@babel/core@7.20.2):
865 | resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==}
866 | engines: {node: '>=6.9.0'}
867 | peerDependencies:
868 | '@babel/core': ^7.0.0-0
869 | dependencies:
870 | '@babel/core': 7.20.2
871 | '@babel/helper-hoist-variables': 7.18.6
872 | '@babel/helper-module-transforms': 7.20.2
873 | '@babel/helper-plugin-utils': 7.20.2
874 | '@babel/helper-validator-identifier': 7.19.1
875 | transitivePeerDependencies:
876 | - supports-color
877 | dev: true
878 |
879 | /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.20.2):
880 | resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==}
881 | engines: {node: '>=6.9.0'}
882 | peerDependencies:
883 | '@babel/core': ^7.0.0-0
884 | dependencies:
885 | '@babel/core': 7.20.2
886 | '@babel/helper-module-transforms': 7.20.2
887 | '@babel/helper-plugin-utils': 7.20.2
888 | transitivePeerDependencies:
889 | - supports-color
890 | dev: true
891 |
892 | /@babel/plugin-transform-named-capturing-groups-regex@7.19.1(@babel/core@7.20.2):
893 | resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==}
894 | engines: {node: '>=6.9.0'}
895 | peerDependencies:
896 | '@babel/core': ^7.0.0
897 | dependencies:
898 | '@babel/core': 7.20.2
899 | '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2)
900 | '@babel/helper-plugin-utils': 7.20.2
901 | dev: true
902 |
903 | /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.20.2):
904 | resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==}
905 | engines: {node: '>=6.9.0'}
906 | peerDependencies:
907 | '@babel/core': ^7.0.0-0
908 | dependencies:
909 | '@babel/core': 7.20.2
910 | '@babel/helper-plugin-utils': 7.20.2
911 | dev: true
912 |
913 | /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.20.2):
914 | resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==}
915 | engines: {node: '>=6.9.0'}
916 | peerDependencies:
917 | '@babel/core': ^7.0.0-0
918 | dependencies:
919 | '@babel/core': 7.20.2
920 | '@babel/helper-plugin-utils': 7.20.2
921 | '@babel/helper-replace-supers': 7.19.1
922 | transitivePeerDependencies:
923 | - supports-color
924 | dev: true
925 |
926 | /@babel/plugin-transform-parameters@7.20.1(@babel/core@7.20.2):
927 | resolution: {integrity: sha512-nDvKLrAvl+kf6BOy1UJ3MGwzzfTMgppxwiD2Jb4LO3xjYyZq30oQzDNJbCQpMdG9+j2IXHoiMrw5Cm/L6ZoxXQ==}
928 | engines: {node: '>=6.9.0'}
929 | peerDependencies:
930 | '@babel/core': ^7.0.0-0
931 | dependencies:
932 | '@babel/core': 7.20.2
933 | '@babel/helper-plugin-utils': 7.20.2
934 | dev: true
935 |
936 | /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.20.2):
937 | resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==}
938 | engines: {node: '>=6.9.0'}
939 | peerDependencies:
940 | '@babel/core': ^7.0.0-0
941 | dependencies:
942 | '@babel/core': 7.20.2
943 | '@babel/helper-plugin-utils': 7.20.2
944 | dev: true
945 |
946 | /@babel/plugin-transform-regenerator@7.18.6(@babel/core@7.20.2):
947 | resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==}
948 | engines: {node: '>=6.9.0'}
949 | peerDependencies:
950 | '@babel/core': ^7.0.0-0
951 | dependencies:
952 | '@babel/core': 7.20.2
953 | '@babel/helper-plugin-utils': 7.20.2
954 | regenerator-transform: 0.15.0
955 | dev: true
956 |
957 | /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.20.2):
958 | resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==}
959 | engines: {node: '>=6.9.0'}
960 | peerDependencies:
961 | '@babel/core': ^7.0.0-0
962 | dependencies:
963 | '@babel/core': 7.20.2
964 | '@babel/helper-plugin-utils': 7.20.2
965 | dev: true
966 |
967 | /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.20.2):
968 | resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==}
969 | engines: {node: '>=6.9.0'}
970 | peerDependencies:
971 | '@babel/core': ^7.0.0-0
972 | dependencies:
973 | '@babel/core': 7.20.2
974 | '@babel/helper-plugin-utils': 7.20.2
975 | dev: true
976 |
977 | /@babel/plugin-transform-spread@7.19.0(@babel/core@7.20.2):
978 | resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==}
979 | engines: {node: '>=6.9.0'}
980 | peerDependencies:
981 | '@babel/core': ^7.0.0-0
982 | dependencies:
983 | '@babel/core': 7.20.2
984 | '@babel/helper-plugin-utils': 7.20.2
985 | '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
986 | dev: true
987 |
988 | /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.20.2):
989 | resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==}
990 | engines: {node: '>=6.9.0'}
991 | peerDependencies:
992 | '@babel/core': ^7.0.0-0
993 | dependencies:
994 | '@babel/core': 7.20.2
995 | '@babel/helper-plugin-utils': 7.20.2
996 | dev: true
997 |
998 | /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.20.2):
999 | resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==}
1000 | engines: {node: '>=6.9.0'}
1001 | peerDependencies:
1002 | '@babel/core': ^7.0.0-0
1003 | dependencies:
1004 | '@babel/core': 7.20.2
1005 | '@babel/helper-plugin-utils': 7.20.2
1006 | dev: true
1007 |
1008 | /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.20.2):
1009 | resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==}
1010 | engines: {node: '>=6.9.0'}
1011 | peerDependencies:
1012 | '@babel/core': ^7.0.0-0
1013 | dependencies:
1014 | '@babel/core': 7.20.2
1015 | '@babel/helper-plugin-utils': 7.20.2
1016 | dev: true
1017 |
1018 | /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.20.2):
1019 | resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==}
1020 | engines: {node: '>=6.9.0'}
1021 | peerDependencies:
1022 | '@babel/core': ^7.0.0-0
1023 | dependencies:
1024 | '@babel/core': 7.20.2
1025 | '@babel/helper-plugin-utils': 7.20.2
1026 | dev: true
1027 |
1028 | /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.20.2):
1029 | resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==}
1030 | engines: {node: '>=6.9.0'}
1031 | peerDependencies:
1032 | '@babel/core': ^7.0.0-0
1033 | dependencies:
1034 | '@babel/core': 7.20.2
1035 | '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2)
1036 | '@babel/helper-plugin-utils': 7.20.2
1037 | dev: true
1038 |
1039 | /@babel/preset-env@7.20.2(@babel/core@7.20.2):
1040 | resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==}
1041 | engines: {node: '>=6.9.0'}
1042 | peerDependencies:
1043 | '@babel/core': ^7.0.0-0
1044 | dependencies:
1045 | '@babel/compat-data': 7.20.1
1046 | '@babel/core': 7.20.2
1047 | '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2)
1048 | '@babel/helper-plugin-utils': 7.20.2
1049 | '@babel/helper-validator-option': 7.18.6
1050 | '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.20.2)
1051 | '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9(@babel/core@7.20.2)
1052 | '@babel/plugin-proposal-async-generator-functions': 7.20.1(@babel/core@7.20.2)
1053 | '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.20.2)
1054 | '@babel/plugin-proposal-class-static-block': 7.18.6(@babel/core@7.20.2)
1055 | '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.20.2)
1056 | '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.20.2)
1057 | '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.20.2)
1058 | '@babel/plugin-proposal-logical-assignment-operators': 7.18.9(@babel/core@7.20.2)
1059 | '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.20.2)
1060 | '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.20.2)
1061 | '@babel/plugin-proposal-object-rest-spread': 7.20.2(@babel/core@7.20.2)
1062 | '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.20.2)
1063 | '@babel/plugin-proposal-optional-chaining': 7.18.9(@babel/core@7.20.2)
1064 | '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.20.2)
1065 | '@babel/plugin-proposal-private-property-in-object': 7.18.6(@babel/core@7.20.2)
1066 | '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.20.2)
1067 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.2)
1068 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.2)
1069 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.2)
1070 | '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.2)
1071 | '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.2)
1072 | '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.20.2)
1073 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.2)
1074 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.2)
1075 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.2)
1076 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.2)
1077 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.2)
1078 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.2)
1079 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.2)
1080 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.2)
1081 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.2)
1082 | '@babel/plugin-transform-arrow-functions': 7.18.6(@babel/core@7.20.2)
1083 | '@babel/plugin-transform-async-to-generator': 7.18.6(@babel/core@7.20.2)
1084 | '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.20.2)
1085 | '@babel/plugin-transform-block-scoping': 7.20.2(@babel/core@7.20.2)
1086 | '@babel/plugin-transform-classes': 7.20.2(@babel/core@7.20.2)
1087 | '@babel/plugin-transform-computed-properties': 7.18.9(@babel/core@7.20.2)
1088 | '@babel/plugin-transform-destructuring': 7.20.2(@babel/core@7.20.2)
1089 | '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.20.2)
1090 | '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.20.2)
1091 | '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.20.2)
1092 | '@babel/plugin-transform-for-of': 7.18.8(@babel/core@7.20.2)
1093 | '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.20.2)
1094 | '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.20.2)
1095 | '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.20.2)
1096 | '@babel/plugin-transform-modules-amd': 7.19.6(@babel/core@7.20.2)
1097 | '@babel/plugin-transform-modules-commonjs': 7.19.6(@babel/core@7.20.2)
1098 | '@babel/plugin-transform-modules-systemjs': 7.19.6(@babel/core@7.20.2)
1099 | '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.20.2)
1100 | '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1(@babel/core@7.20.2)
1101 | '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.20.2)
1102 | '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.20.2)
1103 | '@babel/plugin-transform-parameters': 7.20.1(@babel/core@7.20.2)
1104 | '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.20.2)
1105 | '@babel/plugin-transform-regenerator': 7.18.6(@babel/core@7.20.2)
1106 | '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.20.2)
1107 | '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.20.2)
1108 | '@babel/plugin-transform-spread': 7.19.0(@babel/core@7.20.2)
1109 | '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.20.2)
1110 | '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.20.2)
1111 | '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.20.2)
1112 | '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.20.2)
1113 | '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.20.2)
1114 | '@babel/preset-modules': 0.1.5(@babel/core@7.20.2)
1115 | '@babel/types': 7.20.2
1116 | babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.20.2)
1117 | babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.20.2)
1118 | babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.20.2)
1119 | core-js-compat: 3.26.0
1120 | semver: 6.3.0
1121 | transitivePeerDependencies:
1122 | - supports-color
1123 | dev: true
1124 |
1125 | /@babel/preset-modules@0.1.5(@babel/core@7.20.2):
1126 | resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==}
1127 | peerDependencies:
1128 | '@babel/core': ^7.0.0-0
1129 | dependencies:
1130 | '@babel/core': 7.20.2
1131 | '@babel/helper-plugin-utils': 7.20.2
1132 | '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.20.2)
1133 | '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.20.2)
1134 | '@babel/types': 7.20.2
1135 | esutils: 2.0.3
1136 | dev: true
1137 |
1138 | /@babel/runtime@7.20.1:
1139 | resolution: {integrity: sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==}
1140 | engines: {node: '>=6.9.0'}
1141 | dependencies:
1142 | regenerator-runtime: 0.13.10
1143 | dev: true
1144 |
1145 | /@babel/template@7.18.10:
1146 | resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==}
1147 | engines: {node: '>=6.9.0'}
1148 | dependencies:
1149 | '@babel/code-frame': 7.18.6
1150 | '@babel/parser': 7.20.2
1151 | '@babel/types': 7.20.2
1152 | dev: true
1153 |
1154 | /@babel/traverse@7.20.1:
1155 | resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==}
1156 | engines: {node: '>=6.9.0'}
1157 | dependencies:
1158 | '@babel/code-frame': 7.18.6
1159 | '@babel/generator': 7.20.2
1160 | '@babel/helper-environment-visitor': 7.18.9
1161 | '@babel/helper-function-name': 7.19.0
1162 | '@babel/helper-hoist-variables': 7.18.6
1163 | '@babel/helper-split-export-declaration': 7.18.6
1164 | '@babel/parser': 7.20.2
1165 | '@babel/types': 7.20.2
1166 | debug: 4.3.4
1167 | globals: 11.12.0
1168 | transitivePeerDependencies:
1169 | - supports-color
1170 | dev: true
1171 |
1172 | /@babel/types@7.20.2:
1173 | resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==}
1174 | engines: {node: '>=6.9.0'}
1175 | dependencies:
1176 | '@babel/helper-string-parser': 7.19.4
1177 | '@babel/helper-validator-identifier': 7.19.1
1178 | to-fast-properties: 2.0.0
1179 |
1180 | /@jridgewell/gen-mapping@0.1.1:
1181 | resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==}
1182 | engines: {node: '>=6.0.0'}
1183 | dependencies:
1184 | '@jridgewell/set-array': 1.1.2
1185 | '@jridgewell/sourcemap-codec': 1.4.14
1186 | dev: true
1187 |
1188 | /@jridgewell/gen-mapping@0.3.2:
1189 | resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==}
1190 | engines: {node: '>=6.0.0'}
1191 | dependencies:
1192 | '@jridgewell/set-array': 1.1.2
1193 | '@jridgewell/sourcemap-codec': 1.4.14
1194 | '@jridgewell/trace-mapping': 0.3.17
1195 | dev: true
1196 |
1197 | /@jridgewell/resolve-uri@3.1.0:
1198 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
1199 | engines: {node: '>=6.0.0'}
1200 | dev: true
1201 |
1202 | /@jridgewell/set-array@1.1.2:
1203 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
1204 | engines: {node: '>=6.0.0'}
1205 | dev: true
1206 |
1207 | /@jridgewell/sourcemap-codec@1.4.14:
1208 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
1209 | dev: true
1210 |
1211 | /@jridgewell/trace-mapping@0.3.17:
1212 | resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
1213 | dependencies:
1214 | '@jridgewell/resolve-uri': 3.1.0
1215 | '@jridgewell/sourcemap-codec': 1.4.14
1216 | dev: true
1217 |
1218 | /@rollup/plugin-babel@6.0.2(@babel/core@7.20.2)(rollup@3.2.5):
1219 | resolution: {integrity: sha512-Vnt8XIWYwCf3MD7qhBWYlP9pjSZvcE++nlPXhQYw6YNehl5742AzFbrV6h4BHb20VAOVUlIksVLymQCTwVCGDg==}
1220 | engines: {node: '>=14.0.0'}
1221 | peerDependencies:
1222 | '@babel/core': ^7.0.0
1223 | '@types/babel__core': ^7.1.9
1224 | rollup: ^1.20.0||^2.0.0||^3.0.0
1225 | peerDependenciesMeta:
1226 | '@types/babel__core':
1227 | optional: true
1228 | rollup:
1229 | optional: true
1230 | dependencies:
1231 | '@babel/core': 7.20.2
1232 | '@babel/helper-module-imports': 7.18.6
1233 | '@rollup/pluginutils': 5.0.2(rollup@3.2.5)
1234 | rollup: 3.2.5
1235 | dev: true
1236 |
1237 | /@rollup/plugin-json@5.0.1(rollup@3.2.5):
1238 | resolution: {integrity: sha512-QCwhZZLvM8nRcTHyR1vOgyTMiAnjiNj1ebD/BMRvbO1oc/z14lZH6PfxXeegee2B6mky/u9fia4fxRM4TqrUaw==}
1239 | engines: {node: '>=14.0.0'}
1240 | peerDependencies:
1241 | rollup: ^1.20.0||^2.0.0||^3.0.0
1242 | peerDependenciesMeta:
1243 | rollup:
1244 | optional: true
1245 | dependencies:
1246 | '@rollup/pluginutils': 5.0.2(rollup@3.2.5)
1247 | rollup: 3.2.5
1248 | dev: true
1249 |
1250 | /@rollup/plugin-node-resolve@15.0.1(rollup@3.2.5):
1251 | resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==}
1252 | engines: {node: '>=14.0.0'}
1253 | peerDependencies:
1254 | rollup: ^2.78.0||^3.0.0
1255 | peerDependenciesMeta:
1256 | rollup:
1257 | optional: true
1258 | dependencies:
1259 | '@rollup/pluginutils': 5.0.2(rollup@3.2.5)
1260 | '@types/resolve': 1.20.2
1261 | deepmerge: 4.2.2
1262 | is-builtin-module: 3.2.0
1263 | is-module: 1.0.0
1264 | resolve: 1.22.1
1265 | rollup: 3.2.5
1266 | dev: true
1267 |
1268 | /@rollup/pluginutils@5.0.2(rollup@3.2.5):
1269 | resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
1270 | engines: {node: '>=14.0.0'}
1271 | peerDependencies:
1272 | rollup: ^1.20.0||^2.0.0||^3.0.0
1273 | peerDependenciesMeta:
1274 | rollup:
1275 | optional: true
1276 | dependencies:
1277 | '@types/estree': 1.0.0
1278 | estree-walker: 2.0.2
1279 | picomatch: 2.3.1
1280 | rollup: 3.2.5
1281 | dev: true
1282 |
1283 | /@types/estree@1.0.0:
1284 | resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==}
1285 | dev: true
1286 |
1287 | /@types/resolve@1.20.2:
1288 | resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
1289 | dev: true
1290 |
1291 | /@vue/compiler-core@3.0.0:
1292 | resolution: {integrity: sha512-XqPC7vdv4rFE77S71oCHmT1K4Ks3WE2Gi6Lr4B5wn0Idmp+NyQQBUHsCNieMDRiEpgtJrw+yOHslrsV0AfAsfQ==}
1293 | dependencies:
1294 | '@babel/parser': 7.20.2
1295 | '@babel/types': 7.20.2
1296 | '@vue/shared': 3.0.0
1297 | estree-walker: 2.0.2
1298 | source-map: 0.6.1
1299 | dev: false
1300 |
1301 | /@vue/compiler-core@3.2.41:
1302 | resolution: {integrity: sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==}
1303 | dependencies:
1304 | '@babel/parser': 7.20.2
1305 | '@vue/shared': 3.2.41
1306 | estree-walker: 2.0.2
1307 | source-map: 0.6.1
1308 | dev: true
1309 |
1310 | /@vue/compiler-dom@3.0.0:
1311 | resolution: {integrity: sha512-ukDEGOP8P7lCPyStuM3F2iD5w2QPgUu2xwCW2XNeqPjFKIlR2xMsWjy4raI/cLjN6W16GtlMFaZdK8tLj5PRog==}
1312 | dependencies:
1313 | '@vue/compiler-core': 3.0.0
1314 | '@vue/shared': 3.0.0
1315 | dev: false
1316 |
1317 | /@vue/compiler-dom@3.2.41:
1318 | resolution: {integrity: sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==}
1319 | dependencies:
1320 | '@vue/compiler-core': 3.2.41
1321 | '@vue/shared': 3.2.41
1322 | dev: true
1323 |
1324 | /@vue/compiler-sfc@3.2.41:
1325 | resolution: {integrity: sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==}
1326 | dependencies:
1327 | '@babel/parser': 7.20.2
1328 | '@vue/compiler-core': 3.2.41
1329 | '@vue/compiler-dom': 3.2.41
1330 | '@vue/compiler-ssr': 3.2.41
1331 | '@vue/reactivity-transform': 3.2.41
1332 | '@vue/shared': 3.2.41
1333 | estree-walker: 2.0.2
1334 | magic-string: 0.25.9
1335 | postcss: 8.4.18
1336 | source-map: 0.6.1
1337 | dev: true
1338 |
1339 | /@vue/compiler-ssr@3.2.41:
1340 | resolution: {integrity: sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==}
1341 | dependencies:
1342 | '@vue/compiler-dom': 3.2.41
1343 | '@vue/shared': 3.2.41
1344 | dev: true
1345 |
1346 | /@vue/reactivity-transform@3.2.41:
1347 | resolution: {integrity: sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==}
1348 | dependencies:
1349 | '@babel/parser': 7.20.2
1350 | '@vue/compiler-core': 3.2.41
1351 | '@vue/shared': 3.2.41
1352 | estree-walker: 2.0.2
1353 | magic-string: 0.25.9
1354 | dev: true
1355 |
1356 | /@vue/reactivity@3.0.0:
1357 | resolution: {integrity: sha512-mEGkztGQrAPZRhV7C6PorrpT3+NtuA4dY2QjMzzrW31noKhssWTajRZTwpLF39NBRrF5UU6cp9+1I0FfavMgEQ==}
1358 | dependencies:
1359 | '@vue/shared': 3.0.0
1360 | dev: false
1361 |
1362 | /@vue/runtime-core@3.0.0:
1363 | resolution: {integrity: sha512-3ABMLeA0ZbeVNLbGGLXr+pNUwqXILOqz8WCVGfDWwQb+jW114Cm8djOHVVDoqdvRETQvDf8yHSUmpKHZpQuTkA==}
1364 | dependencies:
1365 | '@vue/reactivity': 3.0.0
1366 | '@vue/shared': 3.0.0
1367 | dev: false
1368 |
1369 | /@vue/runtime-dom@3.0.0:
1370 | resolution: {integrity: sha512-f312n5w9gK6mVvkDSj6/Xnot1XjlKXzFBYybmoy6ahAVC8ExbQ+LOWti1IZM/adU8VMNdKaw7Q53Hxz3y5jX8g==}
1371 | dependencies:
1372 | '@vue/runtime-core': 3.0.0
1373 | '@vue/shared': 3.0.0
1374 | csstype: 2.6.21
1375 | dev: false
1376 |
1377 | /@vue/shared@3.0.0:
1378 | resolution: {integrity: sha512-4XWL/avABGxU2E2ZF1eZq3Tj7fvksCMssDZUHOykBIMmh5d+KcAnQMC5XHMhtnA0NAvktYsA2YpdsVwVmhWzvA==}
1379 | dev: false
1380 |
1381 | /@vue/shared@3.2.41:
1382 | resolution: {integrity: sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==}
1383 | dev: true
1384 |
1385 | /ansi-styles@3.2.1:
1386 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
1387 | engines: {node: '>=4'}
1388 | dependencies:
1389 | color-convert: 1.9.3
1390 | dev: true
1391 |
1392 | /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.20.2):
1393 | resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==}
1394 | peerDependencies:
1395 | '@babel/core': ^7.0.0-0
1396 | dependencies:
1397 | '@babel/compat-data': 7.20.1
1398 | '@babel/core': 7.20.2
1399 | '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.2)
1400 | semver: 6.3.0
1401 | transitivePeerDependencies:
1402 | - supports-color
1403 | dev: true
1404 |
1405 | /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.20.2):
1406 | resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==}
1407 | peerDependencies:
1408 | '@babel/core': ^7.0.0-0
1409 | dependencies:
1410 | '@babel/core': 7.20.2
1411 | '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.2)
1412 | core-js-compat: 3.26.0
1413 | transitivePeerDependencies:
1414 | - supports-color
1415 | dev: true
1416 |
1417 | /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.20.2):
1418 | resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==}
1419 | peerDependencies:
1420 | '@babel/core': ^7.0.0-0
1421 | dependencies:
1422 | '@babel/core': 7.20.2
1423 | '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.2)
1424 | transitivePeerDependencies:
1425 | - supports-color
1426 | dev: true
1427 |
1428 | /browserslist@4.21.4:
1429 | resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==}
1430 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
1431 | hasBin: true
1432 | dependencies:
1433 | caniuse-lite: 1.0.30001488
1434 | electron-to-chromium: 1.4.284
1435 | node-releases: 2.0.6
1436 | update-browserslist-db: 1.0.10(browserslist@4.21.4)
1437 | dev: true
1438 |
1439 | /builtin-modules@3.3.0:
1440 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
1441 | engines: {node: '>=6'}
1442 | dev: true
1443 |
1444 | /caniuse-lite@1.0.30001488:
1445 | resolution: {integrity: sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==}
1446 | dev: true
1447 |
1448 | /chalk@2.4.2:
1449 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
1450 | engines: {node: '>=4'}
1451 | dependencies:
1452 | ansi-styles: 3.2.1
1453 | escape-string-regexp: 1.0.5
1454 | supports-color: 5.5.0
1455 | dev: true
1456 |
1457 | /color-convert@1.9.3:
1458 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
1459 | dependencies:
1460 | color-name: 1.1.3
1461 | dev: true
1462 |
1463 | /color-name@1.1.3:
1464 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
1465 | dev: true
1466 |
1467 | /convert-source-map@1.9.0:
1468 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
1469 | dev: true
1470 |
1471 | /core-js-compat@3.26.0:
1472 | resolution: {integrity: sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==}
1473 | dependencies:
1474 | browserslist: 4.21.4
1475 | dev: true
1476 |
1477 | /csstype@2.6.21:
1478 | resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
1479 | dev: false
1480 |
1481 | /debug@4.3.4:
1482 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
1483 | engines: {node: '>=6.0'}
1484 | peerDependencies:
1485 | supports-color: '*'
1486 | peerDependenciesMeta:
1487 | supports-color:
1488 | optional: true
1489 | dependencies:
1490 | ms: 2.1.2
1491 | dev: true
1492 |
1493 | /deepmerge@4.2.2:
1494 | resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
1495 | engines: {node: '>=0.10.0'}
1496 | dev: true
1497 |
1498 | /electron-to-chromium@1.4.284:
1499 | resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==}
1500 | dev: true
1501 |
1502 | /escalade@3.1.1:
1503 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
1504 | engines: {node: '>=6'}
1505 | dev: true
1506 |
1507 | /escape-string-regexp@1.0.5:
1508 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
1509 | engines: {node: '>=0.8.0'}
1510 | dev: true
1511 |
1512 | /estree-walker@0.6.1:
1513 | resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==}
1514 | dev: true
1515 |
1516 | /estree-walker@2.0.2:
1517 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
1518 |
1519 | /esutils@2.0.3:
1520 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1521 | engines: {node: '>=0.10.0'}
1522 | dev: true
1523 |
1524 | /fsevents@2.3.2:
1525 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
1526 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
1527 | os: [darwin]
1528 | requiresBuild: true
1529 | dev: true
1530 | optional: true
1531 |
1532 | /function-bind@1.1.1:
1533 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
1534 | dev: true
1535 |
1536 | /gensync@1.0.0-beta.2:
1537 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
1538 | engines: {node: '>=6.9.0'}
1539 | dev: true
1540 |
1541 | /globals@11.12.0:
1542 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
1543 | engines: {node: '>=4'}
1544 | dev: true
1545 |
1546 | /has-flag@3.0.0:
1547 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
1548 | engines: {node: '>=4'}
1549 | dev: true
1550 |
1551 | /has@1.0.3:
1552 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
1553 | engines: {node: '>= 0.4.0'}
1554 | dependencies:
1555 | function-bind: 1.1.1
1556 | dev: true
1557 |
1558 | /hash-sum@2.0.0:
1559 | resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==}
1560 | dev: true
1561 |
1562 | /is-builtin-module@3.2.0:
1563 | resolution: {integrity: sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==}
1564 | engines: {node: '>=6'}
1565 | dependencies:
1566 | builtin-modules: 3.3.0
1567 | dev: true
1568 |
1569 | /is-core-module@2.11.0:
1570 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
1571 | dependencies:
1572 | has: 1.0.3
1573 | dev: true
1574 |
1575 | /is-module@1.0.0:
1576 | resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
1577 | dev: true
1578 |
1579 | /js-tokens@4.0.0:
1580 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1581 | dev: true
1582 |
1583 | /jsesc@0.5.0:
1584 | resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
1585 | hasBin: true
1586 | dev: true
1587 |
1588 | /jsesc@2.5.2:
1589 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
1590 | engines: {node: '>=4'}
1591 | hasBin: true
1592 | dev: true
1593 |
1594 | /json5@2.2.1:
1595 | resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==}
1596 | engines: {node: '>=6'}
1597 | hasBin: true
1598 | dev: true
1599 |
1600 | /lodash.debounce@4.0.8:
1601 | resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
1602 | dev: true
1603 |
1604 | /magic-string@0.25.9:
1605 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
1606 | dependencies:
1607 | sourcemap-codec: 1.4.8
1608 | dev: true
1609 |
1610 | /ms@2.1.2:
1611 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1612 | dev: true
1613 |
1614 | /nanoid@3.3.4:
1615 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
1616 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1617 | hasBin: true
1618 | dev: true
1619 |
1620 | /node-releases@2.0.6:
1621 | resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==}
1622 | dev: true
1623 |
1624 | /path-parse@1.0.7:
1625 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1626 | dev: true
1627 |
1628 | /picocolors@1.0.0:
1629 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
1630 | dev: true
1631 |
1632 | /picomatch@2.3.1:
1633 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1634 | engines: {node: '>=8.6'}
1635 | dev: true
1636 |
1637 | /postcss@8.4.18:
1638 | resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==}
1639 | engines: {node: ^10 || ^12 || >=14}
1640 | dependencies:
1641 | nanoid: 3.3.4
1642 | picocolors: 1.0.0
1643 | source-map-js: 1.0.2
1644 | dev: true
1645 |
1646 | /regenerate-unicode-properties@10.1.0:
1647 | resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==}
1648 | engines: {node: '>=4'}
1649 | dependencies:
1650 | regenerate: 1.4.2
1651 | dev: true
1652 |
1653 | /regenerate@1.4.2:
1654 | resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
1655 | dev: true
1656 |
1657 | /regenerator-runtime@0.13.10:
1658 | resolution: {integrity: sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==}
1659 | dev: true
1660 |
1661 | /regenerator-transform@0.15.0:
1662 | resolution: {integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==}
1663 | dependencies:
1664 | '@babel/runtime': 7.20.1
1665 | dev: true
1666 |
1667 | /regexpu-core@5.2.1:
1668 | resolution: {integrity: sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==}
1669 | engines: {node: '>=4'}
1670 | dependencies:
1671 | regenerate: 1.4.2
1672 | regenerate-unicode-properties: 10.1.0
1673 | regjsgen: 0.7.1
1674 | regjsparser: 0.9.1
1675 | unicode-match-property-ecmascript: 2.0.0
1676 | unicode-match-property-value-ecmascript: 2.0.0
1677 | dev: true
1678 |
1679 | /regjsgen@0.7.1:
1680 | resolution: {integrity: sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==}
1681 | dev: true
1682 |
1683 | /regjsparser@0.9.1:
1684 | resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
1685 | hasBin: true
1686 | dependencies:
1687 | jsesc: 0.5.0
1688 | dev: true
1689 |
1690 | /resolve@1.22.1:
1691 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
1692 | hasBin: true
1693 | dependencies:
1694 | is-core-module: 2.11.0
1695 | path-parse: 1.0.7
1696 | supports-preserve-symlinks-flag: 1.0.0
1697 | dev: true
1698 |
1699 | /rollup-plugin-vue@6.0.0(@vue/compiler-sfc@3.2.41):
1700 | resolution: {integrity: sha512-oVvUd84d5u73M2HYM3XsMDLtZRIA/tw2U0dmHlXU2UWP5JARYHzh/U9vcxaN/x/9MrepY7VH3pHFeOhrWpxs/Q==}
1701 | peerDependencies:
1702 | '@vue/compiler-sfc': '*'
1703 | dependencies:
1704 | '@vue/compiler-sfc': 3.2.41
1705 | debug: 4.3.4
1706 | hash-sum: 2.0.0
1707 | rollup-pluginutils: 2.8.2
1708 | transitivePeerDependencies:
1709 | - supports-color
1710 | dev: true
1711 |
1712 | /rollup-pluginutils@2.8.2:
1713 | resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
1714 | dependencies:
1715 | estree-walker: 0.6.1
1716 | dev: true
1717 |
1718 | /rollup@3.2.5:
1719 | resolution: {integrity: sha512-/Ha7HhVVofduy+RKWOQJrxe4Qb3xyZo+chcpYiD8SoQa4AG7llhupUtyfKSSrdBM2mWJjhM8wZwmbY23NmlIYw==}
1720 | engines: {node: '>=14.18.0', npm: '>=8.0.0'}
1721 | hasBin: true
1722 | optionalDependencies:
1723 | fsevents: 2.3.2
1724 | dev: true
1725 |
1726 | /semver@6.3.0:
1727 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
1728 | hasBin: true
1729 | dev: true
1730 |
1731 | /source-map-js@1.0.2:
1732 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
1733 | engines: {node: '>=0.10.0'}
1734 | dev: true
1735 |
1736 | /source-map@0.6.1:
1737 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
1738 | engines: {node: '>=0.10.0'}
1739 |
1740 | /sourcemap-codec@1.4.8:
1741 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
1742 | dev: true
1743 |
1744 | /supports-color@5.5.0:
1745 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
1746 | engines: {node: '>=4'}
1747 | dependencies:
1748 | has-flag: 3.0.0
1749 | dev: true
1750 |
1751 | /supports-preserve-symlinks-flag@1.0.0:
1752 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1753 | engines: {node: '>= 0.4'}
1754 | dev: true
1755 |
1756 | /to-fast-properties@2.0.0:
1757 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
1758 | engines: {node: '>=4'}
1759 |
1760 | /unicode-canonical-property-names-ecmascript@2.0.0:
1761 | resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
1762 | engines: {node: '>=4'}
1763 | dev: true
1764 |
1765 | /unicode-match-property-ecmascript@2.0.0:
1766 | resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
1767 | engines: {node: '>=4'}
1768 | dependencies:
1769 | unicode-canonical-property-names-ecmascript: 2.0.0
1770 | unicode-property-aliases-ecmascript: 2.1.0
1771 | dev: true
1772 |
1773 | /unicode-match-property-value-ecmascript@2.0.0:
1774 | resolution: {integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==}
1775 | engines: {node: '>=4'}
1776 | dev: true
1777 |
1778 | /unicode-property-aliases-ecmascript@2.1.0:
1779 | resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
1780 | engines: {node: '>=4'}
1781 | dev: true
1782 |
1783 | /update-browserslist-db@1.0.10(browserslist@4.21.4):
1784 | resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
1785 | hasBin: true
1786 | peerDependencies:
1787 | browserslist: '>= 4.21.0'
1788 | dependencies:
1789 | browserslist: 4.21.4
1790 | escalade: 3.1.1
1791 | picocolors: 1.0.0
1792 | dev: true
1793 |
1794 | /vue-router@4.0.0(vue@3.0.0):
1795 | resolution: {integrity: sha512-RiAsDsSV73TBqppgpAKghb5exHHKsFuTii7hbhj9QHjWJNDE4lBDTr7bVALG9DH9vVcFI+7PUTBGYbytBFsWsQ==}
1796 | peerDependencies:
1797 | vue: ^3.0.0
1798 | dependencies:
1799 | vue: 3.0.0
1800 | dev: false
1801 |
1802 | /vue@3.0.0:
1803 | resolution: {integrity: sha512-ZMrAARZ32sGIaYKr7Fk2GZEBh/VhulSrGxcGBiAvbN4fhjl3tuJyNFbbbLFqGjndbLoBW66I2ECq8ICdvkKdJw==}
1804 | dependencies:
1805 | '@vue/compiler-dom': 3.0.0
1806 | '@vue/runtime-dom': 3.0.0
1807 | '@vue/shared': 3.0.0
1808 | dev: false
1809 |
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | import { babel } from "@rollup/plugin-babel";
2 | import json from "@rollup/plugin-json";
3 | import vuePlugin from "rollup-plugin-vue";
4 | import { readFileSync } from "node:fs";
5 | const pkg = JSON.parse(
6 | readFileSync(new URL("./package.json", import.meta.url))
7 | );
8 |
9 | const banner =
10 | "/*!\n" +
11 | ` * vue-page-stack-router v${pkg.version}\n` +
12 | ` * (c) 2022-${new Date().getFullYear()} JoeshuTT\n` +
13 | " * Released under the MIT License.\n" +
14 | " */";
15 |
16 | export default {
17 | input: "./src/index.js",
18 | output: [
19 | {
20 | file: pkg.module,
21 | format: "esm",
22 | banner,
23 | globals: {
24 | vue: "Vue",
25 | "vue-router": "vue-router",
26 | },
27 | name: "VuePageStackRouter",
28 | },
29 | {
30 | file: pkg.main,
31 | format: "cjs",
32 | banner,
33 | globals: {
34 | vue: "Vue",
35 | "vue-router": "vue-router",
36 | },
37 | name: "VuePageStackRouter",
38 | },
39 | {
40 | file: pkg.browser,
41 | format: "umd",
42 | banner,
43 | globals: {
44 | vue: "Vue",
45 | "vue-router": "vue-router",
46 | },
47 | name: "VuePageStackRouter",
48 | },
49 | ],
50 | external: ["vue", "vue-router"],
51 | plugins: [
52 | babel({ babelHelpers: "bundled", exclude: "node_modules/**" }),
53 | json(),
54 | vuePlugin(),
55 | ],
56 | };
57 |
--------------------------------------------------------------------------------
/src/components/PageStackRouterView.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
26 |
--------------------------------------------------------------------------------
/src/history/common.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 路由跳转,对应着栈的三种操作方式
3 | */
4 | export const navigationType = {
5 | pop: "pop",
6 | push: "push",
7 | replace: "replace",
8 | };
9 |
10 | /**
11 | * 路由导航方向
12 | */
13 | export const navigationDirection = {
14 | back: "back",
15 | forward: "forward",
16 | unknown: "",
17 | };
18 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | export * from "./injectionSymbols";
2 | export * from "./useApi";
3 |
4 | export { createPageStackRouter } from "./pageStackRouter";
5 |
--------------------------------------------------------------------------------
/src/injectionSymbols.js:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | * @internal
4 | */
5 | export const pageStackRouterKey = Symbol("page stack router");
6 |
7 | /**
8 | *
9 | * @internal
10 | */
11 | export const pageStackRouteKey = Symbol("page stack route");
12 |
13 | /**
14 | *
15 | * @internal
16 | */
17 | export const pageStackListKey = Symbol("page stack list");
18 |
--------------------------------------------------------------------------------
/src/pageStackRouter.js:
--------------------------------------------------------------------------------
1 | import { version } from "../package.json";
2 | import { reactive } from "vue";
3 | import PageStackRouterView from "./components/PageStackRouterView.vue";
4 | import { navigationType, navigationDirection } from "./history/common";
5 | import { saveScrollPosition, revertScrollPosition } from "./scrollBehavior";
6 | import {
7 | pageStackRouterKey,
8 | pageStackRouteKey,
9 | pageStackListKey,
10 | } from "./injectionSymbols";
11 | import { getRouteMetaValue } from "./utils/index";
12 |
13 | export function createPageStackRouter(options) {
14 | const currentPage = reactive({});
15 | const pageStackList = reactive([]);
16 |
17 | const {
18 | router,
19 | el = "#app",
20 | max = 10,
21 | disableSaveScrollPosition = false,
22 | } = options;
23 | if (!router) {
24 | throw new Error(`vue-router 实例必须存在!`);
25 | }
26 |
27 | function navigate(to, from) {
28 | const toLocation = getRouteInfo(to);
29 | const fromLocation = getRouteInfo(from);
30 |
31 | if (toLocation.meta.keepAlive) {
32 | const historyState = window.history.state;
33 |
34 | const lastPageState = pageStackList.length
35 | ? pageStackList[pageStackList.length - 1].state
36 | : null;
37 | let delta = lastPageState
38 | ? historyState.position - lastPageState.position
39 | : 0;
40 |
41 | // 在浏览器环境中,浏览器的后退等同于 pop ,前进等同于 push
42 | if (delta > 0) {
43 | toLocation.navigationType = navigationType.push;
44 | toLocation.navigationDirection = navigationDirection.forward;
45 | push(toLocation);
46 | !fromLocation.meta.disableSaveScrollPosition &&
47 | saveScrollPosition(fromLocation, el);
48 | } else if (delta < 0) {
49 | toLocation.navigationType = navigationType.pop;
50 | toLocation.navigationDirection = navigationDirection.back;
51 | pop();
52 | const index = getIndexByName(toLocation.name);
53 | if (~index) {
54 | !toLocation.meta.disableSaveScrollPosition &&
55 | revertScrollPosition(toLocation);
56 | }
57 | } else {
58 | toLocation.navigationType = navigationType.replace;
59 | toLocation.navigationDirection = navigationDirection.unknown;
60 | replace(toLocation);
61 | }
62 | }
63 |
64 | Object.keys(toLocation).forEach((key) => {
65 | currentPage[key] = toLocation[key];
66 | });
67 | }
68 |
69 | /**
70 | * push 方法会在当前栈顶推入一个页面
71 | */
72 | function push(location) {
73 | if (pageStackList.length >= max) {
74 | pageStackList.splice(0, 1);
75 | }
76 |
77 | pageStackList.push(location);
78 | }
79 |
80 | /**
81 | * pop 方法会推出栈顶的一个页面
82 | */
83 | function pop() {
84 | pageStackList.splice(pageStackList.length - 1);
85 | }
86 |
87 | /**
88 | * replace 方法会替换当前栈顶的页面
89 | */
90 | function replace(location) {
91 | const index = getIndexByName(location.name);
92 | if (~index) {
93 | pageStackList.splice(index + 1);
94 | } else {
95 | pageStackList.length && pageStackList.splice(pageStackList.length - 1);
96 | pageStackList.push(location);
97 | }
98 | }
99 |
100 | function getIndexByName(name) {
101 | return pageStackList.findIndex((v) => v.name === name);
102 | }
103 |
104 | function getRouteInfo(location) {
105 | const historyState = window.history.state;
106 |
107 | return {
108 | name: location.name,
109 | path: location.path,
110 | fullPath: location.fullPath,
111 | meta: Object.assign({}, location.meta, {
112 | keepAlive: getRouteMetaValue("keepAlive", true, location.meta),
113 | disableSaveScrollPosition: getRouteMetaValue(
114 | "disableSaveScrollPosition",
115 | disableSaveScrollPosition,
116 | location.meta
117 | ),
118 | }),
119 | state: historyState,
120 | navigationType: "",
121 | navigationDirection: "",
122 | };
123 | }
124 |
125 | const pageStackRouter = {
126 | version,
127 | pageStackList,
128 | currentPage,
129 |
130 | install(app) {
131 | // eslint-disable-next-line @typescript-eslint/no-this-alias
132 | const pageStackRouter = this;
133 |
134 | router.afterEach((to, from) => {
135 | if (to.name) {
136 | navigate(to, from);
137 | }
138 | });
139 |
140 | app.component("PageStackRouterView", PageStackRouterView);
141 |
142 | app.provide(pageStackRouterKey, pageStackRouter);
143 | app.provide(pageStackRouteKey, currentPage);
144 | app.provide(pageStackListKey, pageStackList);
145 | },
146 | };
147 |
148 | return pageStackRouter;
149 | }
150 |
--------------------------------------------------------------------------------
/src/scrollBehavior.js:
--------------------------------------------------------------------------------
1 | const body = document.body;
2 | const screenScrollingElement = document.documentElement;
3 | import { isScrollableNode, getManualScrollingNodes } from "./utils/scroll";
4 | import { nextTick } from "vue";
5 |
6 | export const scrollPositions = new Map();
7 |
8 | /**
9 | * 保存该页面下各个滚动元素的滚动位置
10 | */
11 | export function saveScrollPosition(from, appRoot = "#app") {
12 | // DOM 操作有风险,try catch 护体
13 | try {
14 | const screenNodeList = [screenScrollingElement, body]; // 屏幕滚动容器元素
15 | const appRootNode = document.querySelector(appRoot); // Vue 应用实例挂载容器元素
16 | let pageNodeList = [];
17 |
18 | if (from.meta?.scrollingElement) {
19 | pageNodeList = [
20 | appRootNode,
21 | ...getManualScrollingNodes(from.meta.scrollingElement),
22 | ];
23 | } else {
24 | pageNodeList = [appRootNode, ...appRootNode.querySelectorAll("*")];
25 | }
26 | // prettier-ignore
27 | const scrollableNodeList = [ ...screenNodeList, ...pageNodeList, ].filter(isScrollableNode);
28 |
29 | const saver = scrollableNodeList.map((node) => [
30 | node,
31 | {
32 | left: node.scrollLeft,
33 | top: node.scrollTop,
34 | },
35 | ]);
36 |
37 | const scrollKey = from.fullPath;
38 | scrollPositions.set(scrollKey, saver);
39 | } catch (err) {
40 | console.error("[pageStack saveScrollPosition]", err);
41 | }
42 | }
43 |
44 | export function getSavedScrollPosition(key) {
45 | const scroll = scrollPositions.get(key);
46 |
47 | scrollPositions.delete(key);
48 | return scroll;
49 | }
50 |
51 | /**
52 | * 恢复该页面下各个滚动元素的滚动位置
53 | */
54 | export function revertScrollPosition(to) {
55 | const scrollKey = to.fullPath;
56 | const scrollPosition = getSavedScrollPosition(scrollKey);
57 |
58 | if (scrollPosition) {
59 | // DOM 操作有风险,try catch 护体
60 | try {
61 | nextTick(() => {
62 | scrollPosition.forEach(([node, { left, top }]) => {
63 | left && (node.scrollLeft = left);
64 | top && (node.scrollTop = top);
65 | });
66 | });
67 | } catch (err) {
68 | console.error("[pageStack revertScrollPosition]", err);
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/src/useApi.js:
--------------------------------------------------------------------------------
1 | import { inject } from 'vue';
2 | import { pageStackRouterKey, pageStackRouteKey, pageStackListKey } from './injectionSymbols';
3 |
4 | /**
5 | * 返回 PageStackRouter 实例
6 | */
7 | export function usePageStackRouter() {
8 | return inject(pageStackRouterKey);
9 | }
10 |
11 | /**
12 | * 返回 PageStackRouter 当前页面
13 | */
14 | export function usePageStackRoute() {
15 | return inject(pageStackRouteKey);
16 | }
17 |
18 | /**
19 | * 返回 PageStackRouter 页面栈列表
20 | */
21 | export function usePageStackList() {
22 | return inject(pageStackListKey);
23 | }
24 |
--------------------------------------------------------------------------------
/src/utils/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 是否有值
3 | * @param {*} val
4 | */
5 | export function isDef(val) {
6 | return val !== undefined && val !== null;
7 | }
8 |
9 | /**
10 | * 根据 key 获取对应路由元信息字段值,值默认为 `true`
11 | */
12 | export function getRouteMetaValue(key, defaultValue = true, meta = {}) {
13 | let value = meta[key];
14 |
15 | if (!isDef(value)) {
16 | value = defaultValue;
17 | }
18 |
19 | return value;
20 | }
21 |
--------------------------------------------------------------------------------
/src/utils/scroll.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 是否是滚动元素
3 | * @param {Element} node
4 | */
5 | export function isScrollableNode(node) {
6 | if (!node) {
7 | return false;
8 | }
9 |
10 | const overflowScrollReg = /scroll|auto/i;
11 | const { overflow } = window.getComputedStyle(node);
12 |
13 | return overflowScrollReg.test(overflow);
14 | }
15 |
16 | /**
17 | * 获取手动标记的滚动元素的集合
18 | * @param {string | string[]} el
19 | */
20 | export function getManualScrollingNodes(el) {
21 | const elementList = Array.isArray(el) ? [...el] : [...[el]];
22 | return [...new Set(elementList)].map((v) => document.querySelector(v));
23 | }
24 |
25 | /**
26 | * 获取该节点下所有滚动元素的集合
27 | * @param {Element} el
28 | */
29 | export function getScrollableNodes(el) {
30 | return [...el.querySelectorAll("*"), el].filter(isScrollableNode);
31 | }
32 |
--------------------------------------------------------------------------------
/types/index.d.ts:
--------------------------------------------------------------------------------
1 | declare module 'vue-page-stack-router';
--------------------------------------------------------------------------------