├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── README_zh.md ├── env.d.ts ├── example ├── App.vue └── main.ts ├── favicon.ico ├── index.html ├── package-lock.json ├── package.json ├── packages ├── assets │ └── icons │ │ ├── arrows-icon.vue │ │ ├── btn-default-icon.vue │ │ ├── btn-error-icon.vue │ │ ├── btn-success-icon.vue │ │ ├── btn-warn-icon.vue │ │ ├── close-icon.vue │ │ ├── loading-icon.vue │ │ └── refresh-icon.vue ├── components │ ├── button │ │ ├── index.ts │ │ ├── index.vue │ │ └── meta │ │ │ ├── config.ts │ │ │ └── types.d.ts │ ├── click │ │ ├── hooks │ │ │ └── handler.ts │ │ ├── index.ts │ │ ├── index.vue │ │ └── meta │ │ │ ├── config.ts │ │ │ ├── data.ts │ │ │ ├── event.ts │ │ │ └── expose.ts │ ├── rotate │ │ ├── hooks │ │ │ └── handler.ts │ │ ├── index.ts │ │ ├── index.vue │ │ └── meta │ │ │ ├── config.ts │ │ │ ├── data.ts │ │ │ ├── event.ts │ │ │ └── expose.ts │ ├── slide-region │ │ ├── hooks │ │ │ └── handler.ts │ │ ├── index.ts │ │ ├── index.vue │ │ └── meta │ │ │ ├── config.ts │ │ │ ├── data.ts │ │ │ ├── event.ts │ │ │ └── expose.ts │ └── slide │ │ ├── hooks │ │ └── handler.ts │ │ ├── index.ts │ │ ├── index.vue │ │ └── meta │ │ ├── config.ts │ │ ├── data.ts │ │ ├── event.ts │ │ └── expose.ts ├── gocaptcha.less ├── helper │ └── helper.ts └── index.ts ├── tsconfig.json ├── vite.config.ts └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | *.ts linguist-language=typescript 2 | *.vue linguist-language=vue -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist-ssr 13 | *.local 14 | dist 15 | 16 | /cypress/videos/ 17 | /cypress/screenshots/ 18 | 19 | # Editor directories and files 20 | .vscode 21 | !.vscode/extensions.json 22 | .idea 23 | *.suo 24 | *.ntvs* 25 | *.njsproj 26 | *.sln 27 | *.sw? 28 | vite.config.ts.timestamp-* 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Awen 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 |
2 | 3 |

Go Captcha

4 |

Behavior Captcha Of Vue

5 | 6 |
7 | 8 |
9 | 10 | > English | [中文](README_zh.md) 11 | 12 |
13 | 14 |

⭐️ If it helps you, please give a star.

15 | 16 | Poster 17 | 18 | 19 | | Vue Version | Go Captcha Version | 20 | |:-----------------------|:------------------:| 21 | | vue >= 2.7.14 && < 3.0 | go-captcha-vue@^1 | 22 | | vue >= 3.0 | go-captcha-vue@^2 | 23 | 24 | ## Install 25 | Greater than or equal to vue2.7.14 and less than vue3.0 26 | ```shell 27 | yarn add go-captcha-vue@^1 28 | # or 29 | npm install go-captcha-vue@^1 30 | # or 31 | pnpm install go-captcha-vue@^1 32 | ``` 33 | 34 | Greater than vue3.0 35 | ```shell 36 | yarn add go-captcha-vue@^2 37 | # or 38 | npm install go-captcha-vue@^2 39 | # or 40 | pnpm install go-captcha-vue@^2 41 | ``` 42 | 43 | ## Use Go Captcha 44 | ```ts 45 | import "go-captcha-vue/dist/style.css" 46 | import GoCaptcha from "go-captcha-vue" 47 | 48 | Vue.use(GoCaptcha) 49 | 50 | // OR 51 | import {Click, Rotate, Slide, SlideRegion, Button} from "go-captcha-vue"; 52 | Vue.component('gocaptcha-click', Click) 53 | Vue.component('gocaptcha-rotate', Rotate) 54 | Vue.component('gocaptcha-slide', Slide) 55 | Vue.component('gocaptcha-slide-region', SlideRegion) 56 | Vue.component('gocaptcha-button', Button) 57 | ``` 58 | 59 | 60 | ## Click Mode 61 | ```vue 62 | 68 | 69 | 75 | ``` 76 | 77 | 78 | ```ts 79 | // config = {} 80 | interface Config { 81 | width?: number; 82 | height?: number; 83 | thumbWidth?: number; 84 | thumbHeight?: number; 85 | verticalPadding?: number; 86 | horizontalPadding?: number; 87 | showTheme?: boolean; 88 | title?: string; 89 | buttonText?: string; 90 | iconSize?: number; 91 | dotSize?: number; 92 | } 93 | 94 | // data = {} 95 | interface Data { 96 | image: string; 97 | thumb: string; 98 | } 99 | 100 | // events = {} 101 | interface Events { 102 | click?: (x: number, y: number) => void; 103 | refresh?: () => void; 104 | close?: () => void; 105 | confirm?: (dots: Array, reset:() => void) => boolean; 106 | } 107 | 108 | // export component method 109 | interface ExportMethods { 110 | reset: () => void, 111 | clear: () => void, 112 | refresh: () => void, 113 | close: () => void, 114 | } 115 | ``` 116 | 117 | ## Slide Mode 118 | ```vue 119 | 125 | 126 | 132 | ``` 133 | 134 | 135 | ```ts 136 | // config = {} 137 | interface SlideConfig { 138 | width?: number; 139 | height?: number; 140 | thumbWidth?: number; 141 | thumbHeight?: number; 142 | verticalPadding?: number; 143 | horizontalPadding?: number; 144 | showTheme?: boolean; 145 | title?: string; 146 | iconSize?: number; 147 | scope ?: boolean; 148 | } 149 | 150 | // data = {} 151 | interface SlideData { 152 | thumbX: number; 153 | thumbY: number; 154 | thumbWidth: number; 155 | thumbHeight: number; 156 | image: string; 157 | thumb: string; 158 | } 159 | 160 | // events = {} 161 | interface SlideEvents { 162 | move?: (x: number, y: number) => void; 163 | refresh?: () => void; 164 | close?: () => void; 165 | confirm?: (point: SlidePoint, reset:() => void) => boolean; 166 | } 167 | 168 | // export component method 169 | interface ExportMethods { 170 | reset: () => void, 171 | clear: () => void, 172 | refresh: () => void, 173 | close: () => void, 174 | } 175 | ``` 176 | 177 | ## Drag-And-Drop Mode 178 | ```vue 179 | 185 | 186 | 192 | ``` 193 | 194 | 195 | ```ts 196 | // config = {} 197 | interface SlideRegionConfig { 198 | width?: number; 199 | height?: number; 200 | thumbWidth?: number; 201 | thumbHeight?: number; 202 | verticalPadding?: number; 203 | horizontalPadding?: number; 204 | showTheme?: boolean; 205 | title?: string; 206 | iconSize?: number; 207 | scope ?: boolean; 208 | } 209 | 210 | // data = {} 211 | interface SlideRegionData { 212 | thumbX: number; 213 | thumbY: number; 214 | thumbWidth: number; 215 | thumbHeight: number; 216 | image: string; 217 | thumb: string; 218 | } 219 | 220 | // events = {} 221 | interface SlideRegionEvents { 222 | move?: (x: number, y: number) => void; 223 | refresh?: () => void; 224 | close?: () => void; 225 | confirm?: (point: SlideRegionPoint, reset:() => void) => boolean; 226 | } 227 | 228 | // export component method 229 | interface ExportMethods { 230 | reset: () => void, 231 | clear: () => void, 232 | refresh: () => void, 233 | close: () => void, 234 | } 235 | ``` 236 | 237 | ## Rotation Mode 238 | ```vue 239 | 245 | 246 | 252 | ``` 253 | 254 | 255 | ```ts 256 | // config = {} 257 | interface Config { 258 | width?: number; 259 | height?: number; 260 | thumbWidth?: number; 261 | thumbHeight?: number; 262 | verticalPadding?: number; 263 | horizontalPadding?: number; 264 | showTheme?: boolean; 265 | title?: string; 266 | iconSize?: number; 267 | scope ?: boolean; 268 | } 269 | 270 | // data = {} 271 | interface Data { 272 | angle: number; 273 | image: string; 274 | thumb: string; 275 | thumbSize: number; 276 | } 277 | 278 | // events = {} 279 | interface Events { 280 | rotate?: (angle: number) => void; 281 | refresh?: () => void; 282 | close?: () => void; 283 | confirm?: (angle: number, reset:() => void) => boolean; 284 | } 285 | 286 | // export component method 287 | interface ExportMethods { 288 | reset: () => void, 289 | clear: () => void, 290 | refresh: () => void, 291 | close: () => void, 292 | } 293 | ``` 294 | 295 | 296 | 297 | ## Button 298 | ```vue 299 | 300 | ``` 301 | 302 | 303 | ```ts 304 | interface $Attr { 305 | config?: CaptchaConfig; 306 | disabled?: boolean; 307 | type?: "default" | "warn" | "error" | "success"; 308 | title?: string; 309 | } 310 | 311 | interface $Event { 312 | clickEvent?: ()=>void; // event -> @clickEvent="" 313 | } 314 | 315 | export interface CaptchaConfig { 316 | width?: number; 317 | height?: number; 318 | verticalPadding?: number; 319 | horizontalPadding?: number; 320 | } 321 | ``` 322 | -------------------------------------------------------------------------------- /README_zh.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Go Captcha

4 |

Vue 行为验证码

5 |
6 | 7 |
8 | 9 | > [English](README.md) | 中文 10 | 11 |
12 | 13 |

⭐️ 如果能帮助到你,请随手给点一个star

14 |

QQ交流群:178498936

15 | 16 | Poster 17 | 18 |
19 | 20 | 21 | | Vue Version | Go Captcha Version | 22 | |:-----------------------|:------------------:| 23 | | vue >= 2.7.14 && < 3.0 | go-captcha-vue@^1 | 24 | | vue >= 3.0 | go-captcha-vue@^2 | 25 | 26 | ## 安装 27 | vue版本 >= 2.7.14 并且 < 3.0 28 | ```shell 29 | yarn add go-captcha-vue@^1 30 | # or 31 | npm install go-captcha-vue@^1 32 | # or 33 | pnpm install go-captcha-vue@^1 34 | ``` 35 | 36 | vue版本 >= 3.0 37 | ```shell 38 | yarn add go-captcha-vue@^2 39 | # or 40 | npm install go-captcha-vue@^2 41 | # or 42 | pnpm install go-captcha-vue@^2 43 | ``` 44 | 45 | ## 使用 46 | ```ts 47 | import "go-captcha-vue/dist/style.css" 48 | import GoCaptcha from "go-captcha-vue" 49 | 50 | Vue.use(GoCaptcha) 51 | 52 | // OR 53 | import {Click, Rotate, Slide, SlideRegion, Button} from "go-captcha-vue"; 54 | Vue.component('gocaptcha-click', Click) 55 | Vue.component('gocaptcha-rotate', Rotate) 56 | Vue.component('gocaptcha-slide', Slide) 57 | Vue.component('gocaptcha-slide-region', SlideRegion) 58 | Vue.component('gocaptcha-button', Button) 59 | ``` 60 | 61 | 62 | ## 点选式 63 | ```vue 64 | 70 | 71 | 77 | ``` 78 | 79 | 80 | ```ts 81 | // config = {} 82 | interface Config { 83 | width?: number; 84 | height?: number; 85 | thumbWidth?: number; 86 | thumbHeight?: number; 87 | verticalPadding?: number; 88 | horizontalPadding?: number; 89 | showTheme?: boolean; 90 | title?: string; 91 | buttonText?: string; 92 | iconSize?: number; 93 | dotSize?: number; 94 | } 95 | 96 | // data = {} 97 | interface Data { 98 | image: string; 99 | thumb: string; 100 | } 101 | 102 | // events = {} 103 | interface Events { 104 | click?: (x: number, y: number) => void; 105 | refresh?: () => void; 106 | close?: () => void; 107 | confirm?: (dots: Array, reset:() => void) => boolean; 108 | } 109 | 110 | // export component method 111 | interface ExportMethods { 112 | reset: () => void, 113 | clear: () => void, 114 | refresh: () => void, 115 | close: () => void, 116 | } 117 | ``` 118 | 119 | ## 滑动式 120 | ```vue 121 | 127 | 128 | 134 | ``` 135 | 136 | 137 | ```ts 138 | // config = {} 139 | interface SlideConfig { 140 | width?: number; 141 | height?: number; 142 | thumbWidth?: number; 143 | thumbHeight?: number; 144 | verticalPadding?: number; 145 | horizontalPadding?: number; 146 | showTheme?: boolean; 147 | title?: string; 148 | iconSize?: number; 149 | scope ?: boolean; 150 | } 151 | 152 | // data = {} 153 | interface SlideData { 154 | thumbX: number; 155 | thumbY: number; 156 | thumbWidth: number; 157 | thumbHeight: number; 158 | image: string; 159 | thumb: string; 160 | } 161 | 162 | // events = {} 163 | interface SlideEvents { 164 | move?: (x: number, y: number) => void; 165 | refresh?: () => void; 166 | close?: () => void; 167 | confirm?: (point: SlidePoint, reset:() => void) => boolean; 168 | } 169 | 170 | // export component method 171 | interface ExportMethods { 172 | reset: () => void, 173 | clear: () => void, 174 | refresh: () => void, 175 | close: () => void, 176 | } 177 | ``` 178 | 179 | ## 拖拽式 180 | ```vue 181 | 187 | 188 | 194 | ``` 195 | 196 | 197 | ```ts 198 | // config = {} 199 | interface SlideRegionConfig { 200 | width?: number; 201 | height?: number; 202 | thumbWidth?: number; 203 | thumbHeight?: number; 204 | verticalPadding?: number; 205 | horizontalPadding?: number; 206 | showTheme?: boolean; 207 | title?: string; 208 | iconSize?: number; 209 | scope ?: boolean; 210 | } 211 | 212 | // data = {} 213 | interface SlideRegionData { 214 | thumbX: number; 215 | thumbY: number; 216 | thumbWidth: number; 217 | thumbHeight: number; 218 | image: string; 219 | thumb: string; 220 | } 221 | 222 | // events = {} 223 | interface SlideRegionEvents { 224 | move?: (x: number, y: number) => void; 225 | refresh?: () => void; 226 | close?: () => void; 227 | confirm?: (point: SlideRegionPoint, reset:() => void) => boolean; 228 | } 229 | 230 | // export component method 231 | interface ExportMethods { 232 | reset: () => void, 233 | clear: () => void, 234 | refresh: () => void, 235 | close: () => void, 236 | } 237 | ``` 238 | 239 | ## 旋转式 240 | ```vue 241 | 247 | 248 | 254 | ``` 255 | 256 | 257 | ```ts 258 | // config = {} 259 | interface Config { 260 | width?: number; 261 | height?: number; 262 | thumbWidth?: number; 263 | thumbHeight?: number; 264 | verticalPadding?: number; 265 | horizontalPadding?: number; 266 | showTheme?: boolean; 267 | title?: string; 268 | iconSize?: number; 269 | scope ?: boolean; 270 | } 271 | 272 | // data = {} 273 | interface Data { 274 | angle: number; 275 | image: string; 276 | thumb: string; 277 | thumbSize: number; 278 | } 279 | 280 | // events = {} 281 | interface Events { 282 | rotate?: (angle: number) => void; 283 | refresh?: () => void; 284 | close?: () => void; 285 | confirm?: (angle: number, reset:() => void) => boolean; 286 | } 287 | 288 | // export component method 289 | interface ExportMethods { 290 | reset: () => void, 291 | clear: () => void, 292 | refresh: () => void, 293 | close: () => void, 294 | } 295 | ``` 296 | 297 | 298 | 299 | ## 按钮 300 | ```vue 301 | 302 | ``` 303 | 304 | 305 | ```ts 306 | interface $Attr { 307 | config?: CaptchaConfig; 308 | disabled?: boolean; 309 | type?: "default" | "warn" | "error" | "success"; 310 | title?: string; 311 | } 312 | 313 | interface $Event { 314 | clickEvent?: ()=>void; // event -> @clickEvent="" 315 | } 316 | 317 | export interface CaptchaConfig { 318 | width?: number; 319 | height?: number; 320 | verticalPadding?: number; 321 | horizontalPadding?: number; 322 | } 323 | ``` 324 | 325 | ## 👍 赞助一下 326 | 329 |
-------------------------------------------------------------------------------- /env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module '*.vue' { 4 | import Vue from 'vue' 5 | export default Vue 6 | } 7 | 8 | declare global { 9 | namespace JSX { 10 | interface Element extends VNode {} 11 | interface ElementClass extends Vue {} 12 | interface IntrinsicElements { 13 | [elem: string]: any 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /example/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | 3 | import App from './App.vue' 4 | // import "../dist/style.css" 5 | // @ts-ignore 6 | // import GoCaptcha from "../dist/go-captcha-vue.es" 7 | import GoCaptcha from "../packages"; 8 | 9 | const app = createApp(App) 10 | // use go captcha 11 | app.use(GoCaptcha) 12 | 13 | app.mount('#app') 14 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wenlng/go-captcha-vue/6696f310254abb43be853172b010fac6162e663b/favicon.ico -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | GoCaptchaVue 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "go-captcha-vue", 3 | "version": "2.0.6", 4 | "private": false, 5 | "type": "module", 6 | "license": "MIT", 7 | "email": "wengaolng@gmail.com", 8 | "author": "Awen ", 9 | "description": "GoCaptcha of Vue, which implements click mode, slider mode, drag-drop mode and rotation mode.", 10 | "keywords": [ 11 | "go-captcha-vue", 12 | "go-captcha", 13 | "gocaptcha", 14 | "captcha-vue", 15 | "vue-captcha", 16 | "capts", 17 | "gocapts" 18 | ], 19 | "bugs": { 20 | "url": "https://github.com/wenlng/go-captcha-vue/issues" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "git+https://github.com/wenlng/go-captcha-vue.git" 25 | }, 26 | "homepage": "https://github.com/wenlng/go-captcha-vue", 27 | "main": "dist/go-captcha-vue.umd.js", 28 | "module": "dist/go-captcha-vue.es.js", 29 | "types": "./dist/index.d.ts", 30 | "typings": "./dist/index.d.ts", 31 | "exports": { 32 | ".": { 33 | "import": { 34 | "node": "./dist/go-captcha-vue.es.js", 35 | "default": "./dist/go-captcha-vue.es.js" 36 | }, 37 | "require": "./dist/go-captcha-vue.es.js", 38 | "types": "./dist/index.d.ts" 39 | }, 40 | "./dist/*": "./dist/*", 41 | "./env.d.ts": "./env.d.ts", 42 | "./package.json": "./package.json" 43 | }, 44 | "files": [ 45 | "dist/*", 46 | "env.d.ts" 47 | ], 48 | "scripts": { 49 | "dev": "vite", 50 | "build": "run-p type:check \"build:only {@}\" --", 51 | "build:only": "vite build && run-p tsd", 52 | "tsd": "vue-tsc --rootDir ./packages --declaration --emitDeclarationOnly --noEmit false --outDir ./dist", 53 | "preview": "vite preview --port 5050", 54 | "type:check": "vue-tsc --noEmit -p tsconfig.json" 55 | }, 56 | "peerDependencies": { 57 | "vue": ">=3" 58 | }, 59 | "devDependencies": { 60 | "@types/node": "^16.11.10", 61 | "@vitejs/plugin-vue": "4.4.0", 62 | "@vitejs/plugin-vue-jsx": "^3.1.0", 63 | "autoprefixer": "^10.4.19", 64 | "fast-glob": "^3.3.2", 65 | "less": "^4.2.0", 66 | "less-loader": "^12.2.0", 67 | "npm-run-all2": "^6.2.0", 68 | "ts-morph": "^22.0.0", 69 | "typescript": "~5.4.0", 70 | "vue": "^3.0.0", 71 | "vite": "4.4.11", 72 | "vue-tsc": "^2.0.11" 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /packages/assets/icons/arrows-icon.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /packages/assets/icons/btn-default-icon.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /packages/assets/icons/btn-error-icon.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 20 | 21 | 24 | -------------------------------------------------------------------------------- /packages/assets/icons/btn-success-icon.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | 20 | 23 | -------------------------------------------------------------------------------- /packages/assets/icons/btn-warn-icon.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 20 | 21 | 24 | -------------------------------------------------------------------------------- /packages/assets/icons/close-icon.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | 24 | 27 | -------------------------------------------------------------------------------- /packages/assets/icons/loading-icon.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /packages/assets/icons/refresh-icon.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 33 | 34 | 37 | -------------------------------------------------------------------------------- /packages/components/button/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | import capt from './index.vue' 8 | 9 | // @ts-ignore 10 | capt.name = 'gocaptcha-button' 11 | 12 | // @ts-ignore 13 | capt.install = function(Vue: any) { 14 | Vue.component('gocaptcha-button', capt) 15 | } 16 | export default capt -------------------------------------------------------------------------------- /packages/components/button/index.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 75 | 76 | 230 | -------------------------------------------------------------------------------- /packages/components/button/meta/config.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface ButtonConfig { 8 | width?: number; 9 | height?: number; 10 | verticalPadding?: number; 11 | horizontalPadding?: number; 12 | } 13 | 14 | export const defaultConfig = ():ButtonConfig => ({ 15 | width: 330, 16 | height: 44, 17 | verticalPadding: 12, 18 | horizontalPadding: 16, 19 | }) -------------------------------------------------------------------------------- /packages/components/button/meta/types.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export type ButtonType = "default" | "warn" | "error" | "success" -------------------------------------------------------------------------------- /packages/components/click/hooks/handler.ts: -------------------------------------------------------------------------------- 1 | import {ClickData, ClickDot} from "../meta/data"; 2 | import {ClickEvent} from "../meta/event"; 3 | import {reactive, toRaw} from "vue"; 4 | import {getDomXY} from "@/helper/helper"; 5 | 6 | export function useHandler( 7 | _: ClickData, 8 | event: ClickEvent, 9 | clearCbs: () => void 10 | ) { 11 | const dots = reactive<{list: Array}>({list: []}) 12 | 13 | const clickEvent = (e: Event|any) => { 14 | const dom = e.currentTarget 15 | const xy = getDomXY(dom) 16 | 17 | const mouseX = e.pageX || e.clientX 18 | const mouseY = e.pageY || e.clientY 19 | 20 | const domX = xy.domX 21 | const domY = xy.domY 22 | 23 | const xPos = mouseX - domX; 24 | const yPos = mouseY - domY; 25 | 26 | const xx = parseInt(xPos.toString()) 27 | const yy = parseInt(yPos.toString()) 28 | const date = new Date() 29 | const index = dots.list.length 30 | dots.list.push({key: date.getTime(), index: index + 1, x: xx, y: yy}) 31 | 32 | event.click && event.click(xx, yy) 33 | e.cancelBubble = true 34 | e.preventDefault() 35 | return false 36 | } 37 | 38 | const confirmEvent = (e: Event|any) => { 39 | event.confirm && event.confirm(toRaw(dots.list), () => { 40 | resetData() 41 | }) 42 | e.cancelBubble = true 43 | e.preventDefault() 44 | return false 45 | } 46 | 47 | const closeEvent = (e: Event|any) => { 48 | close() 49 | e.cancelBubble = true 50 | e.preventDefault() 51 | return false 52 | } 53 | 54 | const refreshEvent = (e: Event|any) => { 55 | refresh() 56 | e.cancelBubble = true 57 | e.preventDefault() 58 | return false 59 | } 60 | 61 | const close = () => { 62 | event.close && event.close() 63 | resetData() 64 | } 65 | 66 | const refresh = () => { 67 | event.refresh && event.refresh() 68 | resetData() 69 | } 70 | 71 | const resetData = () => { 72 | dots.list = [] 73 | } 74 | 75 | const clearData = () => { 76 | resetData() 77 | clearCbs && clearCbs() 78 | } 79 | 80 | return { 81 | dots, 82 | clickEvent, 83 | confirmEvent, 84 | closeEvent, 85 | refreshEvent, 86 | resetData, 87 | clearData, 88 | refresh, 89 | close, 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /packages/components/click/index.ts: -------------------------------------------------------------------------------- 1 | import capt from './index.vue' 2 | 3 | // @ts-ignore 4 | capt.name = 'gocaptcha-click' 5 | 6 | // @ts-ignore 7 | capt.install = function(Vue: any) { 8 | Vue.component('gocaptcha-click', capt) 9 | } 10 | export default capt -------------------------------------------------------------------------------- /packages/components/click/index.vue: -------------------------------------------------------------------------------- 1 | 65 | 66 | 159 | 160 | 196 | -------------------------------------------------------------------------------- /packages/components/click/meta/config.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface ClickConfig { 8 | width?: number; 9 | height?: number; 10 | thumbWidth?: number; 11 | thumbHeight?: number; 12 | verticalPadding?: number; 13 | horizontalPadding?: number; 14 | showTheme?: boolean; 15 | title?: string; 16 | buttonText?: string; 17 | iconSize?: number; 18 | dotSize?: number; 19 | } 20 | 21 | export const defaultConfig = ():ClickConfig => ({ 22 | width: 300, 23 | height: 220, 24 | thumbWidth: 150, 25 | thumbHeight: 40, 26 | verticalPadding: 16, 27 | horizontalPadding: 12, 28 | showTheme: true, 29 | title: "请在下图依次点击", 30 | buttonText: "确认", 31 | iconSize: 22, 32 | dotSize: 24, 33 | }) -------------------------------------------------------------------------------- /packages/components/click/meta/data.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | 8 | export interface ClickData { 9 | image: string; 10 | thumb: string; 11 | } 12 | 13 | export interface ClickDot { 14 | key: number, 15 | index: number, 16 | x: number, 17 | y: number, 18 | } -------------------------------------------------------------------------------- /packages/components/click/meta/event.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | import type {ClickDot} from "./data"; 8 | 9 | export interface ClickEvent { 10 | click?: (x: number, y: number) => void; 11 | refresh?: () => void; 12 | close?: () => void; 13 | confirm?:(dots: Array, reset:() => void) => void; 14 | } -------------------------------------------------------------------------------- /packages/components/click/meta/expose.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/011/16 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface ClickExpose { 8 | reset: () => void, 9 | clear: () => void, 10 | refresh: () => void, 11 | close: () => void, 12 | } -------------------------------------------------------------------------------- /packages/components/rotate/hooks/handler.ts: -------------------------------------------------------------------------------- 1 | import {RotateData} from "../meta/data"; 2 | import {RotateEvent} from "../meta/event"; 3 | import {reactive, Ref, watch} from "vue"; 4 | import {checkTargetFather} from "@/helper/helper"; 5 | import {SlideConfig} from "@/components/slide/meta/config"; 6 | 7 | export function useHandler( 8 | data: RotateData, 9 | event: RotateEvent, 10 | config: SlideConfig, 11 | rootRef: Ref, 12 | dragBlockRef: Ref, 13 | dragBarRef: Ref, 14 | clearCbs: () => void 15 | ) { 16 | const state = reactive<{dragLeft: number, thumbAngle: number, isFreeze: boolean}>({dragLeft: 0, thumbAngle: data.angle || 0, isFreeze: false}) 17 | 18 | watch(() => data, (newData, _) => { 19 | if(!state.isFreeze){ 20 | state.thumbAngle = newData.angle || 0 21 | } 22 | },{ deep: true }) 23 | 24 | const dragEvent = (e: Event|any) => { 25 | if (!checkTargetFather(dragBarRef.value, e)) { 26 | return 27 | } 28 | 29 | const touch = e.touches && e.touches[0]; 30 | 31 | const offsetLeft = dragBlockRef.value.offsetLeft 32 | const width = dragBarRef.value.offsetWidth 33 | const blockWidth = dragBlockRef.value.offsetWidth 34 | const maxWidth = width - blockWidth 35 | const maxAngle = 360 36 | const p = (maxAngle - data.angle) / maxWidth 37 | 38 | let angle = 0 39 | let isMoving = false 40 | let tmpLeaveDragEvent: Event|any = null 41 | let startX = 0; 42 | let currentAngle = 0 43 | if (touch) { 44 | startX = touch.pageX - offsetLeft 45 | } else { 46 | startX = e.clientX - offsetLeft 47 | } 48 | 49 | const moveEvent = (e: Event|any) => { 50 | isMoving = true 51 | const mTouche = e.touches && e.touches[0]; 52 | 53 | let left = 0; 54 | if (mTouche) { 55 | left = mTouche.pageX - startX 56 | } else { 57 | left = e.clientX - startX 58 | } 59 | 60 | angle = data.angle + (left * p) 61 | 62 | if (left >= maxWidth) { 63 | state.dragLeft = maxWidth 64 | state.thumbAngle = currentAngle = maxAngle 65 | return 66 | } 67 | 68 | if (left <= 0) { 69 | state.dragLeft = 0 70 | state.thumbAngle = currentAngle = data.angle 71 | return 72 | } 73 | 74 | state.dragLeft = left 75 | state.thumbAngle = currentAngle = angle 76 | 77 | event.rotate && event.rotate(angle) 78 | 79 | e.cancelBubble = true 80 | e.preventDefault() 81 | } 82 | 83 | const upEvent = (e: Event|any) => { 84 | if (!checkTargetFather(dragBarRef.value, e)) { 85 | return 86 | } 87 | 88 | clearEvent() 89 | 90 | if (!isMoving) { 91 | return 92 | } 93 | isMoving = false 94 | 95 | if (currentAngle < 0) { 96 | return 97 | } 98 | 99 | event.confirm && event.confirm(parseInt(currentAngle.toString()), () => { 100 | resetData() 101 | }) 102 | 103 | e.cancelBubble = true 104 | e.preventDefault() 105 | } 106 | 107 | const leaveDragBlockEvent = (e: Event|any) => { 108 | tmpLeaveDragEvent = e 109 | } 110 | 111 | const enterDragBlockEvent = () => { 112 | tmpLeaveDragEvent = null 113 | } 114 | 115 | const leaveUpEvent = (_: Event|any) => { 116 | if(!tmpLeaveDragEvent) { 117 | return 118 | } 119 | 120 | upEvent(tmpLeaveDragEvent) 121 | clearEvent() 122 | } 123 | 124 | const scope = config.scope 125 | const dragDom = scope ? rootRef.value : dragBarRef.value 126 | const scopeDom = scope ? rootRef.value : document.body 127 | 128 | const clearEvent = () => { 129 | scopeDom.removeEventListener("mousemove", moveEvent, false) 130 | scopeDom.removeEventListener("touchmove", moveEvent, { passive: false }) 131 | 132 | dragDom.removeEventListener( "mouseup", upEvent, false) 133 | dragDom.removeEventListener( "mouseenter", enterDragBlockEvent, false) 134 | dragDom.removeEventListener( "mouseleave", leaveDragBlockEvent, false) 135 | dragDom.removeEventListener("touchend", upEvent, false) 136 | 137 | scopeDom.removeEventListener("mouseleave", upEvent, false) 138 | scopeDom.removeEventListener("mouseup", leaveUpEvent, false) 139 | 140 | state.isFreeze = false 141 | } 142 | 143 | state.isFreeze = true 144 | 145 | scopeDom.addEventListener("mousemove", moveEvent, false) 146 | scopeDom.addEventListener("touchmove", moveEvent, { passive: false }) 147 | 148 | dragDom.addEventListener( "mouseup", upEvent, false) 149 | dragDom.addEventListener( "mouseenter", enterDragBlockEvent, false) 150 | dragDom.addEventListener( "mouseleave", leaveDragBlockEvent, false) 151 | dragDom.addEventListener("touchend", upEvent, false) 152 | 153 | scopeDom.addEventListener("mouseleave", upEvent, false) 154 | scopeDom.addEventListener("mouseup", leaveUpEvent, false) 155 | } 156 | 157 | const closeEvent = (e: Event|any) => { 158 | close() 159 | e.cancelBubble = true 160 | e.preventDefault() 161 | return false 162 | } 163 | 164 | const refreshEvent = (e: Event|any) => { 165 | refresh() 166 | e.cancelBubble = true 167 | e.preventDefault() 168 | return false 169 | } 170 | 171 | const close = () => { 172 | event && event.close && event.close() 173 | resetData() 174 | } 175 | 176 | const refresh = () => { 177 | event && event.refresh && event.refresh() 178 | resetData() 179 | } 180 | 181 | const resetData = () => { 182 | state.dragLeft = 0 183 | state.thumbAngle = data.angle 184 | } 185 | 186 | const clearData = () => { 187 | clearCbs && clearCbs() 188 | resetData() 189 | } 190 | 191 | return { 192 | state, 193 | dragEvent, 194 | closeEvent, 195 | refreshEvent, 196 | resetData, 197 | clearData, 198 | refresh, 199 | close, 200 | } 201 | } 202 | -------------------------------------------------------------------------------- /packages/components/rotate/index.ts: -------------------------------------------------------------------------------- 1 | import capt from './index.vue' 2 | 3 | // @ts-ignore 4 | capt.name = 'gocaptcha-rotate' 5 | 6 | // @ts-ignore 7 | capt.install = function(Vue: any) { 8 | Vue.component('gocaptcha-rotate', capt) 9 | } 10 | export default capt -------------------------------------------------------------------------------- /packages/components/rotate/index.vue: -------------------------------------------------------------------------------- 1 | 76 | 77 | 209 | 210 | 296 | -------------------------------------------------------------------------------- /packages/components/rotate/meta/config.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface RotateConfig { 8 | width?: number; 9 | height?: number; 10 | size?: number; 11 | verticalPadding?: number; 12 | horizontalPadding?: number; 13 | showTheme?: boolean; 14 | title?: string; 15 | iconSize?: number; 16 | scope ?: boolean; 17 | } 18 | 19 | export const defaultConfig = ():RotateConfig => ({ 20 | width: 300, 21 | height: 220, 22 | size: 220, 23 | verticalPadding: 16, 24 | horizontalPadding: 12, 25 | showTheme: true, 26 | title: "请拖动滑块完成拼图", 27 | iconSize: 22, 28 | scope: true, 29 | }) 30 | -------------------------------------------------------------------------------- /packages/components/rotate/meta/data.ts: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * @Author Awen 4 | * @Date 2024/06/01 5 | * @Email wengaolng@gmail.com 6 | **/ 7 | 8 | export interface RotateData { 9 | angle: number; 10 | image: string; 11 | thumb: string; 12 | thumbSize: number; 13 | } 14 | 15 | export const defaultRotateData = ():RotateData => ({ 16 | angle: 0, 17 | image: '', 18 | thumb: '', 19 | thumbSize: 0 20 | }) 21 | -------------------------------------------------------------------------------- /packages/components/rotate/meta/event.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface RotateEvent { 8 | rotate?: (angle: number) => void; 9 | refresh?: () => void; 10 | close?: () => void; 11 | confirm?: (angle: number, reset:() => void) => void; 12 | } -------------------------------------------------------------------------------- /packages/components/rotate/meta/expose.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/011/16 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface RotateExpose { 8 | reset: () => void, 9 | clear: () => void, 10 | refresh: () => void, 11 | close: () => void, 12 | } -------------------------------------------------------------------------------- /packages/components/slide-region/hooks/handler.ts: -------------------------------------------------------------------------------- 1 | import {SlideRegionData} from "../meta/data"; 2 | import {SlideRegionEvent} from "../meta/event"; 3 | import {SlideRegionConfig} from "../meta/config"; 4 | import {reactive, Ref, watch} from "vue"; 5 | import {checkTargetFather} from "@/helper/helper"; 6 | 7 | export function useHandler( 8 | data: SlideRegionData, 9 | event: SlideRegionEvent, 10 | config: SlideRegionConfig, 11 | rootRef: Ref, 12 | containerRef: Ref, 13 | tileRef: Ref, 14 | clearCbs: () => void 15 | ) { 16 | const state = reactive<{x: number, y: number, isFreeze: boolean}>({x: data.thumbX || 0, y: data.thumbY || 0, isFreeze: false}) 17 | 18 | watch(() => data, (newData, _) => { 19 | if(!state.isFreeze){ 20 | state.x = newData.thumbX || 0 21 | state.y = newData.thumbY || 0 22 | } 23 | },{ deep: true }) 24 | 25 | const dragEvent = (e: Event|any) => { 26 | if (!checkTargetFather(containerRef.value, e)) { 27 | return 28 | } 29 | 30 | const touch = e.touches && e.touches[0]; 31 | const offsetLeft = tileRef.value.offsetLeft 32 | const offsetTop = tileRef.value.offsetTop 33 | const width = containerRef.value.offsetWidth 34 | const height = containerRef.value.offsetHeight 35 | const tileWidth = tileRef.value.offsetWidth 36 | const tileHeight = tileRef.value.offsetHeight 37 | const maxWidth = width - tileWidth 38 | const maxHeight = height - tileHeight 39 | 40 | let isMoving = false 41 | let tmpLeaveDragEvent: Event|any = null 42 | let startX = 0 43 | let startY = 0 44 | let tileLeft = 0 45 | let tileTop = 0 46 | if (touch) { 47 | startX = touch.pageX - offsetLeft 48 | startY = touch.pageY - offsetTop 49 | } else { 50 | startX = e.clientX - offsetLeft 51 | startY = e.clientY - offsetTop 52 | } 53 | 54 | const moveEvent = (e: Event|any) => { 55 | isMoving = true 56 | const mTouche = e.touches && e.touches[0]; 57 | 58 | let left = 0; 59 | let top = 0; 60 | if (mTouche) { 61 | left = mTouche.pageX - startX 62 | top = mTouche.pageY - startY 63 | } else { 64 | left = e.clientX - startX 65 | top = e.clientY - startY 66 | } 67 | 68 | if (left <= 0) { 69 | left = 0 70 | } 71 | 72 | if (top <= 0) { 73 | top = 0 74 | } 75 | 76 | if (left >= maxWidth) { 77 | left = maxWidth 78 | } 79 | 80 | if (top >= maxHeight) { 81 | top = maxHeight 82 | } 83 | 84 | state.x = left 85 | state.y = top 86 | tileLeft = left 87 | tileTop = top 88 | event.move && event.move(left, top) 89 | 90 | e.cancelBubble = true 91 | e.preventDefault() 92 | } 93 | 94 | const upEvent = (e: Event|any) => { 95 | if (!checkTargetFather(containerRef.value, e)) { 96 | return 97 | } 98 | 99 | clearEvent() 100 | 101 | if (!isMoving) { 102 | return 103 | } 104 | 105 | isMoving = false 106 | 107 | if (tileLeft < 0 || tileTop < 0) { 108 | return 109 | } 110 | 111 | event.confirm && event.confirm({x: tileLeft, y: tileTop}, () => { 112 | resetData() 113 | }) 114 | 115 | e.cancelBubble = true 116 | e.preventDefault() 117 | } 118 | 119 | const leaveDragBlockEvent = (e: Event|any) => { 120 | tmpLeaveDragEvent = e 121 | } 122 | 123 | const enterDragBlockEvent = () => { 124 | tmpLeaveDragEvent = null 125 | } 126 | 127 | const leaveUpEvent = (_: Event|any) => { 128 | if(!tmpLeaveDragEvent) { 129 | return 130 | } 131 | 132 | upEvent(tmpLeaveDragEvent) 133 | clearEvent() 134 | } 135 | 136 | const scope = config.scope 137 | const dragDom = scope ? rootRef.value : containerRef.value 138 | const scopeDom = scope ? rootRef.value : document.body 139 | 140 | const clearEvent = () => { 141 | scopeDom.removeEventListener("mousemove", moveEvent, false) 142 | scopeDom.removeEventListener("touchmove", moveEvent, { passive: false }) 143 | 144 | dragDom.removeEventListener( "mouseup", upEvent, false) 145 | dragDom.removeEventListener( "mouseenter", enterDragBlockEvent, false) 146 | dragDom.removeEventListener( "mouseleave", leaveDragBlockEvent, false) 147 | dragDom.removeEventListener("touchend", upEvent, false) 148 | 149 | scopeDom.removeEventListener("mouseleave", upEvent, false) 150 | scopeDom.removeEventListener("mouseup", leaveUpEvent, false) 151 | 152 | state.isFreeze = false 153 | } 154 | state.isFreeze = true 155 | 156 | scopeDom.addEventListener("mousemove", moveEvent, false) 157 | scopeDom.addEventListener("touchmove", moveEvent, { passive: false }) 158 | 159 | dragDom.addEventListener( "mouseup", upEvent, false) 160 | dragDom.addEventListener( "mouseenter", enterDragBlockEvent, false) 161 | dragDom.addEventListener( "mouseleave", leaveDragBlockEvent, false) 162 | dragDom.addEventListener("touchend", upEvent, false) 163 | 164 | scopeDom.addEventListener("mouseleave", upEvent, false) 165 | scopeDom.addEventListener("mouseup", leaveUpEvent, false) 166 | } 167 | 168 | const closeEvent = (e: Event|any) => { 169 | close() 170 | e.cancelBubble = true 171 | e.preventDefault() 172 | return false 173 | } 174 | 175 | const refreshEvent = (e: Event|any) => { 176 | refresh() 177 | e.cancelBubble = true 178 | e.preventDefault() 179 | return false 180 | } 181 | 182 | const close = () => { 183 | event && event.close && event.close() 184 | resetData() 185 | } 186 | 187 | const refresh = () => { 188 | event && event.refresh && event.refresh() 189 | resetData() 190 | } 191 | 192 | const resetData = () => { 193 | state.x = data.thumbX || 0 194 | state.y = data.thumbY || 0 195 | } 196 | 197 | const clearData = () => { 198 | clearCbs && clearCbs() 199 | resetData() 200 | } 201 | 202 | return { 203 | state, 204 | dragEvent, 205 | closeEvent, 206 | refreshEvent, 207 | resetData, 208 | clearData, 209 | refresh, 210 | close 211 | } 212 | } 213 | -------------------------------------------------------------------------------- /packages/components/slide-region/index.ts: -------------------------------------------------------------------------------- 1 | import capt from './index.vue' 2 | 3 | // @ts-ignore 4 | capt.name = 'gocaptcha-slide-region' 5 | 6 | // @ts-ignore 7 | capt.install = function(Vue: any) { 8 | Vue.component('gocaptcha-slide-region', capt) 9 | } 10 | export default capt -------------------------------------------------------------------------------- /packages/components/slide-region/index.vue: -------------------------------------------------------------------------------- 1 | 56 | 57 | 183 | 184 | 205 | -------------------------------------------------------------------------------- /packages/components/slide-region/meta/config.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface SlideRegionConfig { 8 | width?: number; 9 | height?: number; 10 | verticalPadding?: number; 11 | horizontalPadding?: number; 12 | showTheme?: boolean; 13 | title?: string; 14 | iconSize?: number; 15 | scope ?: boolean; 16 | } 17 | 18 | export const defaultConfig = ():SlideRegionConfig => ({ 19 | width: 300, 20 | height: 220, 21 | verticalPadding: 16, 22 | horizontalPadding: 12, 23 | showTheme: true, 24 | title: "请拖拽贴图完成拼图", 25 | iconSize: 22, 26 | scope: true, 27 | }) -------------------------------------------------------------------------------- /packages/components/slide-region/meta/data.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface SlideRegionData { 8 | thumbX: number; 9 | thumbY: number; 10 | thumbWidth: number; 11 | thumbHeight: number; 12 | image: string; 13 | thumb: string; 14 | } 15 | 16 | export const defaultSlideRegionData = (): SlideRegionData => ({ 17 | thumbX: 0, 18 | thumbY: 0, 19 | thumbWidth: 0, 20 | thumbHeight: 0, 21 | image: '', 22 | thumb: '' 23 | }) 24 | 25 | export interface SlideRegionPoint { 26 | x: number, 27 | y: number, 28 | } 29 | -------------------------------------------------------------------------------- /packages/components/slide-region/meta/event.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | import type {SlideRegionPoint} from "./data"; 8 | 9 | export interface SlideRegionEvent { 10 | move?: (x: number, y: number) => void; 11 | refresh?: () => void; 12 | close?: () => void; 13 | confirm?: (point: SlideRegionPoint, reset:() => void) => void; 14 | } -------------------------------------------------------------------------------- /packages/components/slide-region/meta/expose.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/011/16 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface SlideRegionExpose { 8 | reset: () => void, 9 | clear: () => void, 10 | refresh: () => void, 11 | close: () => void, 12 | } -------------------------------------------------------------------------------- /packages/components/slide/hooks/handler.ts: -------------------------------------------------------------------------------- 1 | import {SlideData} from "../meta/data"; 2 | import {SlideEvent} from "../meta/event"; 3 | import {SlideConfig} from "../meta/config"; 4 | import {reactive, Ref, watch} from "vue"; 5 | import {checkTargetFather} from "@/helper/helper"; 6 | 7 | export function useHandler( 8 | data: SlideData, 9 | event: SlideEvent, 10 | config: SlideConfig, 11 | rootRef: Ref, 12 | containerRef: Ref, 13 | tileRef: Ref, 14 | dragBlockRef: Ref, 15 | dragBarRef: Ref, 16 | clearCbs: () => void 17 | ) { 18 | const state = reactive<{dragLeft: number, thumbLeft: number, isFreeze: boolean}>({dragLeft: 0, thumbLeft: data.thumbX || 0, isFreeze: false}) 19 | 20 | watch(() => data, (newData, _) => { 21 | if(!state.isFreeze){ 22 | state.thumbLeft = newData.thumbX || 0 23 | } 24 | },{ deep: true }) 25 | 26 | const dragEvent = (e: Event|any) => { 27 | if (!checkTargetFather(dragBarRef.value, e)) { 28 | return 29 | } 30 | 31 | const touch = e.touches && e.touches[0]; 32 | const offsetLeft = dragBlockRef.value.offsetLeft 33 | const width = containerRef.value.offsetWidth 34 | const blockWidth = dragBlockRef.value.offsetWidth 35 | const maxWidth = width - blockWidth 36 | 37 | const tileWith = tileRef.value.offsetWidth 38 | const tileOffsetLeft = tileRef.value.offsetLeft 39 | const containerMaxWidth = width - tileWith 40 | const tileMaxWith = width - (tileWith + tileOffsetLeft) 41 | const ratio = tileMaxWith / maxWidth 42 | 43 | let isMoving = false 44 | let tmpLeaveDragEvent: Event|any = null 45 | let startX = 0 46 | let currentThumbX = 0 47 | if (touch) { 48 | startX = touch.pageX - offsetLeft 49 | } else { 50 | startX = e.clientX - offsetLeft 51 | } 52 | 53 | const moveEvent = (e: Event|any) => { 54 | isMoving = true 55 | const mTouche = e.touches && e.touches[0]; 56 | 57 | let left = 0; 58 | if (mTouche) { 59 | left = mTouche.pageX - startX 60 | } else { 61 | left = e.clientX - startX 62 | } 63 | 64 | let ctX = tileOffsetLeft + (left * ratio) 65 | if (left >= maxWidth) { 66 | state.dragLeft = maxWidth 67 | state.thumbLeft = currentThumbX = containerMaxWidth 68 | return 69 | } 70 | 71 | if (left <= 0) { 72 | state.dragLeft = 0 73 | state.thumbLeft = currentThumbX = tileOffsetLeft 74 | return 75 | } 76 | 77 | state.dragLeft = left 78 | state.thumbLeft = currentThumbX = ctX 79 | 80 | event.move && event.move(currentThumbX, data.thumbY || 0) 81 | 82 | e.cancelBubble = true 83 | e.preventDefault() 84 | } 85 | 86 | const upEvent = (e: Event|any) => { 87 | if (!checkTargetFather(dragBarRef.value, e)) { 88 | return 89 | } 90 | 91 | clearEvent() 92 | 93 | if (!isMoving) { 94 | return 95 | } 96 | 97 | isMoving = false 98 | 99 | if (currentThumbX < 0) { 100 | return 101 | } 102 | 103 | event.confirm && event.confirm({x: parseInt(currentThumbX.toString()), y: data.thumbY || 0}, () => { 104 | resetData() 105 | }) 106 | 107 | e.cancelBubble = true 108 | e.preventDefault() 109 | } 110 | 111 | const leaveDragBlockEvent = (e: Event|any) => { 112 | tmpLeaveDragEvent = e 113 | } 114 | 115 | const enterDragBlockEvent = () => { 116 | tmpLeaveDragEvent = null 117 | } 118 | 119 | const leaveUpEvent = (_: Event|any) => { 120 | if(!tmpLeaveDragEvent) { 121 | return 122 | } 123 | 124 | upEvent(tmpLeaveDragEvent) 125 | clearEvent() 126 | } 127 | 128 | const scope = config.scope 129 | const dragDom = scope ? rootRef.value : dragBarRef.value 130 | const scopeDom = scope ? rootRef.value : document.body 131 | 132 | const clearEvent = () => { 133 | scopeDom.removeEventListener("mousemove", moveEvent, false) 134 | scopeDom.removeEventListener("touchmove", moveEvent, { passive: false }) 135 | 136 | dragDom.removeEventListener( "mouseup", upEvent, false) 137 | dragDom.removeEventListener( "mouseenter", enterDragBlockEvent, false) 138 | dragDom.removeEventListener( "mouseleave", leaveDragBlockEvent, false) 139 | dragDom.removeEventListener("touchend", upEvent, false) 140 | 141 | scopeDom.removeEventListener("mouseleave", upEvent, false) 142 | scopeDom.removeEventListener("mouseup", leaveUpEvent, false) 143 | 144 | state.isFreeze = false 145 | } 146 | state.isFreeze = true 147 | 148 | scopeDom.addEventListener("mousemove", moveEvent, false) 149 | scopeDom.addEventListener("touchmove", moveEvent, { passive: false }) 150 | 151 | dragDom.addEventListener( "mouseup", upEvent, false) 152 | dragDom.addEventListener( "mouseenter", enterDragBlockEvent, false) 153 | dragDom.addEventListener( "mouseleave", leaveDragBlockEvent, false) 154 | dragDom.addEventListener("touchend", upEvent, false) 155 | 156 | scopeDom.addEventListener("mouseleave", upEvent, false) 157 | scopeDom.addEventListener("mouseup", leaveUpEvent, false) 158 | 159 | } 160 | 161 | const closeEvent = (e: Event|any) => { 162 | close() 163 | e.cancelBubble = true 164 | e.preventDefault() 165 | return false 166 | } 167 | 168 | const refreshEvent = (e: Event|any) => { 169 | refresh() 170 | e.cancelBubble = true 171 | e.preventDefault() 172 | return false 173 | } 174 | 175 | const close = () => { 176 | event && event.close && event.close() 177 | resetData() 178 | } 179 | 180 | const refresh = () => { 181 | event && event.refresh && event.refresh() 182 | resetData() 183 | } 184 | 185 | const resetData = () => { 186 | state.dragLeft = 0 187 | state.thumbLeft = data.thumbX || 0 188 | } 189 | 190 | const clearData = () => { 191 | clearCbs && clearCbs() 192 | resetData() 193 | } 194 | 195 | return { 196 | state, 197 | dragEvent, 198 | closeEvent, 199 | refreshEvent, 200 | resetData, 201 | clearData, 202 | refresh, 203 | close 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /packages/components/slide/index.ts: -------------------------------------------------------------------------------- 1 | import capt from './index.vue' 2 | 3 | // @ts-ignore 4 | capt.name = 'gocaptcha-slide' 5 | 6 | // @ts-ignore 7 | capt.install = function(Vue: any) { 8 | Vue.component('gocaptcha-slide', capt) 9 | } 10 | export default capt -------------------------------------------------------------------------------- /packages/components/slide/index.vue: -------------------------------------------------------------------------------- 1 | 71 | 72 | 202 | 203 | 219 | -------------------------------------------------------------------------------- /packages/components/slide/meta/config.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface SlideConfig { 8 | width?: number; 9 | height?: number; 10 | thumbWidth?: number; 11 | thumbHeight?: number; 12 | verticalPadding?: number; 13 | horizontalPadding?: number; 14 | showTheme?: boolean; 15 | title?: string; 16 | iconSize?: number; 17 | scope ?: boolean; 18 | } 19 | 20 | export const defaultConfig = ():SlideConfig => ({ 21 | width: 300, 22 | height: 220, 23 | thumbWidth: 150, 24 | thumbHeight: 40, 25 | verticalPadding: 16, 26 | horizontalPadding: 12, 27 | showTheme: true, 28 | title: "请拖动滑块完成拼图", 29 | iconSize: 22, 30 | scope: true, 31 | }) 32 | 33 | -------------------------------------------------------------------------------- /packages/components/slide/meta/data.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface SlideData { 8 | thumbX: number; 9 | thumbY: number; 10 | thumbWidth: number; 11 | thumbHeight: number; 12 | image: string; 13 | thumb: string; 14 | } 15 | 16 | export const defaultSlideData = (): SlideData => ({ 17 | thumbX: 0, 18 | thumbY: 0, 19 | thumbWidth: 0, 20 | thumbHeight: 0, 21 | image: '', 22 | thumb: '' 23 | }) 24 | 25 | export interface SlidePoint { 26 | x: number, 27 | y: number, 28 | } -------------------------------------------------------------------------------- /packages/components/slide/meta/event.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | import type {SlidePoint} from "./data"; 8 | 9 | export interface SlideEvent { 10 | move?: (x: number, y: number) => void; 11 | refresh?: () => void; 12 | close?: () => void; 13 | confirm?: (point: SlidePoint, reset:() => void) => void; 14 | } -------------------------------------------------------------------------------- /packages/components/slide/meta/expose.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/011/16 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export interface SlideExpose { 8 | reset: () => void, 9 | clear: () => void, 10 | refresh: () => void, 11 | close: () => void, 12 | } -------------------------------------------------------------------------------- /packages/gocaptcha.less: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/06/01 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | :root{ 8 | --go-captcha-theme-text-color: #333333; 9 | --go-captcha-theme-bg-color: #ffffff; 10 | --go-captcha-theme-btn-color: #ffffff; 11 | --go-captcha-theme-btn-disabled-color: #749ff9; 12 | --go-captcha-theme-btn-bg-color: #4e87ff; 13 | --go-captcha-theme-btn-border-color: #4e87ff; 14 | --go-captcha-theme-active-color: #3e7cff; 15 | --go-captcha-theme-border-color: rgba(206, 223, 254, 0.5); 16 | --go-captcha-theme-icon-color: #3C3C3C; 17 | --go-captcha-theme-drag-bar-color: #e0e0e0; 18 | --go-captcha-theme-drag-bg-color: #3e7cff; 19 | --go-captcha-theme-drag-icon-color: #ffffff; 20 | --go-captcha-theme-round-color: #e0e0e0; 21 | --go-captcha-theme-loading-icon-color: #3e7cff; 22 | --go-captcha-theme-body-bg-color: #34383e; 23 | 24 | --go-captcha-theme-dot-color-color: #cedffe; 25 | --go-captcha-theme-dot-bg-color: #4e87ff; 26 | --go-captcha-theme-dot-border-color: #ffffff; 27 | 28 | --go-captcha-theme-default-color: #3e7cff; 29 | --go-captcha-theme-default-bg-color: #ecf5ff; 30 | --go-captcha-theme-default-border-color: #50a1ff; 31 | --go-captcha-theme-default-hover-color: #e0efff; 32 | 33 | --go-captcha-theme-error-color: #ed4630; 34 | --go-captcha-theme-error-bg-color: #fef0f0; 35 | --go-captcha-theme-error-border-color: #ff5a34; 36 | 37 | --go-captcha-theme-warn-color: #ffa000; 38 | --go-captcha-theme-warn-bg-color: #fdf6ec; 39 | --go-captcha-theme-warn-border-color: #ffbe09; 40 | 41 | --go-captcha-theme-success-color: #5eaa2f; 42 | --go-captcha-theme-success-bg-color: #f0f9eb; 43 | --go-captcha-theme-success-border-color: #8bc640; 44 | } 45 | 46 | .go-captcha { 47 | &.gc-wrapper { 48 | padding: 12px 16px; 49 | //background-color: var(--go-captcha-theme-bg-color); 50 | -webkit-touch-callout: none; 51 | -webkit-user-select: none; 52 | -moz-user-select: none; 53 | -ms-user-select: none; 54 | user-select: none; 55 | box-sizing: border-box; 56 | } 57 | 58 | &.gc-theme { 59 | border: 1px solid rgba(206, 223, 254, 0.5); 60 | border-color: var(--go-captcha-theme-border-color); 61 | 62 | -webkit-border-radius: 8px; 63 | -moz-border-radius: 8px; 64 | border-radius: 8px; 65 | 66 | box-shadow: 0 0 20px rgba(100, 100, 100, 0.1); 67 | -webkit-box-shadow: 0 0 20px rgba(100, 100, 100, 0.1); 68 | -moz-box-shadow: 0 0 20px rgba(100, 100, 100, 0.1); 69 | 70 | &.gc-wrapper { 71 | background-color: var(--go-captcha-theme-bg-color); 72 | } 73 | } 74 | 75 | .gc-header { 76 | height: 36px; 77 | width: 100%; 78 | font-size: 15px; 79 | color: var(--go-captcha-theme-text-color); 80 | 81 | display:-webkit-box; 82 | display:-webkit-flex; 83 | display:-ms-flexbox; 84 | display:flex; 85 | -webkit-box-align:center; 86 | -webkit-align-items:center; 87 | -ms-flex-align:center; 88 | align-items: center; 89 | 90 | -webkit-touch-callout: none; 91 | -webkit-user-select: none; 92 | -moz-user-select: none; 93 | -ms-user-select: none; 94 | user-select: none; 95 | 96 | span { 97 | flex: 1; 98 | padding-right: 5px; 99 | } 100 | 101 | em { 102 | padding: 0 3px; 103 | font-weight: bold; 104 | color: var(--go-captcha-theme-active-color); 105 | font-style: normal; 106 | } 107 | } 108 | 109 | .gc-body{ 110 | position: relative; 111 | width: 100%; 112 | margin-top: 10px; 113 | display: -webkit-box; 114 | display: -moz-box; 115 | display: -ms-flexbox; 116 | display: -webkit-flex; 117 | display: flex; 118 | background: var(--go-captcha-theme-body-bg-color); 119 | border-radius: 5px; 120 | -webkit-border-radius: 5px; 121 | -moz-border-radius: 5px; 122 | overflow: hidden; 123 | 124 | .gc-body-inner{ 125 | position: relative; 126 | background: var(--go-captcha-theme-body-bg-color); 127 | } 128 | } 129 | 130 | .gc-picture{ 131 | position: relative; 132 | z-index: 2; 133 | width: 100%; 134 | } 135 | 136 | .gc-loading{ 137 | position: absolute; 138 | z-index: 1; 139 | top: 50%; 140 | left: 50%; 141 | width: 68px; 142 | height: 68px; 143 | margin-left: -34px; 144 | margin-top: -34px; 145 | line-height: 68px; 146 | text-align: center; 147 | display: flex; 148 | align-content: center; 149 | justify-content: center; 150 | 151 | svg, circle { 152 | color: var(--go-captcha-theme-loading-icon-color); 153 | fill: var(--go-captcha-theme-loading-icon-color); 154 | } 155 | } 156 | 157 | .gc-footer{ 158 | width: 100%; 159 | height: 50px; 160 | color: #34383e; 161 | display: -webkit-box; 162 | display: -moz-box; 163 | display: -ms-flexbox; 164 | display: -webkit-flex; 165 | display:flex; 166 | align-items: center; 167 | padding-top: 10px; 168 | 169 | -webkit-touch-callout: none; 170 | -webkit-user-select: none; 171 | -moz-user-select: none; 172 | -ms-user-select: none; 173 | user-select: none; 174 | 175 | .icon-block { 176 | flex: 1; 177 | } 178 | } 179 | 180 | .gc-icon-block{ 181 | display: -webkit-box; 182 | display: -moz-box; 183 | display: -ms-flexbox; 184 | display: -webkit-flex; 185 | display:flex; 186 | align-items: center; 187 | svg{ 188 | color: var(--go-captcha-theme-icon-color); 189 | fill: var(--go-captcha-theme-icon-color); 190 | margin: 0 5px; 191 | cursor: pointer; 192 | } 193 | } 194 | 195 | .gc-button-block{ 196 | width: 120px; 197 | height: 40px; 198 | 199 | button{ 200 | width: 100%; 201 | height: 40px; 202 | //letter-spacing: 2px; 203 | text-align: center; 204 | padding: 9px 15px; 205 | font-size: 15px; 206 | -webkit-border-radius: 5px; 207 | -moz-border-radius: 5px; 208 | border-radius: 5px; 209 | display: inline-block; 210 | line-height: 1; 211 | white-space: nowrap; 212 | cursor: pointer; 213 | color: var(--go-captcha-theme-btn-color); 214 | background-color: var(--go-captcha-theme-btn-bg-color); 215 | border: 1px solid transparent; 216 | border-color: var(--go-captcha-theme-btn-border-color); 217 | -webkit-appearance: none; 218 | box-sizing: border-box; 219 | outline: none; 220 | margin: 0; 221 | transition: .1s; 222 | font-weight: 500; 223 | -moz-user-select: none; 224 | -webkit-user-select: none; 225 | 226 | &.disabled { 227 | pointer-events: none; 228 | background-color: var(--go-captcha-theme-btn-disabled-color); 229 | border-color: var(--go-captcha-theme-btn-disabled-color); 230 | } 231 | } 232 | } 233 | 234 | .gc-drag-slide-bar { 235 | width: 100%; 236 | height: 100%; 237 | position: relative; 238 | touch-action: none; 239 | } 240 | 241 | .gc-drag-line{ 242 | position: absolute; 243 | height: 14px; 244 | background-color: var(--go-captcha-theme-drag-bar-color); 245 | left: 0; 246 | right: 0; 247 | top: 50%; 248 | margin-top: -7px; 249 | -webkit-border-radius: 7px; 250 | -moz-border-radius: 7px; 251 | border-radius: 7px; 252 | } 253 | 254 | .gc-drag-block { 255 | position: absolute; 256 | left: 0; 257 | top: 50%; 258 | margin-top: -20px; 259 | width: 82px; 260 | height: 40px; 261 | z-index: 2; 262 | background-color: var(--go-captcha-theme-drag-bg-color); 263 | cursor: pointer; 264 | display: flex; 265 | align-items: center; 266 | justify-content: center; 267 | 268 | -webkit-touch-callout: none; 269 | -webkit-user-select: none; 270 | -moz-user-select: none; 271 | -ms-user-select: none; 272 | user-select: none; 273 | 274 | -webkit-border-radius: 24px; 275 | -moz-border-radius: 24px; 276 | border-radius: 24px; 277 | 278 | box-shadow: 0 0 20px rgba(100, 100, 100, 0.35); 279 | -webkit-box-shadow: 0 0 20px rgba(100, 100, 100, 0.35); 280 | -moz-box-shadow: 0 0 20px rgba(100, 100, 100, 0.35); 281 | 282 | color: var(--go-captcha-theme-drag-icon-color); 283 | fill: var(--go-captcha-theme-drag-icon-color); 284 | 285 | &.disabled { 286 | pointer-events: none; 287 | background-color: var(--go-captcha-theme-btn-disabled-color); 288 | border-color: var(--go-captcha-theme-btn-disabled-color); 289 | } 290 | } 291 | 292 | .gc-drag-block-inline { 293 | width: 100%; 294 | height: 100%; 295 | display: flex; 296 | align-items: center; 297 | justify-content: center; 298 | } 299 | } -------------------------------------------------------------------------------- /packages/helper/helper.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author Awen 3 | * @Date 2024/05/25 4 | * @Email wengaolng@gmail.com 5 | **/ 6 | 7 | export function getDomXY(dom: any){ 8 | let x = 0 9 | let y = 0 10 | if (dom.getBoundingClientRect) { 11 | const box = dom.getBoundingClientRect(); 12 | const D = document.documentElement; 13 | x = box.left + Math.max(D.scrollLeft, document.body.scrollLeft) - D.clientLeft; 14 | y = box.top + Math.max(D.scrollTop, document.body.scrollTop) - D.clientTop 15 | } 16 | else{ 17 | while (dom !== document.body) { 18 | x += dom.offsetLeft 19 | y += dom.offsetTop 20 | dom = dom.offsetParent 21 | } 22 | } 23 | return { 24 | domX: x, 25 | domY: y 26 | } 27 | } 28 | 29 | export function checkTargetFather(that: any, e: any) { 30 | let parent = e.relatedTarget 31 | try{ 32 | while(parent && parent !== that) { 33 | parent = parent.parentNode 34 | } 35 | }catch (e){ 36 | console.warn(e) 37 | } 38 | 39 | return parent !== that 40 | } 41 | -------------------------------------------------------------------------------- /packages/index.ts: -------------------------------------------------------------------------------- 1 | import "./gocaptcha.less" 2 | import Click from "./components/click/index" 3 | import Slide from "./components/slide/index" 4 | import SlideRegion from "./components/slide-region/index" 5 | import Rotate from "./components/rotate/index" 6 | import Button from "./components/button/index" 7 | 8 | export { Click, Slide, SlideRegion, Rotate, Button }; 9 | 10 | const installed = { 11 | install(vue: any) { 12 | // @ts-ignore 13 | Click.install(vue) 14 | // @ts-ignore 15 | Slide.install(vue) 16 | // @ts-ignore 17 | SlideRegion.install(vue) 18 | // @ts-ignore 19 | Rotate.install(vue) 20 | // @ts-ignore 21 | Button.install(vue) 22 | } 23 | } 24 | 25 | export default installed 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./", 4 | "target": "es2020", 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "esModuleInterop": true, 8 | "allowSyntheticDefaultImports": true, 9 | "strict": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "noImplicitReturns": true, 12 | "module": "esnext", 13 | "moduleResolution": "node", 14 | "isolatedModules": true, 15 | "noEmit": true, 16 | "useDefineForClassFields": true, 17 | "allowImportingTsExtensions": true, 18 | "jsx": "preserve", 19 | "strictNullChecks": true, 20 | "sourceMap": true, 21 | "importHelpers": true, 22 | "noUnusedLocals": true, 23 | "noUnusedParameters": true, 24 | "emitDecoratorMetadata": true, 25 | "experimentalDecorators": true, 26 | 27 | "resolveJsonModule": true, 28 | "noFallthroughCasesInSwitch": true, 29 | "paths": { 30 | "@/*": ["./packages/*"] 31 | }, 32 | "lib": ["es2020", "esnext", "dom", "dom.iterable", "scripthost"], 33 | 34 | "declaration": true, 35 | }, 36 | "include": ["env.d.ts", "packages/**/*.ts", "packages/**/*.d.ts", "packages/**/*.tsx", "packages/**/*.vue"], 37 | "exclude": [ 38 | "node_modules" 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { fileURLToPath } from 'url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | import vueJsx from '@vitejs/plugin-vue-jsx' 6 | import autoprefixer from 'autoprefixer'; 7 | 8 | // https://vitejs.dev/config/ 9 | export default defineConfig({ 10 | plugins: [ 11 | vue(), 12 | vueJsx(), 13 | ], 14 | css: { 15 | postcss: { 16 | plugins: [ 17 | autoprefixer({ 18 | overrideBrowserslist: [ 19 | 'Android 4.1', 20 | 'iOS 7.1', 21 | 'Chrome > 31', 22 | 'ff > 31', 23 | 'ie >= 8', 24 | '> 1%', 25 | ], 26 | grid: true, 27 | }), 28 | ], 29 | }, 30 | }, 31 | resolve: { 32 | alias: { 33 | 'packages': fileURLToPath(new URL('./packages', import.meta.url)), 34 | '@': fileURLToPath(new URL('./packages', import.meta.url)), 35 | } 36 | }, 37 | server: { 38 | port: 3001 39 | }, 40 | build: { 41 | emptyOutDir: true, 42 | minify: true, 43 | rollupOptions: { 44 | external: ['vue'], 45 | output: { 46 | globals: { 47 | vue: 'Vue', 48 | }, 49 | }, 50 | }, 51 | lib: { 52 | entry: 'packages/index.ts', 53 | name: 'go-captcha-vue', 54 | fileName: (format) => `go-captcha-vue.${format}.js`, 55 | }, 56 | } 57 | }) 58 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ampproject/remapping@^2.2.0": 6 | version "2.3.0" 7 | resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" 8 | integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== 9 | dependencies: 10 | "@jridgewell/gen-mapping" "^0.3.5" 11 | "@jridgewell/trace-mapping" "^0.3.24" 12 | 13 | "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.6": 14 | version "7.24.6" 15 | resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz" 16 | integrity sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA== 17 | dependencies: 18 | "@babel/highlight" "^7.24.6" 19 | picocolors "^1.0.0" 20 | 21 | "@babel/compat-data@^7.24.6": 22 | version "7.24.6" 23 | resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz" 24 | integrity sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ== 25 | 26 | "@babel/core@^7.23.3": 27 | version "7.24.6" 28 | resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz" 29 | integrity sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ== 30 | dependencies: 31 | "@ampproject/remapping" "^2.2.0" 32 | "@babel/code-frame" "^7.24.6" 33 | "@babel/generator" "^7.24.6" 34 | "@babel/helper-compilation-targets" "^7.24.6" 35 | "@babel/helper-module-transforms" "^7.24.6" 36 | "@babel/helpers" "^7.24.6" 37 | "@babel/parser" "^7.24.6" 38 | "@babel/template" "^7.24.6" 39 | "@babel/traverse" "^7.24.6" 40 | "@babel/types" "^7.24.6" 41 | convert-source-map "^2.0.0" 42 | debug "^4.1.0" 43 | gensync "^1.0.0-beta.2" 44 | json5 "^2.2.3" 45 | semver "^6.3.1" 46 | 47 | "@babel/generator@^7.24.6": 48 | version "7.24.6" 49 | resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz" 50 | integrity sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg== 51 | dependencies: 52 | "@babel/types" "^7.24.6" 53 | "@jridgewell/gen-mapping" "^0.3.5" 54 | "@jridgewell/trace-mapping" "^0.3.25" 55 | jsesc "^2.5.1" 56 | 57 | "@babel/helper-annotate-as-pure@^7.24.6": 58 | version "7.24.6" 59 | resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz" 60 | integrity sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg== 61 | dependencies: 62 | "@babel/types" "^7.24.6" 63 | 64 | "@babel/helper-compilation-targets@^7.24.6": 65 | version "7.24.6" 66 | resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz" 67 | integrity sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg== 68 | dependencies: 69 | "@babel/compat-data" "^7.24.6" 70 | "@babel/helper-validator-option" "^7.24.6" 71 | browserslist "^4.22.2" 72 | lru-cache "^5.1.1" 73 | semver "^6.3.1" 74 | 75 | "@babel/helper-create-class-features-plugin@^7.24.6": 76 | version "7.24.6" 77 | resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz" 78 | integrity sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA== 79 | dependencies: 80 | "@babel/helper-annotate-as-pure" "^7.24.6" 81 | "@babel/helper-environment-visitor" "^7.24.6" 82 | "@babel/helper-function-name" "^7.24.6" 83 | "@babel/helper-member-expression-to-functions" "^7.24.6" 84 | "@babel/helper-optimise-call-expression" "^7.24.6" 85 | "@babel/helper-replace-supers" "^7.24.6" 86 | "@babel/helper-skip-transparent-expression-wrappers" "^7.24.6" 87 | "@babel/helper-split-export-declaration" "^7.24.6" 88 | semver "^6.3.1" 89 | 90 | "@babel/helper-environment-visitor@^7.24.6": 91 | version "7.24.6" 92 | resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz" 93 | integrity sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g== 94 | 95 | "@babel/helper-function-name@^7.24.6": 96 | version "7.24.6" 97 | resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz" 98 | integrity sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w== 99 | dependencies: 100 | "@babel/template" "^7.24.6" 101 | "@babel/types" "^7.24.6" 102 | 103 | "@babel/helper-hoist-variables@^7.24.6": 104 | version "7.24.6" 105 | resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz" 106 | integrity sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA== 107 | dependencies: 108 | "@babel/types" "^7.24.6" 109 | 110 | "@babel/helper-member-expression-to-functions@^7.24.6": 111 | version "7.24.6" 112 | resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz" 113 | integrity sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg== 114 | dependencies: 115 | "@babel/types" "^7.24.6" 116 | 117 | "@babel/helper-module-imports@^7.24.6": 118 | version "7.24.6" 119 | resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz" 120 | integrity sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g== 121 | dependencies: 122 | "@babel/types" "^7.24.6" 123 | 124 | "@babel/helper-module-imports@~7.22.15": 125 | version "7.22.15" 126 | resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" 127 | integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== 128 | dependencies: 129 | "@babel/types" "^7.22.15" 130 | 131 | "@babel/helper-module-transforms@^7.24.6": 132 | version "7.24.6" 133 | resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz" 134 | integrity sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA== 135 | dependencies: 136 | "@babel/helper-environment-visitor" "^7.24.6" 137 | "@babel/helper-module-imports" "^7.24.6" 138 | "@babel/helper-simple-access" "^7.24.6" 139 | "@babel/helper-split-export-declaration" "^7.24.6" 140 | "@babel/helper-validator-identifier" "^7.24.6" 141 | 142 | "@babel/helper-optimise-call-expression@^7.24.6": 143 | version "7.24.6" 144 | resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz" 145 | integrity sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA== 146 | dependencies: 147 | "@babel/types" "^7.24.6" 148 | 149 | "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.6": 150 | version "7.24.6" 151 | resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz" 152 | integrity sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg== 153 | 154 | "@babel/helper-replace-supers@^7.24.6": 155 | version "7.24.6" 156 | resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz" 157 | integrity sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ== 158 | dependencies: 159 | "@babel/helper-environment-visitor" "^7.24.6" 160 | "@babel/helper-member-expression-to-functions" "^7.24.6" 161 | "@babel/helper-optimise-call-expression" "^7.24.6" 162 | 163 | "@babel/helper-simple-access@^7.24.6": 164 | version "7.24.6" 165 | resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz" 166 | integrity sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g== 167 | dependencies: 168 | "@babel/types" "^7.24.6" 169 | 170 | "@babel/helper-skip-transparent-expression-wrappers@^7.24.6": 171 | version "7.24.6" 172 | resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz" 173 | integrity sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q== 174 | dependencies: 175 | "@babel/types" "^7.24.6" 176 | 177 | "@babel/helper-split-export-declaration@^7.24.6": 178 | version "7.24.6" 179 | resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz" 180 | integrity sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw== 181 | dependencies: 182 | "@babel/types" "^7.24.6" 183 | 184 | "@babel/helper-string-parser@^7.24.6": 185 | version "7.24.6" 186 | resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz" 187 | integrity sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q== 188 | 189 | "@babel/helper-validator-identifier@^7.24.6": 190 | version "7.24.6" 191 | resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz" 192 | integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== 193 | 194 | "@babel/helper-validator-option@^7.24.6": 195 | version "7.24.6" 196 | resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz" 197 | integrity sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ== 198 | 199 | "@babel/helpers@^7.24.6": 200 | version "7.24.6" 201 | resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz" 202 | integrity sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA== 203 | dependencies: 204 | "@babel/template" "^7.24.6" 205 | "@babel/types" "^7.24.6" 206 | 207 | "@babel/highlight@^7.24.6": 208 | version "7.24.6" 209 | resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz" 210 | integrity sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ== 211 | dependencies: 212 | "@babel/helper-validator-identifier" "^7.24.6" 213 | chalk "^2.4.2" 214 | js-tokens "^4.0.0" 215 | picocolors "^1.0.0" 216 | 217 | "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.24.6": 218 | version "7.24.6" 219 | resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz" 220 | integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== 221 | 222 | "@babel/plugin-syntax-jsx@^7.23.3": 223 | version "7.24.6" 224 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.6.tgz" 225 | integrity sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw== 226 | dependencies: 227 | "@babel/helper-plugin-utils" "^7.24.6" 228 | 229 | "@babel/plugin-syntax-typescript@^7.24.6": 230 | version "7.24.6" 231 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.6.tgz" 232 | integrity sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A== 233 | dependencies: 234 | "@babel/helper-plugin-utils" "^7.24.6" 235 | 236 | "@babel/plugin-transform-typescript@^7.23.3": 237 | version "7.24.6" 238 | resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.6.tgz" 239 | integrity sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ== 240 | dependencies: 241 | "@babel/helper-annotate-as-pure" "^7.24.6" 242 | "@babel/helper-create-class-features-plugin" "^7.24.6" 243 | "@babel/helper-plugin-utils" "^7.24.6" 244 | "@babel/plugin-syntax-typescript" "^7.24.6" 245 | 246 | "@babel/template@^7.23.9", "@babel/template@^7.24.6": 247 | version "7.24.6" 248 | resolved "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz" 249 | integrity sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw== 250 | dependencies: 251 | "@babel/code-frame" "^7.24.6" 252 | "@babel/parser" "^7.24.6" 253 | "@babel/types" "^7.24.6" 254 | 255 | "@babel/traverse@^7.23.9", "@babel/traverse@^7.24.6": 256 | version "7.24.6" 257 | resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz" 258 | integrity sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw== 259 | dependencies: 260 | "@babel/code-frame" "^7.24.6" 261 | "@babel/generator" "^7.24.6" 262 | "@babel/helper-environment-visitor" "^7.24.6" 263 | "@babel/helper-function-name" "^7.24.6" 264 | "@babel/helper-hoist-variables" "^7.24.6" 265 | "@babel/helper-split-export-declaration" "^7.24.6" 266 | "@babel/parser" "^7.24.6" 267 | "@babel/types" "^7.24.6" 268 | debug "^4.3.1" 269 | globals "^11.1.0" 270 | 271 | "@babel/types@^7.22.15", "@babel/types@^7.23.9", "@babel/types@^7.24.6": 272 | version "7.24.6" 273 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz" 274 | integrity sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ== 275 | dependencies: 276 | "@babel/helper-string-parser" "^7.24.6" 277 | "@babel/helper-validator-identifier" "^7.24.6" 278 | to-fast-properties "^2.0.0" 279 | 280 | "@esbuild/android-arm64@0.18.20": 281 | version "0.18.20" 282 | resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" 283 | integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== 284 | 285 | "@esbuild/android-arm@0.18.20": 286 | version "0.18.20" 287 | resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" 288 | integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== 289 | 290 | "@esbuild/android-x64@0.18.20": 291 | version "0.18.20" 292 | resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" 293 | integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== 294 | 295 | "@esbuild/darwin-arm64@0.18.20": 296 | version "0.18.20" 297 | resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" 298 | integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== 299 | 300 | "@esbuild/darwin-x64@0.18.20": 301 | version "0.18.20" 302 | resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz" 303 | integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== 304 | 305 | "@esbuild/freebsd-arm64@0.18.20": 306 | version "0.18.20" 307 | resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" 308 | integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== 309 | 310 | "@esbuild/freebsd-x64@0.18.20": 311 | version "0.18.20" 312 | resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" 313 | integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== 314 | 315 | "@esbuild/linux-arm64@0.18.20": 316 | version "0.18.20" 317 | resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" 318 | integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== 319 | 320 | "@esbuild/linux-arm@0.18.20": 321 | version "0.18.20" 322 | resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" 323 | integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== 324 | 325 | "@esbuild/linux-ia32@0.18.20": 326 | version "0.18.20" 327 | resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" 328 | integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== 329 | 330 | "@esbuild/linux-loong64@0.18.20": 331 | version "0.18.20" 332 | resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" 333 | integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== 334 | 335 | "@esbuild/linux-mips64el@0.18.20": 336 | version "0.18.20" 337 | resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" 338 | integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== 339 | 340 | "@esbuild/linux-ppc64@0.18.20": 341 | version "0.18.20" 342 | resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" 343 | integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== 344 | 345 | "@esbuild/linux-riscv64@0.18.20": 346 | version "0.18.20" 347 | resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" 348 | integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== 349 | 350 | "@esbuild/linux-s390x@0.18.20": 351 | version "0.18.20" 352 | resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" 353 | integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== 354 | 355 | "@esbuild/linux-x64@0.18.20": 356 | version "0.18.20" 357 | resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" 358 | integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== 359 | 360 | "@esbuild/netbsd-x64@0.18.20": 361 | version "0.18.20" 362 | resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" 363 | integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== 364 | 365 | "@esbuild/openbsd-x64@0.18.20": 366 | version "0.18.20" 367 | resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" 368 | integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== 369 | 370 | "@esbuild/sunos-x64@0.18.20": 371 | version "0.18.20" 372 | resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" 373 | integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== 374 | 375 | "@esbuild/win32-arm64@0.18.20": 376 | version "0.18.20" 377 | resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" 378 | integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== 379 | 380 | "@esbuild/win32-ia32@0.18.20": 381 | version "0.18.20" 382 | resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" 383 | integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== 384 | 385 | "@esbuild/win32-x64@0.18.20": 386 | version "0.18.20" 387 | resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" 388 | integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== 389 | 390 | "@jridgewell/gen-mapping@^0.3.5": 391 | version "0.3.5" 392 | resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" 393 | integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== 394 | dependencies: 395 | "@jridgewell/set-array" "^1.2.1" 396 | "@jridgewell/sourcemap-codec" "^1.4.10" 397 | "@jridgewell/trace-mapping" "^0.3.24" 398 | 399 | "@jridgewell/resolve-uri@^3.1.0": 400 | version "3.1.2" 401 | resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" 402 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 403 | 404 | "@jridgewell/set-array@^1.2.1": 405 | version "1.2.1" 406 | resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" 407 | integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== 408 | 409 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": 410 | version "1.4.15" 411 | resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" 412 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 413 | 414 | "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": 415 | version "0.3.25" 416 | resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" 417 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 418 | dependencies: 419 | "@jridgewell/resolve-uri" "^3.1.0" 420 | "@jridgewell/sourcemap-codec" "^1.4.14" 421 | 422 | "@nodelib/fs.scandir@2.1.5": 423 | version "2.1.5" 424 | resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" 425 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 426 | dependencies: 427 | "@nodelib/fs.stat" "2.0.5" 428 | run-parallel "^1.1.9" 429 | 430 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 431 | version "2.0.5" 432 | resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" 433 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 434 | 435 | "@nodelib/fs.walk@^1.2.3": 436 | version "1.2.8" 437 | resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" 438 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 439 | dependencies: 440 | "@nodelib/fs.scandir" "2.1.5" 441 | fastq "^1.6.0" 442 | 443 | "@ts-morph/common@~0.23.0": 444 | version "0.23.0" 445 | resolved "https://registry.npmjs.org/@ts-morph/common/-/common-0.23.0.tgz" 446 | integrity sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA== 447 | dependencies: 448 | fast-glob "^3.3.2" 449 | minimatch "^9.0.3" 450 | mkdirp "^3.0.1" 451 | path-browserify "^1.0.1" 452 | 453 | "@types/node@^16.11.10": 454 | version "16.18.97" 455 | resolved "https://registry.npmjs.org/@types/node/-/node-16.18.97.tgz" 456 | integrity sha512-4muilE1Lbfn57unR+/nT9AFjWk0MtWi5muwCEJqnOvfRQDbSfLCUdN7vCIg8TYuaANfhLOV85ve+FNpiUsbSRg== 457 | 458 | "@vitejs/plugin-vue-jsx@^3.1.0": 459 | version "3.1.0" 460 | resolved "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz" 461 | integrity sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA== 462 | dependencies: 463 | "@babel/core" "^7.23.3" 464 | "@babel/plugin-transform-typescript" "^7.23.3" 465 | "@vue/babel-plugin-jsx" "^1.1.5" 466 | 467 | "@vitejs/plugin-vue@4.4.0": 468 | version "4.4.0" 469 | resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz" 470 | integrity sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg== 471 | 472 | "@volar/language-core@2.2.5", "@volar/language-core@~2.2.4": 473 | version "2.2.5" 474 | resolved "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.5.tgz" 475 | integrity sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ== 476 | dependencies: 477 | "@volar/source-map" "2.2.5" 478 | 479 | "@volar/source-map@2.2.5": 480 | version "2.2.5" 481 | resolved "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.5.tgz" 482 | integrity sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ== 483 | dependencies: 484 | muggle-string "^0.4.0" 485 | 486 | "@volar/typescript@~2.2.4": 487 | version "2.2.5" 488 | resolved "https://registry.npmjs.org/@volar/typescript/-/typescript-2.2.5.tgz" 489 | integrity sha512-eSV/n75+ppfEVugMC/salZsI44nXDPAyL6+iTYCNLtiLHGJsnMv9GwiDMujrvAUj/aLQyqRJgYtXRoxop2clCw== 490 | dependencies: 491 | "@volar/language-core" "2.2.5" 492 | path-browserify "^1.0.1" 493 | 494 | "@vue/babel-helper-vue-transform-on@1.2.2": 495 | version "1.2.2" 496 | resolved "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.2.tgz" 497 | integrity sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw== 498 | 499 | "@vue/babel-plugin-jsx@^1.1.5": 500 | version "1.2.2" 501 | resolved "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.2.tgz" 502 | integrity sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA== 503 | dependencies: 504 | "@babel/helper-module-imports" "~7.22.15" 505 | "@babel/helper-plugin-utils" "^7.22.5" 506 | "@babel/plugin-syntax-jsx" "^7.23.3" 507 | "@babel/template" "^7.23.9" 508 | "@babel/traverse" "^7.23.9" 509 | "@babel/types" "^7.23.9" 510 | "@vue/babel-helper-vue-transform-on" "1.2.2" 511 | "@vue/babel-plugin-resolve-type" "1.2.2" 512 | camelcase "^6.3.0" 513 | html-tags "^3.3.1" 514 | svg-tags "^1.0.0" 515 | 516 | "@vue/babel-plugin-resolve-type@1.2.2": 517 | version "1.2.2" 518 | resolved "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.2.tgz" 519 | integrity sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A== 520 | dependencies: 521 | "@babel/code-frame" "^7.23.5" 522 | "@babel/helper-module-imports" "~7.22.15" 523 | "@babel/helper-plugin-utils" "^7.22.5" 524 | "@babel/parser" "^7.23.9" 525 | "@vue/compiler-sfc" "^3.4.15" 526 | 527 | "@vue/compiler-core@3.4.27": 528 | version "3.4.27" 529 | resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz" 530 | integrity sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg== 531 | dependencies: 532 | "@babel/parser" "^7.24.4" 533 | "@vue/shared" "3.4.27" 534 | entities "^4.5.0" 535 | estree-walker "^2.0.2" 536 | source-map-js "^1.2.0" 537 | 538 | "@vue/compiler-dom@3.4.27", "@vue/compiler-dom@^3.4.0": 539 | version "3.4.27" 540 | resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz" 541 | integrity sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw== 542 | dependencies: 543 | "@vue/compiler-core" "3.4.27" 544 | "@vue/shared" "3.4.27" 545 | 546 | "@vue/compiler-sfc@3.4.27", "@vue/compiler-sfc@^3.4.15": 547 | version "3.4.27" 548 | resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz" 549 | integrity sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA== 550 | dependencies: 551 | "@babel/parser" "^7.24.4" 552 | "@vue/compiler-core" "3.4.27" 553 | "@vue/compiler-dom" "3.4.27" 554 | "@vue/compiler-ssr" "3.4.27" 555 | "@vue/shared" "3.4.27" 556 | estree-walker "^2.0.2" 557 | magic-string "^0.30.10" 558 | postcss "^8.4.38" 559 | source-map-js "^1.2.0" 560 | 561 | "@vue/compiler-ssr@3.4.27": 562 | version "3.4.27" 563 | resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz" 564 | integrity sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw== 565 | dependencies: 566 | "@vue/compiler-dom" "3.4.27" 567 | "@vue/shared" "3.4.27" 568 | 569 | "@vue/language-core@2.0.19": 570 | version "2.0.19" 571 | resolved "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.19.tgz" 572 | integrity sha512-A9EGOnvb51jOvnCYoRLnMP+CcoPlbZVxI9gZXE/y2GksRWM6j/PrLEIC++pnosWTN08tFpJgxhSS//E9v/Sg+Q== 573 | dependencies: 574 | "@volar/language-core" "~2.2.4" 575 | "@vue/compiler-dom" "^3.4.0" 576 | "@vue/shared" "^3.4.0" 577 | computeds "^0.0.1" 578 | minimatch "^9.0.3" 579 | path-browserify "^1.0.1" 580 | vue-template-compiler "^2.7.14" 581 | 582 | "@vue/reactivity@3.4.27": 583 | version "3.4.27" 584 | resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz" 585 | integrity sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA== 586 | dependencies: 587 | "@vue/shared" "3.4.27" 588 | 589 | "@vue/runtime-core@3.4.27": 590 | version "3.4.27" 591 | resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz" 592 | integrity sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA== 593 | dependencies: 594 | "@vue/reactivity" "3.4.27" 595 | "@vue/shared" "3.4.27" 596 | 597 | "@vue/runtime-dom@3.4.27": 598 | version "3.4.27" 599 | resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz" 600 | integrity sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q== 601 | dependencies: 602 | "@vue/runtime-core" "3.4.27" 603 | "@vue/shared" "3.4.27" 604 | csstype "^3.1.3" 605 | 606 | "@vue/server-renderer@3.4.27": 607 | version "3.4.27" 608 | resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz" 609 | integrity sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA== 610 | dependencies: 611 | "@vue/compiler-ssr" "3.4.27" 612 | "@vue/shared" "3.4.27" 613 | 614 | "@vue/shared@3.4.27", "@vue/shared@^3.4.0": 615 | version "3.4.27" 616 | resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz" 617 | integrity sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA== 618 | 619 | ansi-styles@^3.2.1: 620 | version "3.2.1" 621 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 622 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 623 | dependencies: 624 | color-convert "^1.9.0" 625 | 626 | ansi-styles@^6.2.1: 627 | version "6.2.1" 628 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" 629 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 630 | 631 | autoprefixer@^10.4.19: 632 | version "10.4.19" 633 | resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz" 634 | integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== 635 | dependencies: 636 | browserslist "^4.23.0" 637 | caniuse-lite "^1.0.30001599" 638 | fraction.js "^4.3.7" 639 | normalize-range "^0.1.2" 640 | picocolors "^1.0.0" 641 | postcss-value-parser "^4.2.0" 642 | 643 | balanced-match@^1.0.0: 644 | version "1.0.2" 645 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" 646 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 647 | 648 | brace-expansion@^2.0.1: 649 | version "2.0.1" 650 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" 651 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 652 | dependencies: 653 | balanced-match "^1.0.0" 654 | 655 | braces@^3.0.3: 656 | version "3.0.3" 657 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" 658 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 659 | dependencies: 660 | fill-range "^7.1.1" 661 | 662 | browserslist@^4.22.2, browserslist@^4.23.0: 663 | version "4.23.0" 664 | resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" 665 | integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== 666 | dependencies: 667 | caniuse-lite "^1.0.30001587" 668 | electron-to-chromium "^1.4.668" 669 | node-releases "^2.0.14" 670 | update-browserslist-db "^1.0.13" 671 | 672 | camelcase@^6.3.0: 673 | version "6.3.0" 674 | resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" 675 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 676 | 677 | caniuse-lite@^1.0.30001587: 678 | version "1.0.30001626" 679 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001626.tgz" 680 | integrity sha512-JRW7kAH8PFJzoPCJhLSHgDgKg5348hsQ68aqb+slnzuB5QFERv846oA/mRChmlLAOdEDeOkRn3ynb1gSFnjt3w== 681 | 682 | caniuse-lite@^1.0.30001599: 683 | version "1.0.30001627" 684 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001627.tgz" 685 | integrity sha512-4zgNiB8nTyV/tHhwZrFs88ryjls/lHiqFhrxCW4qSTeuRByBVnPYpDInchOIySWknznucaf31Z4KYqjfbrecVw== 686 | 687 | chalk@^2.4.2: 688 | version "2.4.2" 689 | resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 690 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 691 | dependencies: 692 | ansi-styles "^3.2.1" 693 | escape-string-regexp "^1.0.5" 694 | supports-color "^5.3.0" 695 | 696 | code-block-writer@^13.0.1: 697 | version "13.0.1" 698 | resolved "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.1.tgz" 699 | integrity sha512-c5or4P6erEA69TxaxTNcHUNcIn+oyxSRTOWV+pSYF+z4epXqNvwvJ70XPGjPNgue83oAFAPBRQYwpAJ/Hpe/Sg== 700 | 701 | color-convert@^1.9.0: 702 | version "1.9.3" 703 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 704 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 705 | dependencies: 706 | color-name "1.1.3" 707 | 708 | color-name@1.1.3: 709 | version "1.1.3" 710 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 711 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 712 | 713 | computeds@^0.0.1: 714 | version "0.0.1" 715 | resolved "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz" 716 | integrity sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q== 717 | 718 | convert-source-map@^2.0.0: 719 | version "2.0.0" 720 | resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" 721 | integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== 722 | 723 | copy-anything@^2.0.1: 724 | version "2.0.6" 725 | resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" 726 | integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== 727 | dependencies: 728 | is-what "^3.14.1" 729 | 730 | cross-spawn@^7.0.3: 731 | version "7.0.3" 732 | resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" 733 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 734 | dependencies: 735 | path-key "^3.1.0" 736 | shebang-command "^2.0.0" 737 | which "^2.0.1" 738 | 739 | csstype@^3.1.3: 740 | version "3.1.3" 741 | resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" 742 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== 743 | 744 | de-indent@^1.0.2: 745 | version "1.0.2" 746 | resolved "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz" 747 | integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== 748 | 749 | debug@^4.1.0, debug@^4.3.1: 750 | version "4.3.5" 751 | resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" 752 | integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== 753 | dependencies: 754 | ms "2.1.2" 755 | 756 | electron-to-chromium@^1.4.668: 757 | version "1.4.788" 758 | resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.788.tgz" 759 | integrity sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA== 760 | 761 | entities@^4.5.0: 762 | version "4.5.0" 763 | resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" 764 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 765 | 766 | errno@^0.1.1: 767 | version "0.1.8" 768 | resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" 769 | integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== 770 | dependencies: 771 | prr "~1.0.1" 772 | 773 | esbuild@^0.18.10: 774 | version "0.18.20" 775 | resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz" 776 | integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== 777 | optionalDependencies: 778 | "@esbuild/android-arm" "0.18.20" 779 | "@esbuild/android-arm64" "0.18.20" 780 | "@esbuild/android-x64" "0.18.20" 781 | "@esbuild/darwin-arm64" "0.18.20" 782 | "@esbuild/darwin-x64" "0.18.20" 783 | "@esbuild/freebsd-arm64" "0.18.20" 784 | "@esbuild/freebsd-x64" "0.18.20" 785 | "@esbuild/linux-arm" "0.18.20" 786 | "@esbuild/linux-arm64" "0.18.20" 787 | "@esbuild/linux-ia32" "0.18.20" 788 | "@esbuild/linux-loong64" "0.18.20" 789 | "@esbuild/linux-mips64el" "0.18.20" 790 | "@esbuild/linux-ppc64" "0.18.20" 791 | "@esbuild/linux-riscv64" "0.18.20" 792 | "@esbuild/linux-s390x" "0.18.20" 793 | "@esbuild/linux-x64" "0.18.20" 794 | "@esbuild/netbsd-x64" "0.18.20" 795 | "@esbuild/openbsd-x64" "0.18.20" 796 | "@esbuild/sunos-x64" "0.18.20" 797 | "@esbuild/win32-arm64" "0.18.20" 798 | "@esbuild/win32-ia32" "0.18.20" 799 | "@esbuild/win32-x64" "0.18.20" 800 | 801 | escalade@^3.1.2: 802 | version "3.1.2" 803 | resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" 804 | integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== 805 | 806 | escape-string-regexp@^1.0.5: 807 | version "1.0.5" 808 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 809 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 810 | 811 | estree-walker@^2.0.2: 812 | version "2.0.2" 813 | resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" 814 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 815 | 816 | fast-glob@^3.3.2: 817 | version "3.3.2" 818 | resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" 819 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 820 | dependencies: 821 | "@nodelib/fs.stat" "^2.0.2" 822 | "@nodelib/fs.walk" "^1.2.3" 823 | glob-parent "^5.1.2" 824 | merge2 "^1.3.0" 825 | micromatch "^4.0.4" 826 | 827 | fastq@^1.6.0: 828 | version "1.17.1" 829 | resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" 830 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 831 | dependencies: 832 | reusify "^1.0.4" 833 | 834 | fill-range@^7.1.1: 835 | version "7.1.1" 836 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" 837 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 838 | dependencies: 839 | to-regex-range "^5.0.1" 840 | 841 | fraction.js@^4.3.7: 842 | version "4.3.7" 843 | resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" 844 | integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== 845 | 846 | fsevents@~2.3.2: 847 | version "2.3.3" 848 | resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" 849 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 850 | 851 | gensync@^1.0.0-beta.2: 852 | version "1.0.0-beta.2" 853 | resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" 854 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 855 | 856 | glob-parent@^5.1.2: 857 | version "5.1.2" 858 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 859 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 860 | dependencies: 861 | is-glob "^4.0.1" 862 | 863 | globals@^11.1.0: 864 | version "11.12.0" 865 | resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" 866 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 867 | 868 | graceful-fs@^4.1.2: 869 | version "4.2.11" 870 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" 871 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 872 | 873 | has-flag@^3.0.0: 874 | version "3.0.0" 875 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 876 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 877 | 878 | he@^1.2.0: 879 | version "1.2.0" 880 | resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" 881 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 882 | 883 | html-tags@^3.3.1: 884 | version "3.3.1" 885 | resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" 886 | integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== 887 | 888 | iconv-lite@^0.6.3: 889 | version "0.6.3" 890 | resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" 891 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 892 | dependencies: 893 | safer-buffer ">= 2.1.2 < 3.0.0" 894 | 895 | image-size@~0.5.0: 896 | version "0.5.5" 897 | resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" 898 | integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== 899 | 900 | is-extglob@^2.1.1: 901 | version "2.1.1" 902 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 903 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 904 | 905 | is-glob@^4.0.1: 906 | version "4.0.3" 907 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" 908 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 909 | dependencies: 910 | is-extglob "^2.1.1" 911 | 912 | is-number@^7.0.0: 913 | version "7.0.0" 914 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 915 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 916 | 917 | is-what@^3.14.1: 918 | version "3.14.1" 919 | resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" 920 | integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== 921 | 922 | isexe@^2.0.0: 923 | version "2.0.0" 924 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 925 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 926 | 927 | js-tokens@^4.0.0: 928 | version "4.0.0" 929 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 930 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 931 | 932 | jsesc@^2.5.1: 933 | version "2.5.2" 934 | resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" 935 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 936 | 937 | json-parse-even-better-errors@^3.0.0: 938 | version "3.0.2" 939 | resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz" 940 | integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== 941 | 942 | json5@^2.2.3: 943 | version "2.2.3" 944 | resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" 945 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 946 | 947 | less-loader@^12.2.0: 948 | version "12.2.0" 949 | resolved "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz" 950 | integrity sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg== 951 | 952 | less@^4.2.0: 953 | version "4.2.0" 954 | resolved "https://registry.npmjs.org/less/-/less-4.2.0.tgz" 955 | integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== 956 | dependencies: 957 | copy-anything "^2.0.1" 958 | parse-node-version "^1.0.1" 959 | tslib "^2.3.0" 960 | optionalDependencies: 961 | errno "^0.1.1" 962 | graceful-fs "^4.1.2" 963 | image-size "~0.5.0" 964 | make-dir "^2.1.0" 965 | mime "^1.4.1" 966 | needle "^3.1.0" 967 | source-map "~0.6.0" 968 | 969 | lru-cache@^5.1.1: 970 | version "5.1.1" 971 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" 972 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 973 | dependencies: 974 | yallist "^3.0.2" 975 | 976 | magic-string@^0.30.10: 977 | version "0.30.10" 978 | resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz" 979 | integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== 980 | dependencies: 981 | "@jridgewell/sourcemap-codec" "^1.4.15" 982 | 983 | make-dir@^2.1.0: 984 | version "2.1.0" 985 | resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" 986 | integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== 987 | dependencies: 988 | pify "^4.0.1" 989 | semver "^5.6.0" 990 | 991 | memorystream@^0.3.1: 992 | version "0.3.1" 993 | resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" 994 | integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== 995 | 996 | merge2@^1.3.0: 997 | version "1.4.1" 998 | resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" 999 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1000 | 1001 | micromatch@^4.0.4: 1002 | version "4.0.7" 1003 | resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz" 1004 | integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== 1005 | dependencies: 1006 | braces "^3.0.3" 1007 | picomatch "^2.3.1" 1008 | 1009 | mime@^1.4.1: 1010 | version "1.6.0" 1011 | resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" 1012 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1013 | 1014 | minimatch@^9.0.0, minimatch@^9.0.3: 1015 | version "9.0.4" 1016 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" 1017 | integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== 1018 | dependencies: 1019 | brace-expansion "^2.0.1" 1020 | 1021 | mkdirp@^3.0.1: 1022 | version "3.0.1" 1023 | resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz" 1024 | integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== 1025 | 1026 | ms@2.1.2: 1027 | version "2.1.2" 1028 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 1029 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1030 | 1031 | muggle-string@^0.4.0: 1032 | version "0.4.1" 1033 | resolved "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz" 1034 | integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== 1035 | 1036 | nanoid@^3.3.7: 1037 | version "3.3.7" 1038 | resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" 1039 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 1040 | 1041 | needle@^3.1.0: 1042 | version "3.3.1" 1043 | resolved "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz" 1044 | integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q== 1045 | dependencies: 1046 | iconv-lite "^0.6.3" 1047 | sax "^1.2.4" 1048 | 1049 | node-releases@^2.0.14: 1050 | version "2.0.14" 1051 | resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" 1052 | integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== 1053 | 1054 | normalize-range@^0.1.2: 1055 | version "0.1.2" 1056 | resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" 1057 | integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== 1058 | 1059 | npm-normalize-package-bin@^3.0.0: 1060 | version "3.0.1" 1061 | resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz" 1062 | integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== 1063 | 1064 | npm-run-all2@^6.2.0: 1065 | version "6.2.0" 1066 | resolved "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.2.0.tgz" 1067 | integrity sha512-wA7yVIkthe6qJBfiJ2g6aweaaRlw72itsFGF6HuwCHKwtwAx/4BY1vVpk6bw6lS8RLMsexoasOkd0aYOmsFG7Q== 1068 | dependencies: 1069 | ansi-styles "^6.2.1" 1070 | cross-spawn "^7.0.3" 1071 | memorystream "^0.3.1" 1072 | minimatch "^9.0.0" 1073 | pidtree "^0.6.0" 1074 | read-package-json-fast "^3.0.2" 1075 | shell-quote "^1.7.3" 1076 | 1077 | parse-node-version@^1.0.1: 1078 | version "1.0.1" 1079 | resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz" 1080 | integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== 1081 | 1082 | path-browserify@^1.0.1: 1083 | version "1.0.1" 1084 | resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" 1085 | integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== 1086 | 1087 | path-key@^3.1.0: 1088 | version "3.1.1" 1089 | resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" 1090 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1091 | 1092 | picocolors@^1.0.0, picocolors@^1.0.1: 1093 | version "1.0.1" 1094 | resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" 1095 | integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== 1096 | 1097 | picomatch@^2.3.1: 1098 | version "2.3.1" 1099 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 1100 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1101 | 1102 | pidtree@^0.6.0: 1103 | version "0.6.0" 1104 | resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" 1105 | integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== 1106 | 1107 | pify@^4.0.1: 1108 | version "4.0.1" 1109 | resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" 1110 | integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== 1111 | 1112 | postcss-value-parser@^4.2.0: 1113 | version "4.2.0" 1114 | resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" 1115 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== 1116 | 1117 | postcss@^8.4.27, postcss@^8.4.38: 1118 | version "8.4.38" 1119 | resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" 1120 | integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== 1121 | dependencies: 1122 | nanoid "^3.3.7" 1123 | picocolors "^1.0.0" 1124 | source-map-js "^1.2.0" 1125 | 1126 | prr@~1.0.1: 1127 | version "1.0.1" 1128 | resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" 1129 | integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== 1130 | 1131 | queue-microtask@^1.2.2: 1132 | version "1.2.3" 1133 | resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" 1134 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1135 | 1136 | read-package-json-fast@^3.0.2: 1137 | version "3.0.2" 1138 | resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz" 1139 | integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== 1140 | dependencies: 1141 | json-parse-even-better-errors "^3.0.0" 1142 | npm-normalize-package-bin "^3.0.0" 1143 | 1144 | reusify@^1.0.4: 1145 | version "1.0.4" 1146 | resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" 1147 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1148 | 1149 | rollup@^3.27.1: 1150 | version "3.29.4" 1151 | resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz" 1152 | integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== 1153 | optionalDependencies: 1154 | fsevents "~2.3.2" 1155 | 1156 | run-parallel@^1.1.9: 1157 | version "1.2.0" 1158 | resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" 1159 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1160 | dependencies: 1161 | queue-microtask "^1.2.2" 1162 | 1163 | "safer-buffer@>= 2.1.2 < 3.0.0": 1164 | version "2.1.2" 1165 | resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 1166 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1167 | 1168 | sax@^1.2.4: 1169 | version "1.4.1" 1170 | resolved "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz" 1171 | integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== 1172 | 1173 | semver@^5.6.0: 1174 | version "5.7.2" 1175 | resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" 1176 | integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== 1177 | 1178 | semver@^6.3.1: 1179 | version "6.3.1" 1180 | resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" 1181 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1182 | 1183 | semver@^7.5.4: 1184 | version "7.6.2" 1185 | resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" 1186 | integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== 1187 | 1188 | shebang-command@^2.0.0: 1189 | version "2.0.0" 1190 | resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" 1191 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1192 | dependencies: 1193 | shebang-regex "^3.0.0" 1194 | 1195 | shebang-regex@^3.0.0: 1196 | version "3.0.0" 1197 | resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" 1198 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1199 | 1200 | shell-quote@^1.7.3: 1201 | version "1.8.1" 1202 | resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" 1203 | integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== 1204 | 1205 | source-map-js@^1.2.0: 1206 | version "1.2.0" 1207 | resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" 1208 | integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== 1209 | 1210 | source-map@~0.6.0: 1211 | version "0.6.1" 1212 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" 1213 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1214 | 1215 | supports-color@^5.3.0: 1216 | version "5.5.0" 1217 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 1218 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1219 | dependencies: 1220 | has-flag "^3.0.0" 1221 | 1222 | svg-tags@^1.0.0: 1223 | version "1.0.0" 1224 | resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz" 1225 | integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== 1226 | 1227 | to-fast-properties@^2.0.0: 1228 | version "2.0.0" 1229 | resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" 1230 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 1231 | 1232 | to-regex-range@^5.0.1: 1233 | version "5.0.1" 1234 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 1235 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1236 | dependencies: 1237 | is-number "^7.0.0" 1238 | 1239 | ts-morph@^22.0.0: 1240 | version "22.0.0" 1241 | resolved "https://registry.npmjs.org/ts-morph/-/ts-morph-22.0.0.tgz" 1242 | integrity sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw== 1243 | dependencies: 1244 | "@ts-morph/common" "~0.23.0" 1245 | code-block-writer "^13.0.1" 1246 | 1247 | tslib@^2.3.0: 1248 | version "2.6.2" 1249 | resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" 1250 | integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== 1251 | 1252 | typescript@~5.4.0: 1253 | version "5.4.5" 1254 | resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" 1255 | integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== 1256 | 1257 | update-browserslist-db@^1.0.13: 1258 | version "1.0.16" 1259 | resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz" 1260 | integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== 1261 | dependencies: 1262 | escalade "^3.1.2" 1263 | picocolors "^1.0.1" 1264 | 1265 | vite@4.4.11: 1266 | version "4.4.11" 1267 | resolved "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz" 1268 | integrity sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A== 1269 | dependencies: 1270 | esbuild "^0.18.10" 1271 | postcss "^8.4.27" 1272 | rollup "^3.27.1" 1273 | optionalDependencies: 1274 | fsevents "~2.3.2" 1275 | 1276 | vue-template-compiler@^2.7.14: 1277 | version "2.7.16" 1278 | resolved "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz" 1279 | integrity sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ== 1280 | dependencies: 1281 | de-indent "^1.0.2" 1282 | he "^1.2.0" 1283 | 1284 | vue-tsc@^2.0.11: 1285 | version "2.0.19" 1286 | resolved "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.19.tgz" 1287 | integrity sha512-JWay5Zt2/871iodGF72cELIbcAoPyhJxq56mPPh+M2K7IwI688FMrFKc/+DvB05wDWEuCPexQJ6L10zSwzzapg== 1288 | dependencies: 1289 | "@volar/typescript" "~2.2.4" 1290 | "@vue/language-core" "2.0.19" 1291 | semver "^7.5.4" 1292 | 1293 | vue@^3.0.0: 1294 | version "3.4.27" 1295 | resolved "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz" 1296 | integrity sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA== 1297 | dependencies: 1298 | "@vue/compiler-dom" "3.4.27" 1299 | "@vue/compiler-sfc" "3.4.27" 1300 | "@vue/runtime-dom" "3.4.27" 1301 | "@vue/server-renderer" "3.4.27" 1302 | "@vue/shared" "3.4.27" 1303 | 1304 | which@^2.0.1: 1305 | version "2.0.2" 1306 | resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" 1307 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1308 | dependencies: 1309 | isexe "^2.0.0" 1310 | 1311 | yallist@^3.0.2: 1312 | version "3.1.1" 1313 | resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" 1314 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1315 | --------------------------------------------------------------------------------