├── index.ts ├── examples ├── vue │ ├── package.json │ ├── src │ │ ├── main.ts │ │ └── App.vue │ ├── vite.config.ts │ └── index.html └── react │ ├── src │ └── main.tsx │ ├── tsconfig.node.json │ ├── vite.config.ts │ ├── index.html │ ├── tsconfig.json │ └── App.tsx ├── .npmignore ├── tsconfig.json ├── vite.config.ts ├── LICENSE ├── .gitignore ├── package.json ├── README.md ├── src └── core │ └── Eraser.ts └── yarn.lock /index.ts: -------------------------------------------------------------------------------- 1 | import { eraser } from './src/core/Eraser'; 2 | export const Eraser =eraser 3 | -------------------------------------------------------------------------------- /examples/vue/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "picture-toolkit": "../../index.ts" 4 | } 5 | } -------------------------------------------------------------------------------- /examples/vue/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | 4 | const app = createApp(App) 5 | app.mount('#app') -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | examples/ 2 | node_modules/ 3 | src/ 4 | .gitignore 5 | tsconfig.json 6 | *.log 7 | dist/ 8 | coverage/ 9 | test/ 10 | .DS_Store 11 | .env 12 | .env.* 13 | .eslintrc* 14 | .prettierrc* 15 | jest.config.* -------------------------------------------------------------------------------- /examples/react/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from '../App' 4 | 5 | ReactDOM.createRoot(document.getElementById('root')!).render( 6 | 7 | 8 | 9 | ) -------------------------------------------------------------------------------- /examples/react/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } -------------------------------------------------------------------------------- /examples/react/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | import path from 'path' 4 | export default defineConfig({ 5 | plugins: [react()], 6 | root: path.resolve(__dirname, './'), 7 | resolve: { 8 | alias: { 9 | 'picture-toolkit': path.resolve(__dirname, '../../index.ts') 10 | } 11 | } 12 | }) -------------------------------------------------------------------------------- /examples/react/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Eraser React Demo 7 | 8 | 9 |
10 | 11 | 12 | -------------------------------------------------------------------------------- /examples/vue/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import vue from '@vitejs/plugin-vue'; 3 | import * as path from 'path'; 4 | 5 | export default defineConfig({ 6 | plugins: [vue()], 7 | root: path.resolve(__dirname, './'), 8 | resolve: { 9 | alias: { 10 | 'picture-toolkit': path.resolve(__dirname, '../../index.ts') 11 | } 12 | } 13 | }); -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2018", 4 | "module": "ESNext", 5 | "moduleResolution": "node", 6 | "declaration": true, 7 | "outDir": "./dist", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "skipLibCheck": true, 11 | "forceConsistentCasingInFileNames": true 12 | }, 13 | "include": ["index.ts"], 14 | "exclude": ["node_modules", "dist", "examples"] 15 | } -------------------------------------------------------------------------------- /examples/vue/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vue 3 + TypeScript + Vite 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { resolve } from 'path' 3 | 4 | export default defineConfig({ 5 | build: { 6 | lib: { 7 | entry: resolve(__dirname, 'src/index.ts'), 8 | name: 'Eraser', 9 | fileName: 'eraser' 10 | }, 11 | rollupOptions: { 12 | external: ['vue', 'react'], 13 | output: { 14 | globals: { 15 | vue: 'Vue', 16 | react: 'React' 17 | } 18 | } 19 | } 20 | } 21 | }) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [year] [your name] 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 | [... rest of MIT license text ...] -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | node_modules/ 3 | .pnp 4 | .pnp.js 5 | 6 | # Build 7 | dist/ 8 | build/ 9 | 10 | # Testing 11 | coverage/ 12 | 13 | # Env files 14 | .env 15 | .env.local 16 | .env.development.local 17 | .env.test.local 18 | .env.production.local 19 | 20 | # Editor directories and files 21 | .idea/ 22 | .vscode/ 23 | *.suo 24 | *.ntvs* 25 | *.njsproj 26 | *.sln 27 | *.sw? 28 | 29 | # OS 30 | .DS_Store 31 | Thumbs.db 32 | 33 | # Logs 34 | npm-debug.log* 35 | yarn-debug.log* 36 | yarn-error.log* 37 | pnpm-debug.log* 38 | 39 | # Cache 40 | .cache/ 41 | .temp/ -------------------------------------------------------------------------------- /examples/react/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | "moduleResolution": "bundler", 9 | "allowImportingTsExtensions": true, 10 | "resolveJsonModule": true, 11 | "isolatedModules": true, 12 | "noEmit": true, 13 | "jsx": "react-jsx", 14 | "strict": true, 15 | "noUnusedLocals": true, 16 | "noUnusedParameters": true, 17 | "noFallthroughCasesInSwitch": true 18 | }, 19 | "include": ["src"], 20 | "references": [{ "path": "./tsconfig.node.json" }] 21 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "picture-toolkit", 3 | "version": "1.0.4", 4 | "description": "A toolkit for image processing with Vue and React support", 5 | "main": "dist/index.js", 6 | "module": "dist/index.mjs", 7 | "types": "dist/index.d.ts", 8 | "files": [ 9 | "dist" 10 | ], 11 | "scripts": { 12 | "build": "tsup index.ts --format cjs,esm --dts", 13 | "dev": "tsup index.ts --format cjs,esm --dts --watch", 14 | "prepublishOnly": "npm run build" 15 | }, 16 | "keywords": [ 17 | "image", 18 | "toolkit", 19 | "vue", 20 | "react", 21 | "typescript" 22 | ], 23 | "author": "twelve-web", 24 | "license": "MIT", 25 | "repository": { 26 | "type": "git", 27 | "url": "https://github.com/twelve-web/picture-toolkit" 28 | }, 29 | "devDependencies": { 30 | "tsup": "^8.3.6", 31 | "typescript": "^5.7.3" 32 | }, 33 | "peerDependencies": { 34 | "react": ">=16.8.0", 35 | "react-dom": ">=16.8.0", 36 | "vue": ">=3.0.0" 37 | }, 38 | "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610" 39 | } 40 | -------------------------------------------------------------------------------- /examples/vue/src/App.vue: -------------------------------------------------------------------------------- 1 | 8 | 41 | 42 | 49 | -------------------------------------------------------------------------------- /examples/react/App.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef, useState } from 'react' 2 | import { Eraser } from 'picture-toolkit' 3 | 4 | function App() { 5 | const containerRef = useRef(null) 6 | const [imgFile, setImgFile] = useState(null) 7 | const [eraser, setEarser] = useState(null) 8 | const [imgList, setImgList] = useState([]) 9 | const handleFileChange = (e: React.ChangeEvent) => { 10 | const file = e.target.files?.[0] 11 | if (file) { 12 | setImgFile(file) 13 | } 14 | } 15 | 16 | useEffect(() => { 17 | if (imgFile && containerRef.current) { 18 | const newEarser = new Eraser({ 19 | imgFile: imgFile, 20 | onMaskChange: (originalBase64: string, maskBase64: string) => { 21 | console.log(originalBase64, maskBase64, '===') 22 | setImgList([ originalBase64, maskBase64]) 23 | } 24 | }) 25 | 26 | newEarser.mount(containerRef.current) 27 | setEarser(newEarser) 28 | } 29 | }, [imgFile]) 30 | 31 | 32 | 33 | return ( 34 |
35 |

Eraser React Demo

36 |
44 | 45 | {imgList.map((item, index) => ( 46 | img 47 | ))} 48 |
49 | ) 50 | } 51 | 52 | export default App -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Picture-toolkit 🎨 2 | 3 | 一个轻量级的图片编辑器组件库,支持任何前端框架。✨ 4 | - 目前支持擦除图片功能(返回原图和擦除部分的mask) 5 | 6 | ## API 7 | 可以调用阿里云免费的图片擦除API 8 | [免费API地址](https://help.aliyun.com/zh/model-studio/developer-reference/image-erase-completion-api-reference?spm=a2c4g.11186623.help-menu-2400256.d_3_3_3_6.141f7980aRvtsb) 9 | ## 特性 🌟 10 | - 支持自由绘制蒙版 ✍️ 11 | - 自动保持图片原始比例 🔄 12 | - 精确的鼠标位置追踪 🖱️ 13 | - 实时预览编辑效果 👀 14 | - 高性能画布渲染 🚀 15 | 16 | ## 安装 🛠️ 17 | 18 | ```bash 19 | npm install picture-toolkit 20 | ``` 21 | 22 | 23 | ## 使用示例 📦 24 | ![demo image](http://static.markweb.top/static/demo.png) 25 | ### Vue 3: 26 | ```js 27 | // 示例代码 28 | 35 | 67 | ``` 68 | 69 | ### React: 70 | ```js 71 | // 示例代码 72 | import { useEffect, useRef, useState } from 'react' 73 | import { Eraser } from 'picture-toolkit' 74 | 75 | function App() { 76 | const containerRef = useRef(null) 77 | const [imgFile, setImgFile] = useState(null) 78 | const [eraser, setEarser] = useState(null) 79 | const [imgList, setImgList] = useState([]) 80 | const handleFileChange = (e: React.ChangeEvent) => { 81 | const file = e.target.files?.[0] 82 | if (file) { 83 | setImgFile(file) 84 | } 85 | } 86 | 87 | useEffect(() => { 88 | if (imgFile && containerRef.current) { 89 | const newEarser = new Eraser({ 90 | imgFile: imgFile, 91 | onMaskChange: (originalBase64: string, maskBase64: string) => { 92 | console.log(originalBase64, maskBase64, '===') 93 | setImgList([ originalBase64, maskBase64]) 94 | } 95 | }) 96 | 97 | newEarser.mount(containerRef.current) 98 | setEarser(newEarser) 99 | } 100 | }, [imgFile]) 101 | 102 | 103 | 104 | return ( 105 |
106 |

Eraser React Demo

107 |
115 | 116 | {imgList.map((item, index) => ( 117 | img 118 | ))} 119 |
120 | ) 121 | } 122 | 123 | export default App 124 | ``` 125 | 126 | ## API 📑 127 | 128 | ### Props 属性: 129 | - **imgFile**: `File` 类型,必填,要编辑的图片文件 🖼️ 130 | - **brushSize**: `number` 类型,可选,默认 `20`,画笔大小 🖌️ 131 | - **brushColor**: `string` 类型,可选,默认 `rgba(0,0,0,0.6)`,画笔颜色 🎨 132 | 133 | ### Events 事件: 134 | - **maskChange**: 蒙版变化时触发,参数 `(originalBase64, maskBase64)` ⚡ 135 | 136 | ## 本地开发 💻 137 | 138 | ### 安装依赖: 139 | ```bash 140 | yarn install 141 | ``` 142 | 143 | ### 启动 Vue 示例: 144 | ```bash 145 | yarn dev:vue 146 | ``` 147 | 148 | ### 启动 React 示例: 149 | ```bash 150 | yarn dev:react 151 | ``` 152 | 153 | ### 构建所有包: 154 | ```bash 155 | yarn build 156 | ``` 157 | 158 | ### 清理构建文件和依赖: 159 | ```bash 160 | yarn clean 161 | ``` 162 | 163 | ## 项目结构 📁 164 | ``` 165 | . 166 | ├── examples/ # 示例项目 167 | │ ├── vue/ # Vue 示例项目 168 | │ │ ├── src/ # 源代码目录 169 | │ │ │ ├── App.vue # 主应用组件 170 | │ │ │ └── main.ts # 入口文件 171 | │ │ ├── index.html # HTML 模板 172 | │ │ ├── vite.config.ts # Vite 配置 173 | │ │ └── package.json # 项目配置 174 | │ │ 175 | │ └── react/ # React 示例项目 176 | │ ├── src/ # 源代码目录 177 | │ │ ├── App.tsx # 主应用组件 178 | │ │ └── main.tsx # 入口文件 179 | │ ├── index.html # HTML 模板 180 | │ ├── tsconfig.json # TypeScript 配置 181 | │ ├── tsconfig.node.json # Node TypeScript 配置 182 | │ ├── vite.config.ts # Vite 配置 183 | │ └── package.json # 项目配置 184 | │ 185 | └── README.md # 项目说明文档 -------------------------------------------------------------------------------- /src/core/Eraser.ts: -------------------------------------------------------------------------------- 1 | export interface CanvasProps { 2 | imgFile: File; 3 | brushSize?: number; 4 | brushColor?: string; 5 | onMaskChange?: (originalBase64: string, maskBase64: string) => void; 6 | } 7 | interface Point { 8 | x: number; 9 | y: number; 10 | } 11 | interface DrawParams { 12 | offsetX: number; 13 | offsetY: number; 14 | drawWidth: number; 15 | drawHeight: number; 16 | } 17 | export class Eraser { 18 | private canvas: HTMLCanvasElement; 19 | private ctx: CanvasRenderingContext2D | null; 20 | private maskCanvas: HTMLCanvasElement; 21 | private maskCtx: CanvasRenderingContext2D | null; 22 | private tempCanvas: HTMLCanvasElement; 23 | private tempCtx: CanvasRenderingContext2D | null; 24 | private originImage: HTMLImageElement | null = null; 25 | private container: HTMLElement | null = null; 26 | private _drawParams: DrawParams | null = null; 27 | private isDrawing = false; //是否按下鼠标 正在画 28 | private currentPath: Point[] = []; //当前绘制路径 29 | 30 | /** 事件处理函数 */ 31 | private boundStartDrawing: (e: MouseEvent) => void; // 开始绘制的绑定事件处理函数 32 | private boundDraw: (e: MouseEvent) => void; // 绘制过程的绑定事件处理函数 33 | private boundStopDrawing: (e: MouseEvent) => void; // 结束绘制的绑定事件处理函数 34 | constructor(private props: CanvasProps) { 35 | this.canvas = document.createElement("canvas"); 36 | this.ctx = this.canvas.getContext("2d", { alpha: false }); 37 | this.maskCanvas = document.createElement("canvas"); 38 | this.maskCtx = this.maskCanvas.getContext("2d"); 39 | this.tempCanvas = document.createElement("canvas"); 40 | this.tempCtx = this.tempCanvas.getContext("2d"); 41 | this.boundStartDrawing = this.startDrawing.bind(this); 42 | this.boundDraw = this.draw.bind(this); 43 | this.boundStopDrawing = this.stopDrawing.bind(this); 44 | this.canvas.addEventListener("mousedown", this.boundStartDrawing); 45 | this.canvas.addEventListener("mousemove", this.boundDraw); 46 | this.canvas.addEventListener("mouseup", this.boundStopDrawing); 47 | this.canvas.addEventListener("mouseleave", this.boundStopDrawing); 48 | } 49 | startDrawing(e: MouseEvent) { 50 | this.isDrawing = true; 51 | const point = this.getMousePosition(e); 52 | if (point) { 53 | this.currentPath = [point]; 54 | } 55 | } 56 | draw(e: MouseEvent) { 57 | if (!this.isDrawing) return; 58 | const point = this.getMousePosition(e); 59 | if (point) { 60 | this.currentPath.push(point); 61 | this.drawPath(); 62 | } 63 | } 64 | stopDrawing(_e: MouseEvent) { 65 | if (!this.isDrawing) return; 66 | this.isDrawing = false; 67 | this.currentPath = []; 68 | 69 | // 触发蒙版变化事件 70 | if (this.props.onMaskChange) { 71 | const exportCanvas = document.createElement("canvas"); 72 | const exportCtx = exportCanvas.getContext("2d"); 73 | if (!exportCtx || !this._drawParams || !this.originImage) return; 74 | 75 | const { offsetX, offsetY, drawWidth, drawHeight } = this._drawParams; 76 | exportCanvas.width = this.canvas.width; 77 | exportCanvas.height = this.canvas.height; 78 | 79 | exportCtx.drawImage( 80 | this.originImage, 81 | 0, 82 | 0, 83 | this.originImage.width, 84 | this.originImage.height, 85 | offsetX, 86 | offsetY, 87 | drawWidth, 88 | drawHeight 89 | ); 90 | 91 | this.props.onMaskChange( 92 | exportCanvas.toDataURL(), 93 | this.maskCanvas.toDataURL() 94 | ); 95 | } 96 | } 97 | private drawPath() { 98 | if (!this.tempCtx || !this.maskCtx) return; 99 | // 绘制临时画布 100 | this.tempCtx.beginPath(); 101 | this.tempCtx.moveTo(this.currentPath[0].x, this.currentPath[0].y); 102 | this.currentPath.forEach((point) => { 103 | this.tempCtx!.lineTo(point.x, point.y); 104 | }); 105 | this.tempCtx.lineCap = "round"; 106 | this.tempCtx.lineJoin = "round"; 107 | this.tempCtx.strokeStyle = this.props.brushColor ?? "#000000"; 108 | this.tempCtx.lineWidth = this.props.brushSize ?? 10; 109 | this.tempCtx.stroke(); 110 | // 绘制蒙版 111 | this.maskCtx!.beginPath(); 112 | this.maskCtx!.moveTo(this.currentPath[0].x, this.currentPath[0].y); 113 | this.currentPath.forEach((point) => { 114 | this.maskCtx!.lineTo(point.x, point.y); 115 | }); 116 | this.maskCtx.lineCap = "round"; 117 | this.maskCtx.lineJoin = "round"; 118 | this.maskCtx.strokeStyle = "#ffffff"; 119 | this.maskCtx.lineWidth = this.props.brushSize ?? 10; 120 | this.maskCtx.stroke(); 121 | 122 | this.updateCanvas(); 123 | } 124 | public mount(container: HTMLElement) { 125 | this.container = container; 126 | container.style.position = "relative"; 127 | container.appendChild(this.canvas); 128 | this.loadImage(); 129 | } 130 | public unmount() { 131 | this.container?.removeChild(this.canvas); 132 | this.destroy(); 133 | } 134 | public destroy() { 135 | this.canvas.removeEventListener("mousedown", this.boundStartDrawing); 136 | this.canvas.removeEventListener("mousemove", this.boundDraw); 137 | this.canvas.removeEventListener("mouseup", this.boundStopDrawing); 138 | this.canvas.removeEventListener("mouseleave", this.boundStopDrawing); 139 | } 140 | private loadImage() { 141 | const img = new Image(); 142 | img.src = URL.createObjectURL(this.props.imgFile); 143 | img.onload = () => { 144 | this.originImage = img; 145 | this.canvas.width = img.width; 146 | this.canvas.height = img.height; 147 | URL.revokeObjectURL(img.src); 148 | this.uploadDrawParams(); 149 | }; 150 | } 151 | private uploadDrawParams() { 152 | if (!this.originImage || !this.container) return; 153 | const { width: originWidth, height: originHeight } = this.originImage; 154 | const { clientWidth: containerWidth, clientHeight: containerHeight } = 155 | this.container; 156 | const originRatio = originWidth / originHeight; 157 | const containerRatio = containerWidth / containerHeight; 158 | const { width, height } = this.calculateDimensions( 159 | containerWidth, 160 | containerHeight, 161 | originRatio, 162 | containerRatio 163 | ); 164 | this.canvas.width = width; 165 | this.canvas.height = height; 166 | this._drawParams = { 167 | offsetX: 0, 168 | offsetY: 0, 169 | drawWidth: width, 170 | drawHeight: height, 171 | }; 172 | this.setCanvasStyles(width, height); 173 | this.setCanvasDimensions(width, height); 174 | 175 | this.ctx?.drawImage( 176 | this.originImage, 177 | 0, 178 | 0, 179 | this.originImage.width, 180 | this.originImage.height, 181 | 0, 182 | 0, 183 | width, 184 | height 185 | ); 186 | this.initializeMask(width, height); 187 | } 188 | /** 189 | * 计算画布的最终尺寸 190 | * @param containerWidth - 容器宽度 191 | * @param containerHeight - 容器高度 192 | * @param imageRatio - 原始图片的宽高比 193 | * @param containerRatio - 容器的宽高比 194 | * @returns {{ width: number, height: number }} 计算后的画布尺寸 195 | * 196 | * 计算逻辑: 197 | * 1. 如果图片比例大于容器比例(图片较宽),则以容器宽度为基准 198 | * 2. 如果图片比例小于容器比例(图片较高),则以容器高度为基准 199 | * 这样可以确保图片完整显示且不变形 200 | */ 201 | private calculateDimensions( 202 | containerWidth: number, 203 | containerHeight: number, 204 | imageRatio: number, 205 | containerRatio: number 206 | ): { width: number; height: number } { 207 | if (imageRatio > containerRatio) { 208 | // 图片较宽的情况:使用容器宽度,高度按比例计算 209 | return { 210 | width: containerWidth, //同等高度下,图片比例比容器大所以宽度可能超出容器 占容器100% 1.5/1 1.2/1 211 | height: containerWidth / imageRatio, 212 | }; 213 | } else { 214 | // 图片较高的情况:使用容器高度,宽度按比例计算 215 | return { 216 | width: containerHeight * imageRatio, 217 | height: containerHeight, //同等宽度下,图片比例比容器小所以高度可能超出容器 占容器100% 1/1.5 1/1.8 218 | }; 219 | } 220 | } 221 | 222 | /** 223 | * 设置画布的CSS样式 224 | * @param width - 画布宽度 225 | * @param height - 画布高度 226 | * 227 | * 样式设置: 228 | * 1. 使用绝对定位 229 | * 2. 设置在容器中心点 230 | * 3. 使用transform进行居中偏移 231 | * 4. 设置实际显示尺寸 232 | */ 233 | private setCanvasStyles(width: number, height: number) { 234 | Object.assign(this.canvas.style, { 235 | position: "absolute", // 使用绝对定位以便精确控制位置 236 | left: "50%", // 水平居中 237 | top: "50%", // 垂直居中 238 | transform: "translate(-50%, -50%)", // 补偿居中偏移 239 | width: `${width}px`, // 设置实际显示宽度 240 | height: `${height}px`, // 设置实际显示高度 241 | }); 242 | } 243 | /** 244 | * 统一设置所有画布的尺寸 245 | * @param width - 画布宽度 246 | * @param height - 画布高度 247 | * 248 | * 包括: 249 | * - 主画布(this.canvas):用于显示最终结果 250 | * - 蒙版画布(this.maskCanvas):存储蒙版数据 251 | * - 临时画布(this.tempCanvas):用于绘制过程 252 | */ 253 | private setCanvasDimensions(width: number, height: number) { 254 | [this.canvas, this.maskCanvas, this.tempCanvas].forEach((canvas) => { 255 | canvas.width = width; 256 | canvas.height = height; 257 | }); 258 | } 259 | private initializeMask(width: number, height: number) { 260 | if (!this.maskCtx) return; 261 | this.maskCtx.fillStyle = "#000000"; // 设置填充颜色为黑色 262 | this.maskCtx.fillRect(0, 0, width, height); // 填充整个画布 263 | } 264 | private getMousePosition(e: MouseEvent): Point | null { 265 | if (!this._drawParams) return null; 266 | 267 | const rect = this.canvas.getBoundingClientRect(); 268 | const x = e.clientX - rect.left; 269 | const y = e.clientY - rect.top; 270 | 271 | return { x, y }; 272 | } 273 | // 更新画布绘制 274 | private updateCanvas() { 275 | if (!this.originImage || !this._drawParams) { 276 | console.log("Cannot update canvas - missing image or draw params"); 277 | return; 278 | } 279 | 280 | const { offsetX, offsetY, drawWidth, drawHeight } = this._drawParams; 281 | console.log("Updating canvas with params:", { 282 | offsetX, 283 | offsetY, 284 | drawWidth, 285 | drawHeight, 286 | }); 287 | if (!this.ctx) return; 288 | // 清除整个画布 289 | this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); 290 | 291 | // 保持图片原始比例绘制 292 | this.ctx.drawImage( 293 | this.originImage, 294 | 0, // 源图像的 x 坐标 295 | 0, // 源图像的 y 坐标 296 | this.originImage.width, // 源图像的宽度 297 | this.originImage.height, // 源图像的高度 298 | offsetX, // 目标位置的 x 坐标 299 | offsetY, // 目标位置的 y 坐标 300 | drawWidth, // 绘制的宽度 301 | drawHeight // 绘制的高度 302 | ); 303 | 304 | // 绘制临时画布内容 305 | this.ctx.drawImage( 306 | this.tempCanvas, 307 | 0, 308 | 0, 309 | this.tempCanvas.width, 310 | this.tempCanvas.height, 311 | offsetX, 312 | offsetY, 313 | drawWidth, 314 | drawHeight 315 | ); 316 | this.notifyChange(); 317 | } 318 | private notifyChange() { 319 | if (!this._drawParams || !this.originImage) return; 320 | 321 | const { offsetX, offsetY, drawWidth, drawHeight } = this._drawParams; 322 | 323 | if (this.props.onMaskChange) { 324 | const exportCanvas = document.createElement("canvas"); 325 | const exportCtx = exportCanvas.getContext("2d"); 326 | exportCanvas.width = this.canvas.width; 327 | exportCanvas.height = this.canvas.height; 328 | exportCtx?.drawImage( 329 | this.originImage, 330 | 0, // 源图像的 x 坐标 331 | 0, // 源图像的 y 坐标 332 | this.originImage.width, // 源图像的宽度 333 | this.originImage.height, // 源图像的高度 334 | offsetX, // 目标位置的 x 坐标 335 | offsetY, // 目标位置的 y 坐标 336 | drawWidth, // 绘制的宽度 337 | drawHeight // 绘制的高度 338 | ); 339 | const originalBase64 = exportCanvas.toDataURL(); 340 | const maskBase64 = this.maskCanvas.toDataURL(); 341 | this.props.onMaskChange(originalBase64, maskBase64); 342 | } 343 | } 344 | } 345 | 346 | // 导出默认实例创建函数 347 | export const eraser = Eraser 348 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@esbuild/aix-ppc64@0.24.2": 6 | version "0.24.2" 7 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461" 8 | integrity sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA== 9 | 10 | "@esbuild/android-arm64@0.24.2": 11 | version "0.24.2" 12 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz#f592957ae8b5643129fa889c79e69cd8669bb894" 13 | integrity sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg== 14 | 15 | "@esbuild/android-arm@0.24.2": 16 | version "0.24.2" 17 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz#72d8a2063aa630308af486a7e5cbcd1e134335b3" 18 | integrity sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q== 19 | 20 | "@esbuild/android-x64@0.24.2": 21 | version "0.24.2" 22 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz#9a7713504d5f04792f33be9c197a882b2d88febb" 23 | integrity sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw== 24 | 25 | "@esbuild/darwin-arm64@0.24.2": 26 | version "0.24.2" 27 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz#02ae04ad8ebffd6e2ea096181b3366816b2b5936" 28 | integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== 29 | 30 | "@esbuild/darwin-x64@0.24.2": 31 | version "0.24.2" 32 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz#9ec312bc29c60e1b6cecadc82bd504d8adaa19e9" 33 | integrity sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA== 34 | 35 | "@esbuild/freebsd-arm64@0.24.2": 36 | version "0.24.2" 37 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz#5e82f44cb4906d6aebf24497d6a068cfc152fa00" 38 | integrity sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg== 39 | 40 | "@esbuild/freebsd-x64@0.24.2": 41 | version "0.24.2" 42 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz#3fb1ce92f276168b75074b4e51aa0d8141ecce7f" 43 | integrity sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q== 44 | 45 | "@esbuild/linux-arm64@0.24.2": 46 | version "0.24.2" 47 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz#856b632d79eb80aec0864381efd29de8fd0b1f43" 48 | integrity sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg== 49 | 50 | "@esbuild/linux-arm@0.24.2": 51 | version "0.24.2" 52 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz#c846b4694dc5a75d1444f52257ccc5659021b736" 53 | integrity sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA== 54 | 55 | "@esbuild/linux-ia32@0.24.2": 56 | version "0.24.2" 57 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz#f8a16615a78826ccbb6566fab9a9606cfd4a37d5" 58 | integrity sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw== 59 | 60 | "@esbuild/linux-loong64@0.24.2": 61 | version "0.24.2" 62 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz#1c451538c765bf14913512c76ed8a351e18b09fc" 63 | integrity sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ== 64 | 65 | "@esbuild/linux-mips64el@0.24.2": 66 | version "0.24.2" 67 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz#0846edeefbc3d8d50645c51869cc64401d9239cb" 68 | integrity sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw== 69 | 70 | "@esbuild/linux-ppc64@0.24.2": 71 | version "0.24.2" 72 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz#8e3fc54505671d193337a36dfd4c1a23b8a41412" 73 | integrity sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw== 74 | 75 | "@esbuild/linux-riscv64@0.24.2": 76 | version "0.24.2" 77 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz#6a1e92096d5e68f7bb10a0d64bb5b6d1daf9a694" 78 | integrity sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q== 79 | 80 | "@esbuild/linux-s390x@0.24.2": 81 | version "0.24.2" 82 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz#ab18e56e66f7a3c49cb97d337cd0a6fea28a8577" 83 | integrity sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw== 84 | 85 | "@esbuild/linux-x64@0.24.2": 86 | version "0.24.2" 87 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" 88 | integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== 89 | 90 | "@esbuild/netbsd-arm64@0.24.2": 91 | version "0.24.2" 92 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz#65f19161432bafb3981f5f20a7ff45abb2e708e6" 93 | integrity sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw== 94 | 95 | "@esbuild/netbsd-x64@0.24.2": 96 | version "0.24.2" 97 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz#7a3a97d77abfd11765a72f1c6f9b18f5396bcc40" 98 | integrity sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw== 99 | 100 | "@esbuild/openbsd-arm64@0.24.2": 101 | version "0.24.2" 102 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz#58b00238dd8f123bfff68d3acc53a6ee369af89f" 103 | integrity sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A== 104 | 105 | "@esbuild/openbsd-x64@0.24.2": 106 | version "0.24.2" 107 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz#0ac843fda0feb85a93e288842936c21a00a8a205" 108 | integrity sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA== 109 | 110 | "@esbuild/sunos-x64@0.24.2": 111 | version "0.24.2" 112 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz#8b7aa895e07828d36c422a4404cc2ecf27fb15c6" 113 | integrity sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig== 114 | 115 | "@esbuild/win32-arm64@0.24.2": 116 | version "0.24.2" 117 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz#c023afb647cabf0c3ed13f0eddfc4f1d61c66a85" 118 | integrity sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ== 119 | 120 | "@esbuild/win32-ia32@0.24.2": 121 | version "0.24.2" 122 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz#96c356132d2dda990098c8b8b951209c3cd743c2" 123 | integrity sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA== 124 | 125 | "@esbuild/win32-x64@0.24.2": 126 | version "0.24.2" 127 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz#34aa0b52d0fbb1a654b596acfa595f0c7b77a77b" 128 | integrity sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== 129 | 130 | "@isaacs/cliui@^8.0.2": 131 | version "8.0.2" 132 | resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" 133 | integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== 134 | dependencies: 135 | string-width "^5.1.2" 136 | string-width-cjs "npm:string-width@^4.2.0" 137 | strip-ansi "^7.0.1" 138 | strip-ansi-cjs "npm:strip-ansi@^6.0.1" 139 | wrap-ansi "^8.1.0" 140 | wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" 141 | 142 | "@jridgewell/gen-mapping@^0.3.2": 143 | version "0.3.8" 144 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" 145 | integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== 146 | dependencies: 147 | "@jridgewell/set-array" "^1.2.1" 148 | "@jridgewell/sourcemap-codec" "^1.4.10" 149 | "@jridgewell/trace-mapping" "^0.3.24" 150 | 151 | "@jridgewell/resolve-uri@^3.1.0": 152 | version "3.1.2" 153 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" 154 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 155 | 156 | "@jridgewell/set-array@^1.2.1": 157 | version "1.2.1" 158 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" 159 | integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== 160 | 161 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 162 | version "1.5.0" 163 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" 164 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 165 | 166 | "@jridgewell/trace-mapping@^0.3.24": 167 | version "0.3.25" 168 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" 169 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 170 | dependencies: 171 | "@jridgewell/resolve-uri" "^3.1.0" 172 | "@jridgewell/sourcemap-codec" "^1.4.14" 173 | 174 | "@pkgjs/parseargs@^0.11.0": 175 | version "0.11.0" 176 | resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" 177 | integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== 178 | 179 | "@rollup/rollup-android-arm-eabi@4.34.8": 180 | version "4.34.8" 181 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz#731df27dfdb77189547bcef96ada7bf166bbb2fb" 182 | integrity sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw== 183 | 184 | "@rollup/rollup-android-arm64@4.34.8": 185 | version "4.34.8" 186 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz#4bea6db78e1f6927405df7fe0faf2f5095e01343" 187 | integrity sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q== 188 | 189 | "@rollup/rollup-darwin-arm64@4.34.8": 190 | version "4.34.8" 191 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz#a7aab77d44be3c44a20f946e10160f84e5450e7f" 192 | integrity sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q== 193 | 194 | "@rollup/rollup-darwin-x64@4.34.8": 195 | version "4.34.8" 196 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz#c572c024b57ee8ddd1b0851703ace9eb6cc0dd82" 197 | integrity sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw== 198 | 199 | "@rollup/rollup-freebsd-arm64@4.34.8": 200 | version "4.34.8" 201 | resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz#cf74f8113b5a83098a5c026c165742277cbfb88b" 202 | integrity sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA== 203 | 204 | "@rollup/rollup-freebsd-x64@4.34.8": 205 | version "4.34.8" 206 | resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz#39561f3a2f201a4ad6a01425b1ff5928154ecd7c" 207 | integrity sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q== 208 | 209 | "@rollup/rollup-linux-arm-gnueabihf@4.34.8": 210 | version "4.34.8" 211 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz#980d6061e373bfdaeb67925c46d2f8f9b3de537f" 212 | integrity sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g== 213 | 214 | "@rollup/rollup-linux-arm-musleabihf@4.34.8": 215 | version "4.34.8" 216 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz#f91a90f30dc00d5a64ac2d9bbedc829cd3cfaa78" 217 | integrity sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA== 218 | 219 | "@rollup/rollup-linux-arm64-gnu@4.34.8": 220 | version "4.34.8" 221 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz#fac700fa5c38bc13a0d5d34463133093da4c92a0" 222 | integrity sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A== 223 | 224 | "@rollup/rollup-linux-arm64-musl@4.34.8": 225 | version "4.34.8" 226 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz#f50ecccf8c78841ff6df1706bc4782d7f62bf9c3" 227 | integrity sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q== 228 | 229 | "@rollup/rollup-linux-loongarch64-gnu@4.34.8": 230 | version "4.34.8" 231 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz#5869dc0b28242da6553e2b52af41374f4038cd6e" 232 | integrity sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ== 233 | 234 | "@rollup/rollup-linux-powerpc64le-gnu@4.34.8": 235 | version "4.34.8" 236 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz#5cdd9f851ce1bea33d6844a69f9574de335f20b1" 237 | integrity sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw== 238 | 239 | "@rollup/rollup-linux-riscv64-gnu@4.34.8": 240 | version "4.34.8" 241 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz#ef5dc37f4388f5253f0def43e1440ec012af204d" 242 | integrity sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw== 243 | 244 | "@rollup/rollup-linux-s390x-gnu@4.34.8": 245 | version "4.34.8" 246 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz#7dbc3ccbcbcfb3e65be74538dfb6e8dd16178fde" 247 | integrity sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA== 248 | 249 | "@rollup/rollup-linux-x64-gnu@4.34.8": 250 | version "4.34.8" 251 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz#5783fc0adcab7dc069692056e8ca8d83709855ce" 252 | integrity sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA== 253 | 254 | "@rollup/rollup-linux-x64-musl@4.34.8": 255 | version "4.34.8" 256 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz#00b6c29b298197a384e3c659910b47943003a678" 257 | integrity sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ== 258 | 259 | "@rollup/rollup-win32-arm64-msvc@4.34.8": 260 | version "4.34.8" 261 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz#cbfee01f1fe73791c35191a05397838520ca3cdd" 262 | integrity sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ== 263 | 264 | "@rollup/rollup-win32-ia32-msvc@4.34.8": 265 | version "4.34.8" 266 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz#95cdbdff48fe6c948abcf6a1d500b2bd5ce33f62" 267 | integrity sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w== 268 | 269 | "@rollup/rollup-win32-x64-msvc@4.34.8": 270 | version "4.34.8" 271 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz#4cdb2cfae69cdb7b1a3cc58778e820408075e928" 272 | integrity sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g== 273 | 274 | "@types/estree@1.0.6": 275 | version "1.0.6" 276 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" 277 | integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== 278 | 279 | ansi-regex@^5.0.1: 280 | version "5.0.1" 281 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 282 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 283 | 284 | ansi-regex@^6.0.1: 285 | version "6.1.0" 286 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" 287 | integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== 288 | 289 | ansi-styles@^4.0.0: 290 | version "4.3.0" 291 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 292 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 293 | dependencies: 294 | color-convert "^2.0.1" 295 | 296 | ansi-styles@^6.1.0: 297 | version "6.2.1" 298 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" 299 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 300 | 301 | any-promise@^1.0.0: 302 | version "1.3.0" 303 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 304 | integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== 305 | 306 | balanced-match@^1.0.0: 307 | version "1.0.2" 308 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 309 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 310 | 311 | brace-expansion@^2.0.1: 312 | version "2.0.1" 313 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 314 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 315 | dependencies: 316 | balanced-match "^1.0.0" 317 | 318 | bundle-require@^5.0.0: 319 | version "5.1.0" 320 | resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-5.1.0.tgz#8db66f41950da3d77af1ef3322f4c3e04009faee" 321 | integrity sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA== 322 | dependencies: 323 | load-tsconfig "^0.2.3" 324 | 325 | cac@^6.7.14: 326 | version "6.7.14" 327 | resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" 328 | integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== 329 | 330 | chokidar@^4.0.1: 331 | version "4.0.3" 332 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" 333 | integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== 334 | dependencies: 335 | readdirp "^4.0.1" 336 | 337 | color-convert@^2.0.1: 338 | version "2.0.1" 339 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 340 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 341 | dependencies: 342 | color-name "~1.1.4" 343 | 344 | color-name@~1.1.4: 345 | version "1.1.4" 346 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 347 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 348 | 349 | commander@^4.0.0: 350 | version "4.1.1" 351 | resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" 352 | integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== 353 | 354 | consola@^3.2.3: 355 | version "3.4.0" 356 | resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.0.tgz#4cfc9348fd85ed16a17940b3032765e31061ab88" 357 | integrity sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA== 358 | 359 | cross-spawn@^7.0.0: 360 | version "7.0.6" 361 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 362 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 363 | dependencies: 364 | path-key "^3.1.0" 365 | shebang-command "^2.0.0" 366 | which "^2.0.1" 367 | 368 | debug@^4.3.7: 369 | version "4.4.0" 370 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" 371 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 372 | dependencies: 373 | ms "^2.1.3" 374 | 375 | eastasianwidth@^0.2.0: 376 | version "0.2.0" 377 | resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" 378 | integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 379 | 380 | emoji-regex@^8.0.0: 381 | version "8.0.0" 382 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 383 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 384 | 385 | emoji-regex@^9.2.2: 386 | version "9.2.2" 387 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 388 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 389 | 390 | esbuild@^0.24.0: 391 | version "0.24.2" 392 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" 393 | integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== 394 | optionalDependencies: 395 | "@esbuild/aix-ppc64" "0.24.2" 396 | "@esbuild/android-arm" "0.24.2" 397 | "@esbuild/android-arm64" "0.24.2" 398 | "@esbuild/android-x64" "0.24.2" 399 | "@esbuild/darwin-arm64" "0.24.2" 400 | "@esbuild/darwin-x64" "0.24.2" 401 | "@esbuild/freebsd-arm64" "0.24.2" 402 | "@esbuild/freebsd-x64" "0.24.2" 403 | "@esbuild/linux-arm" "0.24.2" 404 | "@esbuild/linux-arm64" "0.24.2" 405 | "@esbuild/linux-ia32" "0.24.2" 406 | "@esbuild/linux-loong64" "0.24.2" 407 | "@esbuild/linux-mips64el" "0.24.2" 408 | "@esbuild/linux-ppc64" "0.24.2" 409 | "@esbuild/linux-riscv64" "0.24.2" 410 | "@esbuild/linux-s390x" "0.24.2" 411 | "@esbuild/linux-x64" "0.24.2" 412 | "@esbuild/netbsd-arm64" "0.24.2" 413 | "@esbuild/netbsd-x64" "0.24.2" 414 | "@esbuild/openbsd-arm64" "0.24.2" 415 | "@esbuild/openbsd-x64" "0.24.2" 416 | "@esbuild/sunos-x64" "0.24.2" 417 | "@esbuild/win32-arm64" "0.24.2" 418 | "@esbuild/win32-ia32" "0.24.2" 419 | "@esbuild/win32-x64" "0.24.2" 420 | 421 | fdir@^6.4.2: 422 | version "6.4.3" 423 | resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" 424 | integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== 425 | 426 | foreground-child@^3.1.0: 427 | version "3.3.0" 428 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" 429 | integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== 430 | dependencies: 431 | cross-spawn "^7.0.0" 432 | signal-exit "^4.0.1" 433 | 434 | fsevents@~2.3.2: 435 | version "2.3.3" 436 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 437 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 438 | 439 | glob@^10.3.10: 440 | version "10.4.5" 441 | resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" 442 | integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== 443 | dependencies: 444 | foreground-child "^3.1.0" 445 | jackspeak "^3.1.2" 446 | minimatch "^9.0.4" 447 | minipass "^7.1.2" 448 | package-json-from-dist "^1.0.0" 449 | path-scurry "^1.11.1" 450 | 451 | is-fullwidth-code-point@^3.0.0: 452 | version "3.0.0" 453 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 454 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 455 | 456 | isexe@^2.0.0: 457 | version "2.0.0" 458 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 459 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 460 | 461 | jackspeak@^3.1.2: 462 | version "3.4.3" 463 | resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" 464 | integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== 465 | dependencies: 466 | "@isaacs/cliui" "^8.0.2" 467 | optionalDependencies: 468 | "@pkgjs/parseargs" "^0.11.0" 469 | 470 | joycon@^3.1.1: 471 | version "3.1.1" 472 | resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" 473 | integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== 474 | 475 | lilconfig@^3.1.1: 476 | version "3.1.3" 477 | resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" 478 | integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== 479 | 480 | lines-and-columns@^1.1.6: 481 | version "1.2.4" 482 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" 483 | integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== 484 | 485 | load-tsconfig@^0.2.3: 486 | version "0.2.5" 487 | resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" 488 | integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== 489 | 490 | lodash.sortby@^4.7.0: 491 | version "4.7.0" 492 | resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" 493 | integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== 494 | 495 | lru-cache@^10.2.0: 496 | version "10.4.3" 497 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" 498 | integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== 499 | 500 | minimatch@^9.0.4: 501 | version "9.0.5" 502 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" 503 | integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== 504 | dependencies: 505 | brace-expansion "^2.0.1" 506 | 507 | "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: 508 | version "7.1.2" 509 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" 510 | integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== 511 | 512 | ms@^2.1.3: 513 | version "2.1.3" 514 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 515 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 516 | 517 | mz@^2.7.0: 518 | version "2.7.0" 519 | resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 520 | integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== 521 | dependencies: 522 | any-promise "^1.0.0" 523 | object-assign "^4.0.1" 524 | thenify-all "^1.0.0" 525 | 526 | object-assign@^4.0.1: 527 | version "4.1.1" 528 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 529 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 530 | 531 | package-json-from-dist@^1.0.0: 532 | version "1.0.1" 533 | resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" 534 | integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== 535 | 536 | path-key@^3.1.0: 537 | version "3.1.1" 538 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 539 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 540 | 541 | path-scurry@^1.11.1: 542 | version "1.11.1" 543 | resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" 544 | integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== 545 | dependencies: 546 | lru-cache "^10.2.0" 547 | minipass "^5.0.0 || ^6.0.2 || ^7.0.0" 548 | 549 | picocolors@^1.1.1: 550 | version "1.1.1" 551 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 552 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 553 | 554 | picomatch@^4.0.2: 555 | version "4.0.2" 556 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" 557 | integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== 558 | 559 | pirates@^4.0.1: 560 | version "4.0.6" 561 | resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" 562 | integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== 563 | 564 | postcss-load-config@^6.0.1: 565 | version "6.0.1" 566 | resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz#6fd7dcd8ae89badcf1b2d644489cbabf83aa8096" 567 | integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== 568 | dependencies: 569 | lilconfig "^3.1.1" 570 | 571 | punycode@^2.1.0: 572 | version "2.3.1" 573 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 574 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 575 | 576 | readdirp@^4.0.1: 577 | version "4.1.2" 578 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" 579 | integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== 580 | 581 | resolve-from@^5.0.0: 582 | version "5.0.0" 583 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 584 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 585 | 586 | rollup@^4.24.0: 587 | version "4.34.8" 588 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.34.8.tgz#e859c1a51d899aba9bcf451d4eed1d11fb8e2a6e" 589 | integrity sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ== 590 | dependencies: 591 | "@types/estree" "1.0.6" 592 | optionalDependencies: 593 | "@rollup/rollup-android-arm-eabi" "4.34.8" 594 | "@rollup/rollup-android-arm64" "4.34.8" 595 | "@rollup/rollup-darwin-arm64" "4.34.8" 596 | "@rollup/rollup-darwin-x64" "4.34.8" 597 | "@rollup/rollup-freebsd-arm64" "4.34.8" 598 | "@rollup/rollup-freebsd-x64" "4.34.8" 599 | "@rollup/rollup-linux-arm-gnueabihf" "4.34.8" 600 | "@rollup/rollup-linux-arm-musleabihf" "4.34.8" 601 | "@rollup/rollup-linux-arm64-gnu" "4.34.8" 602 | "@rollup/rollup-linux-arm64-musl" "4.34.8" 603 | "@rollup/rollup-linux-loongarch64-gnu" "4.34.8" 604 | "@rollup/rollup-linux-powerpc64le-gnu" "4.34.8" 605 | "@rollup/rollup-linux-riscv64-gnu" "4.34.8" 606 | "@rollup/rollup-linux-s390x-gnu" "4.34.8" 607 | "@rollup/rollup-linux-x64-gnu" "4.34.8" 608 | "@rollup/rollup-linux-x64-musl" "4.34.8" 609 | "@rollup/rollup-win32-arm64-msvc" "4.34.8" 610 | "@rollup/rollup-win32-ia32-msvc" "4.34.8" 611 | "@rollup/rollup-win32-x64-msvc" "4.34.8" 612 | fsevents "~2.3.2" 613 | 614 | shebang-command@^2.0.0: 615 | version "2.0.0" 616 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 617 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 618 | dependencies: 619 | shebang-regex "^3.0.0" 620 | 621 | shebang-regex@^3.0.0: 622 | version "3.0.0" 623 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 624 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 625 | 626 | signal-exit@^4.0.1: 627 | version "4.1.0" 628 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" 629 | integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== 630 | 631 | source-map@0.8.0-beta.0: 632 | version "0.8.0-beta.0" 633 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" 634 | integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== 635 | dependencies: 636 | whatwg-url "^7.0.0" 637 | 638 | "string-width-cjs@npm:string-width@^4.2.0": 639 | version "4.2.3" 640 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 641 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 642 | dependencies: 643 | emoji-regex "^8.0.0" 644 | is-fullwidth-code-point "^3.0.0" 645 | strip-ansi "^6.0.1" 646 | 647 | string-width@^4.1.0: 648 | version "4.2.3" 649 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 650 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 651 | dependencies: 652 | emoji-regex "^8.0.0" 653 | is-fullwidth-code-point "^3.0.0" 654 | strip-ansi "^6.0.1" 655 | 656 | string-width@^5.0.1, string-width@^5.1.2: 657 | version "5.1.2" 658 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" 659 | integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== 660 | dependencies: 661 | eastasianwidth "^0.2.0" 662 | emoji-regex "^9.2.2" 663 | strip-ansi "^7.0.1" 664 | 665 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1": 666 | version "6.0.1" 667 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 668 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 669 | dependencies: 670 | ansi-regex "^5.0.1" 671 | 672 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 673 | version "6.0.1" 674 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 675 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 676 | dependencies: 677 | ansi-regex "^5.0.1" 678 | 679 | strip-ansi@^7.0.1: 680 | version "7.1.0" 681 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" 682 | integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== 683 | dependencies: 684 | ansi-regex "^6.0.1" 685 | 686 | sucrase@^3.35.0: 687 | version "3.35.0" 688 | resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" 689 | integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== 690 | dependencies: 691 | "@jridgewell/gen-mapping" "^0.3.2" 692 | commander "^4.0.0" 693 | glob "^10.3.10" 694 | lines-and-columns "^1.1.6" 695 | mz "^2.7.0" 696 | pirates "^4.0.1" 697 | ts-interface-checker "^0.1.9" 698 | 699 | thenify-all@^1.0.0: 700 | version "1.6.0" 701 | resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 702 | integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== 703 | dependencies: 704 | thenify ">= 3.1.0 < 4" 705 | 706 | "thenify@>= 3.1.0 < 4": 707 | version "3.3.1" 708 | resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" 709 | integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== 710 | dependencies: 711 | any-promise "^1.0.0" 712 | 713 | tinyexec@^0.3.1: 714 | version "0.3.2" 715 | resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" 716 | integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== 717 | 718 | tinyglobby@^0.2.9: 719 | version "0.2.10" 720 | resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" 721 | integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== 722 | dependencies: 723 | fdir "^6.4.2" 724 | picomatch "^4.0.2" 725 | 726 | tr46@^1.0.1: 727 | version "1.0.1" 728 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" 729 | integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== 730 | dependencies: 731 | punycode "^2.1.0" 732 | 733 | tree-kill@^1.2.2: 734 | version "1.2.2" 735 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 736 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 737 | 738 | ts-interface-checker@^0.1.9: 739 | version "0.1.13" 740 | resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" 741 | integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== 742 | 743 | tsup@^8.3.6: 744 | version "8.3.6" 745 | resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.3.6.tgz#a10eb2dc27f84b510a0f00341ab75cad03d13a88" 746 | integrity sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g== 747 | dependencies: 748 | bundle-require "^5.0.0" 749 | cac "^6.7.14" 750 | chokidar "^4.0.1" 751 | consola "^3.2.3" 752 | debug "^4.3.7" 753 | esbuild "^0.24.0" 754 | joycon "^3.1.1" 755 | picocolors "^1.1.1" 756 | postcss-load-config "^6.0.1" 757 | resolve-from "^5.0.0" 758 | rollup "^4.24.0" 759 | source-map "0.8.0-beta.0" 760 | sucrase "^3.35.0" 761 | tinyexec "^0.3.1" 762 | tinyglobby "^0.2.9" 763 | tree-kill "^1.2.2" 764 | 765 | typescript@^5.7.3: 766 | version "5.7.3" 767 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" 768 | integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== 769 | 770 | webidl-conversions@^4.0.2: 771 | version "4.0.2" 772 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" 773 | integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== 774 | 775 | whatwg-url@^7.0.0: 776 | version "7.1.0" 777 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" 778 | integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== 779 | dependencies: 780 | lodash.sortby "^4.7.0" 781 | tr46 "^1.0.1" 782 | webidl-conversions "^4.0.2" 783 | 784 | which@^2.0.1: 785 | version "2.0.2" 786 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 787 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 788 | dependencies: 789 | isexe "^2.0.0" 790 | 791 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 792 | version "7.0.0" 793 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 794 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 795 | dependencies: 796 | ansi-styles "^4.0.0" 797 | string-width "^4.1.0" 798 | strip-ansi "^6.0.0" 799 | 800 | wrap-ansi@^8.1.0: 801 | version "8.1.0" 802 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 803 | integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== 804 | dependencies: 805 | ansi-styles "^6.1.0" 806 | string-width "^5.0.1" 807 | strip-ansi "^7.0.1" 808 | --------------------------------------------------------------------------------