├── 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 |
2 |
3 |
Vue Demo!
4 |
5 |
6 |
7 |
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 |

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 | 
25 | ### Vue 3:
26 | ```js
27 | // 示例代码
28 |
29 |
30 |
Vue Demo!
31 |
32 |
33 |
34 |
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 |

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 |
--------------------------------------------------------------------------------