├── .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 | 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 | 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'; --------------------------------------------------------------------------------