├── .gitignore ├── src ├── vite.env.d.ts ├── demo │ ├── index.html │ ├── index.tsx │ ├── instructions.tsx │ └── hackernews.tsx └── index.ts ├── assets └── image.png ├── tsconfig.json ├── vite.config.demo.js ├── vite.config.js ├── .github └── workflows │ └── deploy_pages.yml ├── LICENSE ├── package.json ├── README.md └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | /dist 3 | /demo 4 | -------------------------------------------------------------------------------- /src/vite.env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KrofDrakula/preact-perf-profiler/HEAD/assets/image.png -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "lib": ["DOM", "ESNext"], 5 | "module": "ESNext", 6 | "moduleResolution": "NodeNext", 7 | "jsx": "react-jsx", 8 | "jsxImportSource": "preact", 9 | "strict": true 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Preact Perf Profiler example 6 | 7 | 8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /vite.config.demo.js: -------------------------------------------------------------------------------- 1 | import { resolve } from "node:path"; 2 | import { defineConfig } from "vite"; 3 | 4 | export default defineConfig({ 5 | esbuild: { 6 | jsxImportSource: "preact", 7 | }, 8 | build: { 9 | outDir: resolve(__dirname, "demo"), 10 | sourcemap: true, 11 | target: "esnext", 12 | emptyOutDir: true, 13 | }, 14 | root: "./src/demo", 15 | }); 16 | -------------------------------------------------------------------------------- /src/demo/index.tsx: -------------------------------------------------------------------------------- 1 | import { render } from "preact"; 2 | import { track } from "../index.js"; 3 | import Hackernews from "./hackernews.js"; 4 | import Instructions from "./instructions.js"; 5 | 6 | const root = document.getElementById("app")!; 7 | 8 | track(Hackernews); 9 | 10 | render( 11 | <> 12 | 13 | 14 | , 15 | root 16 | ); 17 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { resolve } from "node:path"; 2 | import { defineConfig } from "vite"; 3 | import dts from "vite-plugin-dts"; 4 | 5 | export default defineConfig({ 6 | build: { 7 | lib: { 8 | entry: resolve(__dirname, "src/index.ts"), 9 | name: "PreactPerfProfiler", 10 | fileName: "index", 11 | }, 12 | sourcemap: true, 13 | target: "esnext", 14 | emptyOutDir: true, 15 | reportCompressedSize: true, 16 | rollupOptions: { 17 | external: ["preact"], 18 | }, 19 | }, 20 | plugins: [dts({ entryRoot: "src" })], 21 | }); 22 | -------------------------------------------------------------------------------- /.github/workflows/deploy_pages.yml: -------------------------------------------------------------------------------- 1 | name: deploy-pages 2 | run-name: Deploy demo to GitHub Pages 3 | on: 4 | push: 5 | branches: 6 | - master 7 | jobs: 8 | build-pages: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v3 12 | - uses: pnpm/action-setup@v2 13 | with: 14 | version: "latest" 15 | - uses: actions/setup-node@v3 16 | with: 17 | node-version: "18.x" 18 | cache: "pnpm" 19 | - run: pnpm install 20 | - run: pnpm run build-demo --base=/preact-perf-profiler/ 21 | - uses: actions/upload-pages-artifact@v1 22 | with: 23 | path: "demo" 24 | deploy-pages: 25 | runs-on: ubuntu-latest 26 | needs: build-pages 27 | permissions: 28 | pages: write # to deploy to Pages 29 | id-token: write # to verify the deployment originates from an appropriate source 30 | steps: 31 | - uses: actions/deploy-pages@v2 32 | -------------------------------------------------------------------------------- /src/demo/instructions.tsx: -------------------------------------------------------------------------------- 1 | export default () => ( 2 | <> 3 |

4 | preact-perf-profiler demo 5 |

6 |

7 | 11 | github.com/krofdrakula/preact-perf-profiler 12 | 13 |

14 |

15 | This demo loads top stories from{" "} 16 | 17 | Hackernews 18 | {" "} 19 | and renders a table. It tracks this component's rendering performance by 20 | injecting performance.mark() and{" "} 21 | performance.measure() calls during component rendering to 22 | mark locations on the Dev Tools timeline. 23 |

24 |

25 | To see how the table component performs on this page, record a timeline in 26 | the Performance tab in Dev Tools and you should be able to see timings in 27 | the User Timings section. 28 |

29 | 30 | ); 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Klemen Slavič 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "preact-perf-profiler", 3 | "version": "2.0.1", 4 | "description": "A utility for measuring rendering performance with Preact", 5 | "author": "Klemen Slavič (https://krofdrakula.github.io/)", 6 | "license": "MIT", 7 | "bugs": { 8 | "url": "https://github.com/krofdrakula/preact-perf-profiler/issues" 9 | }, 10 | "homepage": "https://github.com/krofdrakula/preact-perf-profiler#readme", 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/krofdrakula/preact-perf-profiler.git" 14 | }, 15 | "keywords": [ 16 | "preact", 17 | "performance" 18 | ], 19 | "type": "module", 20 | "main": "dist/index.umd.cjs", 21 | "umd:main": "dist/index.umd.cjs", 22 | "module": "dist/index.js", 23 | "types": "dist/index.d.ts", 24 | "exports": { 25 | ".": { 26 | "types": "./dist/index.d.ts", 27 | "import": "./dist/index.js", 28 | "require": "./dist/index.umd.cjs" 29 | } 30 | }, 31 | "files": [ 32 | "./dist", 33 | "./src", 34 | "./README.md", 35 | "./LICENSE", 36 | "./package.json", 37 | "./tsconfig.json" 38 | ], 39 | "scripts": { 40 | "build": "vite build", 41 | "build-demo": "vite build --config vite.config.demo.js", 42 | "dev": "vite --config vite.config.demo.js", 43 | "prepublish": "vite build" 44 | }, 45 | "peerDependencies": { 46 | "preact": ">=10" 47 | }, 48 | "devDependencies": { 49 | "preact": ">=10", 50 | "vite": "^4.4.3", 51 | "vite-plugin-dts": "^3.2.0" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { options, Options, ComponentType, VNode } from "preact"; 2 | 3 | type OptionsWithInternals = Options & { 4 | _diff?: (vnode: VNode) => void; 5 | __b: (vnode: VNode) => void; 6 | }; 7 | 8 | // aliasing to provide internal options 9 | const opts = options as OptionsWithInternals; 10 | let id = 0; 11 | 12 | const trackedComponents = new Set(); 13 | 14 | const isTracking = (vnode: VNode) => 15 | typeof vnode.type != "string" && trackedComponents.has(vnode.type); 16 | 17 | const originals = { ...opts }; 18 | 19 | const marks: string[] = []; 20 | 21 | opts._diff = opts.__b = (vnode) => { 22 | if (isTracking(vnode)) { 23 | marks.push(`component_${id++}`); 24 | performance.mark(marks.at(-1)!); 25 | } 26 | return originals._diff?.(vnode); 27 | }; 28 | 29 | opts.diffed = (vnode) => { 30 | if (isTracking(vnode)) { 31 | const component = vnode.type as ComponentType; 32 | const startMark = marks.pop(); 33 | if (startMark) { 34 | const endMark = `${startMark}_end`; 35 | performance.mark(endMark); 36 | performance.measure( 37 | `⚛️ ${component.displayName ?? component.name ?? "component"}`, 38 | startMark, 39 | endMark 40 | ); 41 | performance.clearMarks(startMark); 42 | performance.clearMarks(endMark); 43 | } else if (import.meta.env.DEV) { 44 | console.error(`Cannot find start mark for `, vnode); 45 | } 46 | } 47 | originals.diffed?.(vnode); 48 | }; 49 | 50 | export const track = >(component: T): void => { 51 | trackedComponents.add(component); 52 | }; 53 | 54 | export const untrack = >(component: T): void => { 55 | trackedComponents.delete(component); 56 | }; 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `preact-perf-profiler` 2 | 3 | ![GZip Size](https://badgen.net/bundlephobia/minzip/preact-perf-profiler) 4 | ![Dependency Count](https://badgen.net/bundlephobia/dependency-count/preact-perf-profiler) 5 | ![Tree Shaking](https://badgen.net/bundlephobia/tree-shaking/preact-perf-profiler) 6 | 7 | This library allows you to register a Preact component for measuring its rendering performance using the [User Timing Performance API](https://developer.mozilla.org/en-US/docs/Web/API/Performance_API/User_timing). The measurements show up in the Performance tab timeline in Chromium-based browsers and Firefox browsers and are available through the [`PerformanceObserver` API](https://developer.mozilla.org/en-US/docs/Web/API/Performance_API/Performance_data) if you would like to collect remote telemetry from clients. 8 | 9 | ## Demo 10 | 11 | Open [the demo site](https://krofdrakula.github.io/preact-perf-profiler/) to see it in action. 12 | 13 | You can also check out the demo locally and run it on your own machine: 14 | 15 | ```bash 16 | pnpm install 17 | pnpm run dev 18 | ``` 19 | 20 | Open Dev Tools and you should be able to see the performance measure for the tracked component: 21 | 22 | ![Alt text](assets/image.png) 23 | 24 | ## Usage 25 | 26 | The API consist of two methods that take a component class or function and returns it: 27 | 28 | - `track(k: ComponentType) => void` 29 | - `untrack(k: ComponentType) => void` 30 | 31 | Registering a component adds that component to a `Set` of components. This means that multiple registrations will only add the tracked component once. Same for unregistering. 32 | 33 | The easiest way to track a component is to register it where it is defined: 34 | 35 | ```ts 36 | import { track } from "preact-perf-profiler"; 37 | 38 | const MyComponent = () =>
Hello!
; 39 | 40 | export default MyComponent; 41 | 42 | track(MyComponent); 43 | ``` 44 | 45 | If you do not control the source of the component, you can start tracking the component after importing it elsewhere: 46 | 47 | ```ts 48 | import { track } from "preact-perf-profiler"; 49 | import MyComponent from "./my-component.tsx"; 50 | 51 | track(MyComponent); 52 | 53 | const MyOtherComponent = () => ; 54 | 55 | export default MyOtherComponent; 56 | ``` 57 | -------------------------------------------------------------------------------- /src/demo/hackernews.tsx: -------------------------------------------------------------------------------- 1 | import { FunctionComponent, FunctionalComponent } from "preact"; 2 | import { useEffect, useState } from "preact/hooks"; 3 | 4 | const chunk = function* (list: Iterable, count: number): Generator { 5 | let buffer: T[] = []; 6 | for (const item of list) { 7 | buffer.push(item); 8 | if (buffer.length == count) { 9 | yield buffer; 10 | buffer = []; 11 | } 12 | } 13 | if (buffer.length > 0) yield buffer; 14 | }; 15 | 16 | interface Props { 17 | maxStories: number; 18 | } 19 | 20 | interface HackernewsItem { 21 | by: string; 22 | descendants: number; 23 | id: number; 24 | kids: number[]; 25 | score: number; 26 | time: number; 27 | title: string; 28 | type: string; 29 | url: string; 30 | } 31 | 32 | const Hackernews: FunctionComponent = ({ maxStories }) => { 33 | const [error, setError] = useState(null); 34 | const [list, setList] = useState(null); 35 | 36 | useEffect(() => { 37 | fetch(`https://hacker-news.firebaseio.com/v0/topstories.json`) 38 | .then((response) => response.json()) 39 | .then((ids) => chunk(ids.slice(0, maxStories), 5)) 40 | .then(async (chunks) => { 41 | let data: HackernewsItem[] = []; 42 | for (const chunk of chunks) { 43 | data.push( 44 | ...(await Promise.all( 45 | chunk.map((id) => 46 | fetch( 47 | `https://hacker-news.firebaseio.com/v0/item/${id}.json` 48 | ).then((response) => response.json()) 49 | ) 50 | )) 51 | ); 52 | } 53 | setList(data); 54 | }) 55 | .catch((err) => setError(err)); 56 | }, []); 57 | 58 | if (error) { 59 | return ( 60 |
61 |
 62 |           {error.toString()}
 63 |         
64 |
65 | ); 66 | } 67 | 68 | if (!list) { 69 | return
Loading...
; 70 | } 71 | 72 | return ( 73 | <> 74 | 83 |

Hackernews top stories

84 |
85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | {list.map((item) => ( 96 | 97 | 98 | 102 | 107 | 115 | 116 | ))} 117 | 118 |
IDCreatedTitleAuthor
{item.id} 99 | {new Date(item.time).toDateString()} @{" "} 100 | {new Date(item.time).toLocaleTimeString()} 101 | 103 | 104 | {item.title} 105 | 106 | 108 | 112 | {item.by} 113 | 114 |
119 |
120 | 121 | ); 122 | }; 123 | 124 | export default Hackernews; 125 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | devDependencies: 8 | preact: 9 | specifier: '>=10' 10 | version: 10.16.0 11 | vite: 12 | specifier: ^4.4.3 13 | version: 4.4.3 14 | vite-plugin-dts: 15 | specifier: ^3.2.0 16 | version: 3.2.0(typescript@5.1.6) 17 | 18 | packages: 19 | 20 | /@babel/helper-string-parser@7.22.5: 21 | resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} 22 | engines: {node: '>=6.9.0'} 23 | dev: true 24 | 25 | /@babel/helper-validator-identifier@7.22.5: 26 | resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} 27 | engines: {node: '>=6.9.0'} 28 | dev: true 29 | 30 | /@babel/parser@7.22.7: 31 | resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} 32 | engines: {node: '>=6.0.0'} 33 | hasBin: true 34 | dependencies: 35 | '@babel/types': 7.22.5 36 | dev: true 37 | 38 | /@babel/types@7.22.5: 39 | resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} 40 | engines: {node: '>=6.9.0'} 41 | dependencies: 42 | '@babel/helper-string-parser': 7.22.5 43 | '@babel/helper-validator-identifier': 7.22.5 44 | to-fast-properties: 2.0.0 45 | dev: true 46 | 47 | /@esbuild/android-arm64@0.18.11: 48 | resolution: {integrity: sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==} 49 | engines: {node: '>=12'} 50 | cpu: [arm64] 51 | os: [android] 52 | requiresBuild: true 53 | dev: true 54 | optional: true 55 | 56 | /@esbuild/android-arm@0.18.11: 57 | resolution: {integrity: sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==} 58 | engines: {node: '>=12'} 59 | cpu: [arm] 60 | os: [android] 61 | requiresBuild: true 62 | dev: true 63 | optional: true 64 | 65 | /@esbuild/android-x64@0.18.11: 66 | resolution: {integrity: sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==} 67 | engines: {node: '>=12'} 68 | cpu: [x64] 69 | os: [android] 70 | requiresBuild: true 71 | dev: true 72 | optional: true 73 | 74 | /@esbuild/darwin-arm64@0.18.11: 75 | resolution: {integrity: sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==} 76 | engines: {node: '>=12'} 77 | cpu: [arm64] 78 | os: [darwin] 79 | requiresBuild: true 80 | dev: true 81 | optional: true 82 | 83 | /@esbuild/darwin-x64@0.18.11: 84 | resolution: {integrity: sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==} 85 | engines: {node: '>=12'} 86 | cpu: [x64] 87 | os: [darwin] 88 | requiresBuild: true 89 | dev: true 90 | optional: true 91 | 92 | /@esbuild/freebsd-arm64@0.18.11: 93 | resolution: {integrity: sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==} 94 | engines: {node: '>=12'} 95 | cpu: [arm64] 96 | os: [freebsd] 97 | requiresBuild: true 98 | dev: true 99 | optional: true 100 | 101 | /@esbuild/freebsd-x64@0.18.11: 102 | resolution: {integrity: sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==} 103 | engines: {node: '>=12'} 104 | cpu: [x64] 105 | os: [freebsd] 106 | requiresBuild: true 107 | dev: true 108 | optional: true 109 | 110 | /@esbuild/linux-arm64@0.18.11: 111 | resolution: {integrity: sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==} 112 | engines: {node: '>=12'} 113 | cpu: [arm64] 114 | os: [linux] 115 | requiresBuild: true 116 | dev: true 117 | optional: true 118 | 119 | /@esbuild/linux-arm@0.18.11: 120 | resolution: {integrity: sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==} 121 | engines: {node: '>=12'} 122 | cpu: [arm] 123 | os: [linux] 124 | requiresBuild: true 125 | dev: true 126 | optional: true 127 | 128 | /@esbuild/linux-ia32@0.18.11: 129 | resolution: {integrity: sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==} 130 | engines: {node: '>=12'} 131 | cpu: [ia32] 132 | os: [linux] 133 | requiresBuild: true 134 | dev: true 135 | optional: true 136 | 137 | /@esbuild/linux-loong64@0.18.11: 138 | resolution: {integrity: sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==} 139 | engines: {node: '>=12'} 140 | cpu: [loong64] 141 | os: [linux] 142 | requiresBuild: true 143 | dev: true 144 | optional: true 145 | 146 | /@esbuild/linux-mips64el@0.18.11: 147 | resolution: {integrity: sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==} 148 | engines: {node: '>=12'} 149 | cpu: [mips64el] 150 | os: [linux] 151 | requiresBuild: true 152 | dev: true 153 | optional: true 154 | 155 | /@esbuild/linux-ppc64@0.18.11: 156 | resolution: {integrity: sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==} 157 | engines: {node: '>=12'} 158 | cpu: [ppc64] 159 | os: [linux] 160 | requiresBuild: true 161 | dev: true 162 | optional: true 163 | 164 | /@esbuild/linux-riscv64@0.18.11: 165 | resolution: {integrity: sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==} 166 | engines: {node: '>=12'} 167 | cpu: [riscv64] 168 | os: [linux] 169 | requiresBuild: true 170 | dev: true 171 | optional: true 172 | 173 | /@esbuild/linux-s390x@0.18.11: 174 | resolution: {integrity: sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==} 175 | engines: {node: '>=12'} 176 | cpu: [s390x] 177 | os: [linux] 178 | requiresBuild: true 179 | dev: true 180 | optional: true 181 | 182 | /@esbuild/linux-x64@0.18.11: 183 | resolution: {integrity: sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==} 184 | engines: {node: '>=12'} 185 | cpu: [x64] 186 | os: [linux] 187 | requiresBuild: true 188 | dev: true 189 | optional: true 190 | 191 | /@esbuild/netbsd-x64@0.18.11: 192 | resolution: {integrity: sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==} 193 | engines: {node: '>=12'} 194 | cpu: [x64] 195 | os: [netbsd] 196 | requiresBuild: true 197 | dev: true 198 | optional: true 199 | 200 | /@esbuild/openbsd-x64@0.18.11: 201 | resolution: {integrity: sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==} 202 | engines: {node: '>=12'} 203 | cpu: [x64] 204 | os: [openbsd] 205 | requiresBuild: true 206 | dev: true 207 | optional: true 208 | 209 | /@esbuild/sunos-x64@0.18.11: 210 | resolution: {integrity: sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==} 211 | engines: {node: '>=12'} 212 | cpu: [x64] 213 | os: [sunos] 214 | requiresBuild: true 215 | dev: true 216 | optional: true 217 | 218 | /@esbuild/win32-arm64@0.18.11: 219 | resolution: {integrity: sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==} 220 | engines: {node: '>=12'} 221 | cpu: [arm64] 222 | os: [win32] 223 | requiresBuild: true 224 | dev: true 225 | optional: true 226 | 227 | /@esbuild/win32-ia32@0.18.11: 228 | resolution: {integrity: sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==} 229 | engines: {node: '>=12'} 230 | cpu: [ia32] 231 | os: [win32] 232 | requiresBuild: true 233 | dev: true 234 | optional: true 235 | 236 | /@esbuild/win32-x64@0.18.11: 237 | resolution: {integrity: sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==} 238 | engines: {node: '>=12'} 239 | cpu: [x64] 240 | os: [win32] 241 | requiresBuild: true 242 | dev: true 243 | optional: true 244 | 245 | /@microsoft/api-extractor-model@7.27.4: 246 | resolution: {integrity: sha512-HjqQFmuGPOS20rtnu+9Jj0QrqZyR59E+piUWXPMZTTn4jaZI+4UmsHSf3Id8vyueAhOBH2cgwBuRTE5R+MfSMw==} 247 | dependencies: 248 | '@microsoft/tsdoc': 0.14.2 249 | '@microsoft/tsdoc-config': 0.16.2 250 | '@rushstack/node-core-library': 3.59.5 251 | transitivePeerDependencies: 252 | - '@types/node' 253 | dev: true 254 | 255 | /@microsoft/api-extractor@7.36.1: 256 | resolution: {integrity: sha512-2SPp1jq6wDY5IOsRLUv/4FxngslctBZJlztAJ3uWpCAwqKQG7ESdL3DhEza+StbYLtBQmu1Pk6q1Vkhl7qD/bg==} 257 | hasBin: true 258 | dependencies: 259 | '@microsoft/api-extractor-model': 7.27.4 260 | '@microsoft/tsdoc': 0.14.2 261 | '@microsoft/tsdoc-config': 0.16.2 262 | '@rushstack/node-core-library': 3.59.5 263 | '@rushstack/rig-package': 0.4.0 264 | '@rushstack/ts-command-line': 4.15.1 265 | colors: 1.2.5 266 | lodash: 4.17.21 267 | resolve: 1.22.2 268 | semver: 7.3.8 269 | source-map: 0.6.1 270 | typescript: 5.0.4 271 | transitivePeerDependencies: 272 | - '@types/node' 273 | dev: true 274 | 275 | /@microsoft/tsdoc-config@0.16.2: 276 | resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} 277 | dependencies: 278 | '@microsoft/tsdoc': 0.14.2 279 | ajv: 6.12.6 280 | jju: 1.4.0 281 | resolve: 1.19.0 282 | dev: true 283 | 284 | /@microsoft/tsdoc@0.14.2: 285 | resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} 286 | dev: true 287 | 288 | /@rollup/pluginutils@5.0.2(rollup@3.26.2): 289 | resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} 290 | engines: {node: '>=14.0.0'} 291 | peerDependencies: 292 | rollup: ^1.20.0||^2.0.0||^3.0.0 293 | peerDependenciesMeta: 294 | rollup: 295 | optional: true 296 | dependencies: 297 | '@types/estree': 1.0.1 298 | estree-walker: 2.0.2 299 | picomatch: 2.3.1 300 | rollup: 3.26.2 301 | dev: true 302 | 303 | /@rushstack/node-core-library@3.59.5: 304 | resolution: {integrity: sha512-1IpV7LufrI1EoVO8hYsb3t6L8L+yp40Sa0OaOV2CIu1zx4e6ZeVNaVIEXFgMXBKdGXkAh21MnCaIzlDNpG6ZQw==} 305 | peerDependencies: 306 | '@types/node': '*' 307 | peerDependenciesMeta: 308 | '@types/node': 309 | optional: true 310 | dependencies: 311 | colors: 1.2.5 312 | fs-extra: 7.0.1 313 | import-lazy: 4.0.0 314 | jju: 1.4.0 315 | resolve: 1.22.2 316 | semver: 7.3.8 317 | z-schema: 5.0.5 318 | dev: true 319 | 320 | /@rushstack/rig-package@0.4.0: 321 | resolution: {integrity: sha512-FnM1TQLJYwSiurP6aYSnansprK5l8WUK8VG38CmAaZs29ZeL1msjK0AP1VS4ejD33G0kE/2cpsPsS9jDenBMxw==} 322 | dependencies: 323 | resolve: 1.22.2 324 | strip-json-comments: 3.1.1 325 | dev: true 326 | 327 | /@rushstack/ts-command-line@4.15.1: 328 | resolution: {integrity: sha512-EL4jxZe5fhb1uVL/P/wQO+Z8Rc8FMiWJ1G7VgnPDvdIt5GVjRfK7vwzder1CZQiX3x0PY6uxENYLNGTFd1InRQ==} 329 | dependencies: 330 | '@types/argparse': 1.0.38 331 | argparse: 1.0.10 332 | colors: 1.2.5 333 | string-argv: 0.3.2 334 | dev: true 335 | 336 | /@types/argparse@1.0.38: 337 | resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} 338 | dev: true 339 | 340 | /@types/estree@1.0.1: 341 | resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} 342 | dev: true 343 | 344 | /@volar/language-core@1.8.0: 345 | resolution: {integrity: sha512-ZHTvZPM3pEbOOuaq+ybNz5TQlHUqPQPK0G1+SonvApGq0e3qgGijjhtL5T7hsCtUEmxfix8FrAuCH14tMBOhTg==} 346 | dependencies: 347 | '@volar/source-map': 1.8.0 348 | dev: true 349 | 350 | /@volar/source-map@1.8.0: 351 | resolution: {integrity: sha512-d35aV0yFkIrkynRSKgrN5hgbMv6ekkFvcJsJGmOZ8UEjqLStto9zq7RSvpp6/PZ7/pa4Gn1f6K1qDt0bq0oUew==} 352 | dependencies: 353 | muggle-string: 0.3.1 354 | dev: true 355 | 356 | /@volar/typescript@1.8.0: 357 | resolution: {integrity: sha512-T/U1XLLhXv6tNr40Awznfc6QZWizSL99t6M0DeXtIMbnvSCqjjCVRnwlsq+DK9C1RlO3k8+i0Z8iJn7O1GGtoA==} 358 | dependencies: 359 | '@volar/language-core': 1.8.0 360 | dev: true 361 | 362 | /@vue/compiler-core@3.3.4: 363 | resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} 364 | dependencies: 365 | '@babel/parser': 7.22.7 366 | '@vue/shared': 3.3.4 367 | estree-walker: 2.0.2 368 | source-map-js: 1.0.2 369 | dev: true 370 | 371 | /@vue/compiler-dom@3.3.4: 372 | resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} 373 | dependencies: 374 | '@vue/compiler-core': 3.3.4 375 | '@vue/shared': 3.3.4 376 | dev: true 377 | 378 | /@vue/language-core@1.8.4(typescript@5.1.6): 379 | resolution: {integrity: sha512-pnNtNcJVfkGYluW0vsVO+Y1gyX+eA0voaS7+1JOhCp5zKeCaL/PAmGYOgfvwML62neL+2H8pnhY7sffmrGpEhw==} 380 | peerDependencies: 381 | typescript: '*' 382 | peerDependenciesMeta: 383 | typescript: 384 | optional: true 385 | dependencies: 386 | '@volar/language-core': 1.8.0 387 | '@volar/source-map': 1.8.0 388 | '@vue/compiler-dom': 3.3.4 389 | '@vue/reactivity': 3.3.4 390 | '@vue/shared': 3.3.4 391 | minimatch: 9.0.3 392 | muggle-string: 0.3.1 393 | typescript: 5.1.6 394 | vue-template-compiler: 2.7.14 395 | dev: true 396 | 397 | /@vue/reactivity@3.3.4: 398 | resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} 399 | dependencies: 400 | '@vue/shared': 3.3.4 401 | dev: true 402 | 403 | /@vue/shared@3.3.4: 404 | resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} 405 | dev: true 406 | 407 | /@vue/typescript@1.8.4(typescript@5.1.6): 408 | resolution: {integrity: sha512-sioQfIY5xcmEAz+cPLvv6CtzGPtGhIdR0Za87zB8M4mPe4OSsE3MBGkXcslf+EzQgF+fm6Gr1SRMSX8r5ZmzDA==} 409 | dependencies: 410 | '@volar/typescript': 1.8.0 411 | '@vue/language-core': 1.8.4(typescript@5.1.6) 412 | transitivePeerDependencies: 413 | - typescript 414 | dev: true 415 | 416 | /ajv@6.12.6: 417 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 418 | dependencies: 419 | fast-deep-equal: 3.1.3 420 | fast-json-stable-stringify: 2.1.0 421 | json-schema-traverse: 0.4.1 422 | uri-js: 4.4.1 423 | dev: true 424 | 425 | /argparse@1.0.10: 426 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 427 | dependencies: 428 | sprintf-js: 1.0.3 429 | dev: true 430 | 431 | /balanced-match@1.0.2: 432 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 433 | dev: true 434 | 435 | /brace-expansion@2.0.1: 436 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 437 | dependencies: 438 | balanced-match: 1.0.2 439 | dev: true 440 | 441 | /colors@1.2.5: 442 | resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} 443 | engines: {node: '>=0.1.90'} 444 | dev: true 445 | 446 | /commander@9.5.0: 447 | resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} 448 | engines: {node: ^12.20.0 || >=14} 449 | requiresBuild: true 450 | dev: true 451 | optional: true 452 | 453 | /de-indent@1.0.2: 454 | resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} 455 | dev: true 456 | 457 | /debug@4.3.4: 458 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 459 | engines: {node: '>=6.0'} 460 | peerDependencies: 461 | supports-color: '*' 462 | peerDependenciesMeta: 463 | supports-color: 464 | optional: true 465 | dependencies: 466 | ms: 2.1.2 467 | dev: true 468 | 469 | /esbuild@0.18.11: 470 | resolution: {integrity: sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==} 471 | engines: {node: '>=12'} 472 | hasBin: true 473 | requiresBuild: true 474 | optionalDependencies: 475 | '@esbuild/android-arm': 0.18.11 476 | '@esbuild/android-arm64': 0.18.11 477 | '@esbuild/android-x64': 0.18.11 478 | '@esbuild/darwin-arm64': 0.18.11 479 | '@esbuild/darwin-x64': 0.18.11 480 | '@esbuild/freebsd-arm64': 0.18.11 481 | '@esbuild/freebsd-x64': 0.18.11 482 | '@esbuild/linux-arm': 0.18.11 483 | '@esbuild/linux-arm64': 0.18.11 484 | '@esbuild/linux-ia32': 0.18.11 485 | '@esbuild/linux-loong64': 0.18.11 486 | '@esbuild/linux-mips64el': 0.18.11 487 | '@esbuild/linux-ppc64': 0.18.11 488 | '@esbuild/linux-riscv64': 0.18.11 489 | '@esbuild/linux-s390x': 0.18.11 490 | '@esbuild/linux-x64': 0.18.11 491 | '@esbuild/netbsd-x64': 0.18.11 492 | '@esbuild/openbsd-x64': 0.18.11 493 | '@esbuild/sunos-x64': 0.18.11 494 | '@esbuild/win32-arm64': 0.18.11 495 | '@esbuild/win32-ia32': 0.18.11 496 | '@esbuild/win32-x64': 0.18.11 497 | dev: true 498 | 499 | /estree-walker@2.0.2: 500 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 501 | dev: true 502 | 503 | /fast-deep-equal@3.1.3: 504 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 505 | dev: true 506 | 507 | /fast-json-stable-stringify@2.1.0: 508 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 509 | dev: true 510 | 511 | /fs-extra@7.0.1: 512 | resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 513 | engines: {node: '>=6 <7 || >=8'} 514 | dependencies: 515 | graceful-fs: 4.2.11 516 | jsonfile: 4.0.0 517 | universalify: 0.1.2 518 | dev: true 519 | 520 | /fsevents@2.3.2: 521 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 522 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 523 | os: [darwin] 524 | requiresBuild: true 525 | dev: true 526 | optional: true 527 | 528 | /function-bind@1.1.1: 529 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 530 | dev: true 531 | 532 | /graceful-fs@4.2.11: 533 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 534 | dev: true 535 | 536 | /has@1.0.3: 537 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 538 | engines: {node: '>= 0.4.0'} 539 | dependencies: 540 | function-bind: 1.1.1 541 | dev: true 542 | 543 | /he@1.2.0: 544 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 545 | hasBin: true 546 | dev: true 547 | 548 | /import-lazy@4.0.0: 549 | resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} 550 | engines: {node: '>=8'} 551 | dev: true 552 | 553 | /is-core-module@2.12.1: 554 | resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} 555 | dependencies: 556 | has: 1.0.3 557 | dev: true 558 | 559 | /jju@1.4.0: 560 | resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} 561 | dev: true 562 | 563 | /json-schema-traverse@0.4.1: 564 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 565 | dev: true 566 | 567 | /jsonfile@4.0.0: 568 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 569 | optionalDependencies: 570 | graceful-fs: 4.2.11 571 | dev: true 572 | 573 | /kolorist@1.8.0: 574 | resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} 575 | dev: true 576 | 577 | /lodash.get@4.4.2: 578 | resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} 579 | dev: true 580 | 581 | /lodash.isequal@4.5.0: 582 | resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} 583 | dev: true 584 | 585 | /lodash@4.17.21: 586 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 587 | dev: true 588 | 589 | /lru-cache@6.0.0: 590 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 591 | engines: {node: '>=10'} 592 | dependencies: 593 | yallist: 4.0.0 594 | dev: true 595 | 596 | /minimatch@9.0.3: 597 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 598 | engines: {node: '>=16 || 14 >=14.17'} 599 | dependencies: 600 | brace-expansion: 2.0.1 601 | dev: true 602 | 603 | /ms@2.1.2: 604 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 605 | dev: true 606 | 607 | /muggle-string@0.3.1: 608 | resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} 609 | dev: true 610 | 611 | /nanoid@3.3.6: 612 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 613 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 614 | hasBin: true 615 | dev: true 616 | 617 | /path-parse@1.0.7: 618 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 619 | dev: true 620 | 621 | /picocolors@1.0.0: 622 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 623 | dev: true 624 | 625 | /picomatch@2.3.1: 626 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 627 | engines: {node: '>=8.6'} 628 | dev: true 629 | 630 | /postcss@8.4.25: 631 | resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==} 632 | engines: {node: ^10 || ^12 || >=14} 633 | dependencies: 634 | nanoid: 3.3.6 635 | picocolors: 1.0.0 636 | source-map-js: 1.0.2 637 | dev: true 638 | 639 | /preact@10.16.0: 640 | resolution: {integrity: sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA==} 641 | dev: true 642 | 643 | /punycode@2.3.0: 644 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 645 | engines: {node: '>=6'} 646 | dev: true 647 | 648 | /resolve@1.19.0: 649 | resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} 650 | dependencies: 651 | is-core-module: 2.12.1 652 | path-parse: 1.0.7 653 | dev: true 654 | 655 | /resolve@1.22.2: 656 | resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} 657 | hasBin: true 658 | dependencies: 659 | is-core-module: 2.12.1 660 | path-parse: 1.0.7 661 | supports-preserve-symlinks-flag: 1.0.0 662 | dev: true 663 | 664 | /rollup@3.26.2: 665 | resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==} 666 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 667 | hasBin: true 668 | optionalDependencies: 669 | fsevents: 2.3.2 670 | dev: true 671 | 672 | /semver@7.3.8: 673 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} 674 | engines: {node: '>=10'} 675 | hasBin: true 676 | dependencies: 677 | lru-cache: 6.0.0 678 | dev: true 679 | 680 | /semver@7.5.4: 681 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 682 | engines: {node: '>=10'} 683 | hasBin: true 684 | dependencies: 685 | lru-cache: 6.0.0 686 | dev: true 687 | 688 | /source-map-js@1.0.2: 689 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 690 | engines: {node: '>=0.10.0'} 691 | dev: true 692 | 693 | /source-map@0.6.1: 694 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 695 | engines: {node: '>=0.10.0'} 696 | dev: true 697 | 698 | /sprintf-js@1.0.3: 699 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 700 | dev: true 701 | 702 | /string-argv@0.3.2: 703 | resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 704 | engines: {node: '>=0.6.19'} 705 | dev: true 706 | 707 | /strip-json-comments@3.1.1: 708 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 709 | engines: {node: '>=8'} 710 | dev: true 711 | 712 | /supports-preserve-symlinks-flag@1.0.0: 713 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 714 | engines: {node: '>= 0.4'} 715 | dev: true 716 | 717 | /to-fast-properties@2.0.0: 718 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 719 | engines: {node: '>=4'} 720 | dev: true 721 | 722 | /typescript@5.0.4: 723 | resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} 724 | engines: {node: '>=12.20'} 725 | hasBin: true 726 | dev: true 727 | 728 | /typescript@5.1.6: 729 | resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} 730 | engines: {node: '>=14.17'} 731 | hasBin: true 732 | dev: true 733 | 734 | /universalify@0.1.2: 735 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 736 | engines: {node: '>= 4.0.0'} 737 | dev: true 738 | 739 | /uri-js@4.4.1: 740 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 741 | dependencies: 742 | punycode: 2.3.0 743 | dev: true 744 | 745 | /validator@13.9.0: 746 | resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==} 747 | engines: {node: '>= 0.10'} 748 | dev: true 749 | 750 | /vite-plugin-dts@3.2.0(typescript@5.1.6): 751 | resolution: {integrity: sha512-s+dwJvDcb/AWgb49oVbq9JiUSIMwaVpFfV4SVIaBZmv9OZyeyDGxujaq+z4HJ4LB4hUG5c4oRAJyLfV66c763Q==} 752 | engines: {node: ^14.18.0 || >=16.0.0} 753 | peerDependencies: 754 | typescript: '*' 755 | dependencies: 756 | '@microsoft/api-extractor': 7.36.1 757 | '@rollup/pluginutils': 5.0.2(rollup@3.26.2) 758 | '@rushstack/node-core-library': 3.59.5 759 | '@vue/language-core': 1.8.4(typescript@5.1.6) 760 | debug: 4.3.4 761 | kolorist: 1.8.0 762 | typescript: 5.1.6 763 | vue-tsc: 1.8.4(typescript@5.1.6) 764 | optionalDependencies: 765 | rollup: 3.26.2 766 | vite: 4.4.3 767 | transitivePeerDependencies: 768 | - '@types/node' 769 | - less 770 | - lightningcss 771 | - sass 772 | - stylus 773 | - sugarss 774 | - supports-color 775 | - terser 776 | dev: true 777 | 778 | /vite@4.4.3: 779 | resolution: {integrity: sha512-IMnXQXXWgLi5brBQx/4WzDxdzW0X3pjO4nqFJAuNvwKtxzAmPzFE1wszW3VDpAGQJm3RZkm/brzRdyGsnwgJIA==} 780 | engines: {node: ^14.18.0 || >=16.0.0} 781 | hasBin: true 782 | peerDependencies: 783 | '@types/node': '>= 14' 784 | less: '*' 785 | lightningcss: ^1.21.0 786 | sass: '*' 787 | stylus: '*' 788 | sugarss: '*' 789 | terser: ^5.4.0 790 | peerDependenciesMeta: 791 | '@types/node': 792 | optional: true 793 | less: 794 | optional: true 795 | lightningcss: 796 | optional: true 797 | sass: 798 | optional: true 799 | stylus: 800 | optional: true 801 | sugarss: 802 | optional: true 803 | terser: 804 | optional: true 805 | dependencies: 806 | esbuild: 0.18.11 807 | postcss: 8.4.25 808 | rollup: 3.26.2 809 | optionalDependencies: 810 | fsevents: 2.3.2 811 | dev: true 812 | 813 | /vue-template-compiler@2.7.14: 814 | resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} 815 | dependencies: 816 | de-indent: 1.0.2 817 | he: 1.2.0 818 | dev: true 819 | 820 | /vue-tsc@1.8.4(typescript@5.1.6): 821 | resolution: {integrity: sha512-+hgpOhIx11vbi8/AxEdaPj3fiRwN9wy78LpsNNw2V995/IWa6TMyQxHbaw2ZKUpdwjySSHgrT6ohDEhUgFxGYw==} 822 | hasBin: true 823 | peerDependencies: 824 | typescript: '*' 825 | dependencies: 826 | '@vue/language-core': 1.8.4(typescript@5.1.6) 827 | '@vue/typescript': 1.8.4(typescript@5.1.6) 828 | semver: 7.5.4 829 | typescript: 5.1.6 830 | dev: true 831 | 832 | /yallist@4.0.0: 833 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 834 | dev: true 835 | 836 | /z-schema@5.0.5: 837 | resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} 838 | engines: {node: '>=8.0.0'} 839 | hasBin: true 840 | dependencies: 841 | lodash.get: 4.4.2 842 | lodash.isequal: 4.5.0 843 | validator: 13.9.0 844 | optionalDependencies: 845 | commander: 9.5.0 846 | dev: true 847 | --------------------------------------------------------------------------------