From 338c5a9be49f058f727b7b47023a4243e465b29a Mon Sep 17 00:00:00 2001 From: zhouliujun <1096432931@qq.com> Date: Mon, 29 Apr 2024 17:49:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=85=A8=E6=96=B0=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=9A=84vue3=E7=89=88=E6=9C=AC=E7=9A=84=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 15 + .gitignore | 30 + .prettierrc.json | 8 + .vscode/extensions.json | 7 + README.md | 432 +- env.d.ts | 1 + examples/App.vue | 190 + examples/main.ts | 4 + gh-page.sh | 23 + global.d.ts | 6 + images/s1.png | Bin 0 -> 63957 bytes images/s2.png | Bin 0 -> 35921 bytes images/s3.png | Bin 0 -> 30268 bytes index.html | 13 + lib/SignCanvas/SignCanvas.vue.d.ts | 2 + lib/SignCanvas/hooks/useSignCanvas.d.ts | 4 + lib/favicon.ico | Bin 0 -> 4286 bytes lib/index.d.ts | 5 + lib/sign-canvas-plus.es.js | 295 ++ lib/sign-canvas-plus.umd.js | 1 + main.ts | 0 package-lock.json | 4510 ++++++++++++++++++++ package.json | 48 + packages/SignCanvas/SignCanvas.vue | 77 + packages/SignCanvas/hooks/useSignCanvas.ts | 480 +++ packages/index.ts | 22 + packages/types.ts | 37 + public/favicon.ico | Bin 0 -> 4286 bytes t.sh | 43 + tsconfig.app.json | 14 + tsconfig.json | 11 + tsconfig.node.json | 19 + vite.config.ts | 40 + 33 files changed, 6336 insertions(+), 1 deletion(-) create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 .prettierrc.json create mode 100644 .vscode/extensions.json create mode 100644 env.d.ts create mode 100644 examples/App.vue create mode 100644 examples/main.ts create mode 100644 gh-page.sh create mode 100644 global.d.ts create mode 100644 images/s1.png create mode 100644 images/s2.png create mode 100644 images/s3.png create mode 100644 index.html create mode 100644 lib/SignCanvas/SignCanvas.vue.d.ts create mode 100644 lib/SignCanvas/hooks/useSignCanvas.d.ts create mode 100644 lib/favicon.ico create mode 100644 lib/index.d.ts create mode 100644 lib/sign-canvas-plus.es.js create mode 100644 lib/sign-canvas-plus.umd.js create mode 100644 main.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 packages/SignCanvas/SignCanvas.vue create mode 100644 packages/SignCanvas/hooks/useSignCanvas.ts create mode 100644 packages/index.ts create mode 100644 packages/types.ts create mode 100644 public/favicon.ico create mode 100644 t.sh create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..6f40582 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,15 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution') + +module.exports = { + root: true, + 'extends': [ + 'plugin:vue/vue3-essential', + 'eslint:recommended', + '@vue/eslint-config-typescript', + '@vue/eslint-config-prettier/skip-formatting' + ], + parserOptions: { + ecmaVersion: 'latest' + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ee54e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..66e2335 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": false, + "tabWidth": 2, + "singleQuote": true, + "printWidth": 100, + "trailingComma": "none" +} \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..93ea3e7 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "Vue.volar", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode" + ] +} diff --git a/README.md b/README.md index aa1cded..54c2c96 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,432 @@ +# sign-canvas-plus 一个基于 canvas 开发,封装于 Vue3 组件的通用手写签名板(电子签名板),支持 pc 端和移动端 + +#### sign-canvas-plus 是 sign-canvas的vue3版本,使用了vue3+ts+vite 进行了重构,vue3中使用此包. 假如此轮子对你有帮助,请顺手 star 一下吧.o(_ ̄︶ ̄_)o + +### 如果需要 vue2 版本的 签名板 请移步至 + +#### 更多文章和技术推文,请关注微信公众号"笔优站长",有问题也可以及时反馈哦 + +## 开始使用! 下载安装 npm 包 + +```bash +npm i sign-canvas-plus --save +``` + +```javascript +//全局注册 main.js +import SignCanvasPlus from 'sign-canvas-plus' + +// vue的main.ts里使用, +import App from './App.vue' +createApp(App).use(SignCanvasPlus).mount('#app') + +//局部注册 + + +``` + +你可以这样使用: + +### 组件模板使用 + +```html + + + +``` + +### 功能与配置 + +```javascript +props:{ + options: { //配置项 + required: false, + type: [Object], + default: () => null + } +} + +// 1. options [Object] 可选,非必传 + +// 2. v-model [String] 可选,非必传 + +``` + +1. 配置项 IOptions 属性 , ts 中有 IOptions 的接口约束,可以直接导入类型提示, 以下参数的默认值, 使用的时候自行选装即可 + +```javascript +{ + isFullScreen: false, ////是否全屏手写 [Boolean] 可选 + isFullCover: false, //是否全屏模式下覆盖所有的元素 [Boolean] 可选 + isDpr: false, //是否使用dpr兼容高分屏 [Boolean] 可选 + lastWriteSpeed: 1, //书写速度 [Number] 可选 + lastWriteWidth: 2, //下笔的宽度 [Number] 可选 + lineCap: 'round', //线条的边缘类型 [butt]平直的边缘 [round]圆形线帽 [square] 正方形线帽 + lineJoin: 'bevel', //线条交汇时边角的类型 [bevel]创建斜角 [round]创建圆角 [miter]创建尖角。 + canvasWidth: 350, //canvas宽高 [Number] 可选 + canvasHeight: 370, //高度 [Number] 可选 + isShowBorder: true, //是否显示边框 [可选] + bgColor: '#fcc', //背景色 [String] 可选 + borderWidth: 1, // 网格线宽度 [Number] 可选 + borderColor: '#ff787f', //网格颜色 [String] 可选 + writeWidth: 5, //基础轨迹宽度 [Number] 可选 + maxWriteWidth: 30, // 写字模式最大线宽 [Number] 可选 + minWriteWidth: 5, // 写字模式最小线宽 [Number] 可选 + writeColor: '#101010', // 轨迹颜色 [String] 可选 + isSign: true, //签名模式 [Boolean] 默认为非签名模式,有线框, 当设置为true的时候没有任何线框 + imgType: 'png', //下载的图片格式 [String] 可选为 jpeg canvas本是透明背景的. + quality: 1 // 图片压缩系数[0-1]之间 可以选 默认为1 +} +``` + +2. 内置方法 + +```javascript +//清除画布 无返回值 [Void] +this.$refs.SignCanvas.canvasClear() + +//获取base图片 返回图片的base64编码 [String] +this.$refs.SignCanvas.saveAsImg() + +//下载图片到本地, 调用内置的下载图片方法,默认将图片保存为png格式(经测试在部分微信内置浏览器中无效) +this.$refs.SignCanvas.downloadSignImg() + +// 获取压缩图片,此方法返回压缩后的base64图片 +this.$refs.SignCanvas.dealImage() +``` + +## [在线演示](https://langyuxiansheng.github.io/sign-canvas-plus/) + +### 图片展示 + +--- + +初始化展示 +![初始化展示](https://github.com/langyuxiansheng/sign-canvas-plus/blob/master/images/s1.png) + +非签名模式书写展示 +![非签名模式书写展示](https://github.com/langyuxiansheng/sign-canvas-plus/blob/master/images/s2.png) + +保存展示 +![保存展示](https://github.com/langyuxiansheng/sign-canvas-plus/blob/master/images/s3.png) + +--- + +## 更多功能正在完善中 + +## 如果您有什么好的建议请留言 + +## 二次开发 下载项目 + +```bash +git clone https://github.com/langyuxiansheng/sign-canvas-plus.git +``` + # sign-canvas-plus -一个基于canvas开发,封装于Vue3组件的通用手写签名板(电子签名板),支持pc端和移动端,属性支持自定义配置, 使用vue3和ts进行重写,vue2的请移步sign-canvas + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Type Support for `.vue` Imports in TS + +TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types. + +## Customize configuration + +See [Vite Configuration Reference](https://vitejs.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Type-Check, Compile and Minify for Production + +```sh +npm run build +``` + +### Lint with [ESLint](https://eslint.org/) + +```sh +npm run lint +``` + +## 缺陷 & 后期计划 + +> 目前还没有撤销回到上一步的操作,一旦输入错了就只有清除重写了(这个是之前去银行的时候,那个签名板是这样设计的); +> 如果有需要还是可以考虑加上回到上一步的方法. + +## 更新日志 + +> v2.0.0 使用了vue3 + vite进行重写了,支持类型提示和vue3的setup直接使用了.增加了压缩图导出.修复bug等 + +> v1.1.4 功能更新:增加全屏手写方案,可以通过 options.isFullScreen,和 options.isFullCover 属性控制,全屏模式下 canvasWidth 和 canvasHeight 属性设置无效,感谢网友 AFelicity”的建议与反馈。 + +> v1.1.3 功能更新:增加高倍屏下,绘制会模糊的适配方案,可以通过 options.isDpr 属性进行开启或者关闭,感谢网友“Wong-Harry”的建议与反馈。 + +> v1.1.2 优化部分逻辑代码. + +> v1.1.1 修复 background 拼写错误,感谢网友"shady-xia"的反馈和建议. + +> v1.1.0 本次更新调整较大,内容如下: + +- 调整局部组件注册的逻辑,全局使用的不收影响,如果有局部注册的朋友请调整一下. +- 调整 demo 样式,增加动态配置项,属性支持动态响应了; +- 修复滚动距离导致画点偏移的 bug,优化核心代码,感谢网友“Jayj1997”的建议和反馈。 + +> v1.0.7 修复定位下的轨迹偏移,受 position 属性的影响的 bug。感谢网友“gexiaoyun” 和 “xingguyue”的反馈。 + +> v1.0.6 修复多个 canvas 无法同时存在的 bug,修复移动端滚动后影响绘制轨迹的 bug。感谢网友“hytao2017”的反馈。 + +> v1.0.5 优化部分代码。 + +> v1.0.4 修复增加局部注册引入方式。 + +> v1.0.3 修复“在移动端时,如果标签距离左侧有间距, 画笔和绘制的内容有偏移 #4”的 bug,感谢网友“xiaohuyahappy ”和“tzy19920902”的 bug 反馈见及修复建议。 + +> v1.0.2 兼容移动端的可用性 + +> v1.0.1 修复无法清空的 bug + +> v1.0.0 注册发布到 npmjs + +### Customize configuration + +See [Configuration Reference](https://cli.vuejs.org/config/). + +## 横屏全屏模式下签名要怎么显示? + +### 显示的时候需要将图片进行旋转一下就可以了 + +```html +
+ +
+ + + +``` diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/App.vue b/examples/App.vue new file mode 100644 index 0000000..d216c32 --- /dev/null +++ b/examples/App.vue @@ -0,0 +1,190 @@ + + + diff --git a/examples/main.ts b/examples/main.ts new file mode 100644 index 0000000..80c2a04 --- /dev/null +++ b/examples/main.ts @@ -0,0 +1,4 @@ +import { createApp } from 'vue'; +import App from './App.vue'; +const app = createApp(App); +app.mount('#app'); diff --git a/gh-page.sh b/gh-page.sh new file mode 100644 index 0000000..37a84b7 --- /dev/null +++ b/gh-page.sh @@ -0,0 +1,23 @@ +echo "打包 => dist"; + +npm run build; + +echo "更新gh-pages"; + +git branch -D gh-pages; + +echo "删除gh-pages"; + +git checkout -b gh-pages; + +echo "创建并切换到gh-pages"; + +git add -f dist; + +git commit -m 'create gh-pages'; + +git push origin -d gh-pages; + +git subtree push --prefix dist origin gh-pages; + +echo "已推送gh-pages"; \ No newline at end of file diff --git a/global.d.ts b/global.d.ts new file mode 100644 index 0000000..b2be363 --- /dev/null +++ b/global.d.ts @@ -0,0 +1,6 @@ +declare interface Window { + Vue: any + webkitDevicePixelRatio: number + mozDevicePixelRatio: number + msDevicePixelRatio: number +} \ No newline at end of file diff --git a/images/s1.png b/images/s1.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc4506880429114da2f03abe52df362810a7615 GIT binary patch literal 63957 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

7QxLoE`>aHZ$^&dyH_YM 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 YSm}eTBth)|m&vmKyfyzn*uSR#13dh-PXGV_ literal 0 HcmV?d00001 diff --git a/images/s2.png b/images/s2.png new file mode 100644 index 0000000000000000000000000000000000000000..418d96976b7762dd182b317d2fde1165ba9e4ad7 GIT binary patch literal 35921 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 L|Md@aKW6?P^he9K literal 0 HcmV?d00001 diff --git a/images/s3.png b/images/s3.png new file mode 100644 index 0000000000000000000000000000000000000000..7d3622daf4a269c4d91c52b65389645894b8cc50 GIT binary patch literal 30268 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 bhipMtX;1ww9by9XCYZte!X5Rk`2ytjN literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..e8f8971 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vue3 SignCanvas Demo + + +

+ + + \ No newline at end of file diff --git a/lib/SignCanvas/SignCanvas.vue.d.ts b/lib/SignCanvas/SignCanvas.vue.d.ts new file mode 100644 index 0000000..5298df7 --- /dev/null +++ b/lib/SignCanvas/SignCanvas.vue.d.ts @@ -0,0 +1,2 @@ +declare const _default: any; +export default _default; diff --git a/lib/SignCanvas/hooks/useSignCanvas.d.ts b/lib/SignCanvas/hooks/useSignCanvas.d.ts new file mode 100644 index 0000000..b2340ba --- /dev/null +++ b/lib/SignCanvas/hooks/useSignCanvas.d.ts @@ -0,0 +1,4 @@ +/** + * useSignCanvas + */ +export declare const useSignCanvas: () => any; diff --git a/lib/favicon.ico b/lib/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/lib/index.d.ts b/lib/index.d.ts new file mode 100644 index 0000000..bd28be8 --- /dev/null +++ b/lib/index.d.ts @@ -0,0 +1,5 @@ +import { IOptions, IPoint, SDirection, SImgType } from './types'; +import { default as SignCanvas } from './SignCanvas/SignCanvas.vue'; + +export default SignCanvas; +export type { IOptions, SImgType, SDirection, IPoint }; diff --git a/lib/sign-canvas-plus.es.js b/lib/sign-canvas-plus.es.js new file mode 100644 index 0000000..1963ef6 --- /dev/null +++ b/lib/sign-canvas-plus.es.js @@ -0,0 +1,295 @@ +import { getCurrentInstance as Y, reactive as q, onMounted as J, onBeforeUnmount as N, watch as A, toRefs as Q, defineComponent as j, mergeModels as B, useModel as G, openBlock as K, createElementBlock as O, withModifiers as u, unref as r } from "vue"; +const P = (c) => ({ x: c.offsetX || c.clientX, y: c.offsetY || c.clientY }), Z = () => { + const { emit: c, props: x } = Y(), i = q({ + // domId: `sign-canvas-${Math.random().toString(36).substring(2)}`, + canvasElement: null, + context: null, + dpr: 0, + config: { + isFullScreen: !1, + // 是否全屏手写 [Boolean] 可选 + isFullCover: !1, + // 是否全屏模式下覆盖所有的元素 [Boolean] 可选 + isDpr: !1, + // 是否使用dpr兼容高分屏 [Boolean] 可选 + lastWriteSpeed: 1, + // 书写速度 [Number] 可选 + lastWriteWidth: 2, + // 下笔的宽度 [Number] 可选 + lineCap: "round", + // 线条的边缘类型 [butt]平直的边缘 [round]圆形线帽 [square] 正方形线帽 + lineJoin: "round", + // 线条交汇时边角的类型 [bevel]创建斜角 [round]创建圆角 [miter]创建尖角。 + canvasWidth: 600, + // canvas宽高 [Number] 可选 + canvasHeight: 600, + // 高度 [Number] 可选 + isShowBorder: !0, + // 是否显示边框 [可选] + bgColor: "#fcc", + // 背景色 [String] 可选 注:这背景色仅仅只是canvas背景,保存的图片仍然是透明的 + borderWidth: 1, + // 网格线宽度 [Number] 可选 + borderColor: "#ff787f", + // 网格颜色 [String] 可选 + writeWidth: 5, + // 基础轨迹宽度 [Number] 可选 + maxWriteWidth: 30, + // 写字模式最大线宽 [Number] 可选 + minWriteWidth: 5, + // 写字模式最小线宽 [Number] 可选 + writeColor: "#101010", + // 轨迹颜色 [String] 可选 + isSign: !1, + // 签名模式 [Boolean] 默认为非签名模式,有线框, 当设置为true的时候没有任何线框 + imgType: "png", + //下载的图片格式 [String] 可选为 jpeg canvas本是透明背景的 + quality: 1, + //压缩比例 [Number] 可选 + lastWriteTime: 0, + isWrite: !1, + lastPoint: { + x: 0, + y: 0 + } + }, + resizeTimer: null, + canvasImage: null + }), g = () => { + console.log(i.canvasElement); + const e = x.options; + if (e) + for (const o in e) + e[o] != null && e[o] != null && (i.config[o] = e[o]); + i.dpr = typeof window < "u" && i.config.isDpr && (window.devicePixelRatio || window.webkitDevicePixelRatio || window.mozDevicePixelRatio) || 1; + const { canvasElement: t, config: n } = i; + t && (i.context = t.getContext("2d"), n.isFullScreen && (n.canvasWidth = window.innerWidth || document.body.clientWidth, n.canvasHeight = window.innerHeight || document.body.clientHeight, n.isFullCover && (t.style.position = "fixed", t.style.top = "0", t.style.left = "0", t.style.margin = "0", t.style.zIndex = "20001")), n.canvasWidth && (t.width = n.canvasWidth), n.canvasHeight && (t.height = n.canvasHeight), I(), S()); + }, y = () => { + const { config: e } = i, t = (/* @__PURE__ */ new Date()).getTime(), n = t - e.lastWriteTime; + if (e.lastWriteTime = t, e.minWriteWidth != null && e.maxWriteWidth != null && i.context) { + let o = e.minWriteWidth + (e.maxWriteWidth - e.minWriteWidth) * n / 30; + if (o < e.minWriteWidth ? o = e.minWriteWidth : o > e.maxWriteWidth && (o = e.maxWriteWidth), o = +o.toFixed(2), e.isSign) + i.context.lineWidth = (e.writeWidth ?? 0) * i.dpr; + else { + const a = e.lastWriteWidth = (e.lastWriteWidth ?? 0) / 4 * 3 + o / 4; + i.context.lineWidth = a * i.dpr; + } + } + }, p = (e) => { + i.config.isWrite = !0, i.config.lastWriteTime = (/* @__PURE__ */ new Date()).getTime(), console.log(e), i.config.lastPoint = e, C(); + }, W = (e) => { + const { context: t, config: n, dpr: o } = i; + t && (t.beginPath(), t.moveTo(n.lastPoint.x * o, n.lastPoint.y * o), t.lineTo(e.x * o, e.y * o), y(), t.stroke(), n.lastPoint = e, t.closePath()); + }, T = (e) => { + const { config: t } = i; + t.isWrite = !1, t.lastPoint = e, k(); + }, C = () => { + const { context: e, config: { writeColor: t, lineCap: n, lineJoin: o } } = i; + e && (e.beginPath(), t && (e.strokeStyle = t), n && (e.lineCap = n), o && (e.lineJoin = o)); + }, S = () => { + const { context: e, canvasElement: t, config: { writeColor: n, bgColor: o, borderWidth: a, borderColor: h, isShowBorder: m, isSign: d }, dpr: v } = i; + if (e && t) { + if (e.save(), n && (e.strokeStyle = n), e.clearRect(0, 0, t.width, t.height), o && o !== "none" && (e.fillStyle = o, e.fillRect(0, 0, t.width, t.height)), e.beginPath(), h && (e.strokeStyle = h), a != null && a != null) { + e.lineWidth = a * v; + const f = a / 2 * v; + m && (e.moveTo(f, f), e.lineTo(t.width - f, f), e.lineTo(t.width - f, t.height - f), e.lineTo(f, t.height - f), e.closePath(), e.stroke(), m && !d && (e.moveTo(0, 0), e.lineTo(t.width, t.height), e.lineTo(t.width, t.height / 2), e.lineTo(0, t.height / 2), e.lineTo(0, t.height), e.lineTo(t.width, 0), e.lineTo(t.width / 2, 0), e.lineTo(t.width / 2, t.height), e.stroke())); + } + e.restore(), M(null); + } + }, M = (e) => { + c("update:modelValue", e), c("change", e), console.log(e); + }, I = () => { + const { canvasElement: e, config: { canvasWidth: t, canvasHeight: n }, dpr: o } = i; + e && (t != null && t != null && (e.width = t * o, e.style.width = `${t}px`), n != null && n != null && (e.height = n * o, e.style.height = `${n}px`)); + }, b = (e) => p(P(e)), D = (e) => { + i.config.isWrite && W(P(e)); + }, l = (e) => { + T(P(e)); + }, s = (e) => { + i.config.isWrite = !1, i.config.lastPoint = P(e); + }, F = () => { + const { canvasElement: e } = i; + if (e) + return e.getBoundingClientRect(); + }, z = (e, t) => { + const n = "offset" + t[0].toUpperCase() + t.substring(1); + if (e) { + let o = e[n], a = e.offsetParent; + for (; a != null; ) + o += a[n], a = a.offsetParent; + return o; + } + return 0; + }, E = (e) => { + const t = F(); + if (t) { + const n = e.clientX ? e.clientX - t.left : e.pageX - z(e.target, "left"), o = e.clientY ? e.clientY - t.top : e.pageY - z(e.target, "top"); + return { x: n, y: o }; + } + return { x: 0, y: 0 }; + }, $ = (e) => { + const t = e.targetTouches[0]; + p(E(t)); + }, L = (e) => { + const t = e.targetTouches[0]; + i.config.isWrite && W(E(t)); + }, U = (e) => { + const t = e.targetTouches, n = e.changedTouches, o = t && t.length > 0 && t[0] || n && n.length > 0 && n[0]; + o && T(E(o)); + }, k = () => { + i.canvasImage = new Image(); + const { canvasElement: e, config: { imgType: t, quality: n } } = i; + return e && t && (i.canvasImage.src = e.toDataURL(`image/${t}`), M(i.canvasImage.src)), n !== 1 ? H() : i.canvasImage.src; + }, V = (e) => { + const t = k(); + X(t, e ? `${e}.${i.config.imgType}` : `${+/* @__PURE__ */ new Date()}.${i.config.imgType}`); + }, X = (e, t) => { + const n = document.createElementNS("http://www.w3.org/1999/xhtml", "a"); + n.href = e, n.download = t; + const o = document.createEvent("MouseEvents"); + o.initMouseEvent("click", !0, !1, window, 0, 0, 0, 0, 0, !1, !1, !1, !1, 0, null), n.dispatchEvent(o); + }, H = (e) => { + const { config: { canvasWidth: t, canvasHeight: n, quality: o }, canvasImage: a } = i, h = e || o || 1, m = h < 0.1 || h > 1 ? 0.6 : h, d = document.createElement("canvas"), v = d.getContext("2d"); + return t != null && t != null && (d.width = Math.floor(t * m)), n != null && n != null && (d.height = Math.floor(n * m)), v && a && (v.clearRect(0, 0, d.width, d.height), v.drawImage(a, 0, 0, d.width, d.height)), d.toDataURL("image/png", m); + }; + return J(() => { + g(), window.onresize = () => { + i.resizeTimer && clearTimeout(i.resizeTimer), i.resizeTimer = setTimeout(() => g(), 100); + }; + }), N(() => { + window.onresize = null, clearTimeout(i.resizeTimer); + }), A(() => x.options, () => g(), { deep: !0 }), { + ...Q(i), + canvasClear: S, + onMousedown: b, + onMousemove: D, + onMouseup: l, + onMouseleave: s, + onTouchstart: $, + onTouchmove: L, + onTouchend: U, + saveAsImg: k, + dealImage: H, + downloadSignImg: V + }; +}, w = /* @__PURE__ */ j({ + name: "SignCanvas", + __name: "SignCanvas", + props: /* @__PURE__ */ B({ + modelValue: { default: null }, + options: { default: () => ({ + isFullScreen: !1, + // 是否全屏手写 + isFullCover: !1, + // 是否全屏模式下覆盖所有的元素 + isDpr: !1, + // 是否使用dpr兼容高分屏 + lastWriteSpeed: 1, + // 笔迹速度 + lastWriteWidth: 2, + // 笔迹宽度 + lineCap: "round", + // 笔迹端点样式 + lineJoin: "round", + // 笔迹连接样式 + canvasWidth: 600, + // canvas宽度 + canvasHeight: 600, + // canvas高度 + isShowBorder: !0, + // 是否显示边框 [可选] + bgColor: "#fcc", + // 背景色 [String] 可选 注:这背景色仅仅只是canvas背景,保存的图片仍然是透明的 + borderWidth: 1, + // 网格线宽度 [Number] 可选 + borderColor: "#ff787f", + // 网格颜色 [String] 可选 + writeWidth: 5, + // 基础轨迹宽度 [Number] 可选 + maxWriteWidth: 30, + // 写字模式最大线宽 [Number] 可选 + minWriteWidth: 5, + // 写字模式最小线宽 [Number] 可选 + writeColor: "#101010", + // 轨迹颜色 [String] 可选 + isSign: !1, + // 签名模式 [Boolean] 默认为非签名模式,有线框, 当设置为true的时候没有任何线框 + imgType: "png", + //下载的图片格式 [String] 可选为 jpeg canvas本是透明背景的 + quality: 1 + // 图片压缩系数[0-1]之间 可以选 默认为1 + }) } + }, { + value: {}, + valueModifiers: {} + }), + emits: /* @__PURE__ */ B(["update:modelValue", "change"], ["update:value"]), + setup(c, { expose: x }) { + G(c, "value"); + const { + canvasElement: R, + onMousedown: i, + onMousemove: g, + onMouseup: y, + onMouseleave: p, + onTouchstart: W, + onTouchmove: T, + onTouchend: C, + canvasClear: S, + saveAsImg: M, + downloadSignImg: I, + dealImage: b + } = Z(); + return x({ + canvasClear: S, + saveAsImg: M, + downloadSignImg: I, + dealImage: b + }), (D, l) => (K(), O("canvas", { + ref: (s) => R.value = s, + class: "app-sign-canvas", + onMousedown: l[0] || (l[0] = u( + //@ts-ignore + (...s) => r(i) && r(i)(...s), + ["prevent", "stop"] + )), + onMousemove: l[1] || (l[1] = u( + //@ts-ignore + (...s) => r(g) && r(g)(...s), + ["prevent", "stop"] + )), + onMouseup: l[2] || (l[2] = u( + //@ts-ignore + (...s) => r(y) && r(y)(...s), + ["prevent", "stop"] + )), + onMouseleave: l[3] || (l[3] = u( + //@ts-ignore + (...s) => r(p) && r(p)(...s), + ["prevent", "stop"] + )), + onTouchstart: l[4] || (l[4] = u( + //@ts-ignore + (...s) => r(W) && r(W)(...s), + ["prevent", "stop"] + )), + onTouchmove: l[5] || (l[5] = u( + //@ts-ignore + (...s) => r(T) && r(T)(...s), + ["prevent", "stop"] + )), + onTouchend: l[6] || (l[6] = u( + //@ts-ignore + (...s) => r(C) && r(C)(...s), + ["prevent", "stop"] + )) + }, " 您的浏览器不支持canvas技术,请升级浏览器! ", 544)); + } +}); +w.install = function(c) { + return c.component((w == null ? void 0 : w.name) ?? "SignCanvas", w), c; +}; +typeof window < "u" && window.Vue && w.install(window.Vue); +export { + w as default +}; diff --git a/lib/sign-canvas-plus.umd.js b/lib/sign-canvas-plus.umd.js new file mode 100644 index 0000000..f2c6c88 --- /dev/null +++ b/lib/sign-canvas-plus.umd.js @@ -0,0 +1 @@ +(function(s,h){typeof exports=="object"&&typeof module<"u"?module.exports=h(require("vue")):typeof define=="function"&&define.amd?define(["vue"],h):(s=typeof globalThis<"u"?globalThis:s||self,s["sign-canvas-plus"]=h(s.Vue))})(this,function(s){"use strict";const h=c=>({x:c.offsetX||c.clientX,y:c.offsetY||c.clientY}),H=()=>{const{emit:c,props:x}=s.getCurrentInstance(),P=()=>({canvasElement:null,context:null,dpr:0,config:{isFullScreen:!1,isFullCover:!1,isDpr:!1,lastWriteSpeed:1,lastWriteWidth:2,lineCap:"round",lineJoin:"round",canvasWidth:600,canvasHeight:600,isShowBorder:!0,bgColor:"#fcc",borderWidth:1,borderColor:"#ff787f",writeWidth:5,maxWriteWidth:30,minWriteWidth:5,writeColor:"#101010",isSign:!1,imgType:"png",quality:1,lastWriteTime:0,isWrite:!1,lastPoint:{x:0,y:0}},resizeTimer:null,canvasImage:null}),n=s.reactive(P()),u=()=>{console.log(n.canvasElement);const e=x.options;if(e)for(const o in e)e[o]!=null&&e[o]!=null&&(n.config[o]=e[o]);n.dpr=typeof window<"u"&&n.config.isDpr&&(window.devicePixelRatio||window.webkitDevicePixelRatio||window.mozDevicePixelRatio)||1;const{canvasElement:t,config:i}=n;t&&(n.context=t.getContext("2d"),i.isFullScreen&&(i.canvasWidth=window.innerWidth||document.body.clientWidth,i.canvasHeight=window.innerHeight||document.body.clientHeight,i.isFullCover&&(t.style.position="fixed",t.style.top="0",t.style.left="0",t.style.margin="0",t.style.zIndex="20001")),i.canvasWidth&&(t.width=i.canvasWidth),i.canvasHeight&&(t.height=i.canvasHeight),I(),M())},y=()=>{const{config:e}=n,t=new Date().getTime(),i=t-e.lastWriteTime;if(e.lastWriteTime=t,e.minWriteWidth!=null&&e.maxWriteWidth!=null&&n.context){let o=e.minWriteWidth+(e.maxWriteWidth-e.minWriteWidth)*i/30;if(oe.maxWriteWidth&&(o=e.maxWriteWidth),o=+o.toFixed(2),e.isSign)n.context.lineWidth=(e.writeWidth??0)*n.dpr;else{const a=e.lastWriteWidth=(e.lastWriteWidth??0)/4*3+o/4;n.context.lineWidth=a*n.dpr}}},W=e=>{n.config.isWrite=!0,n.config.lastWriteTime=new Date().getTime(),console.log(e),n.config.lastPoint=e,C()},v=e=>{const{context:t,config:i,dpr:o}=n;t&&(t.beginPath(),t.moveTo(i.lastPoint.x*o,i.lastPoint.y*o),t.lineTo(e.x*o,e.y*o),y(),t.stroke(),i.lastPoint=e,t.closePath())},T=e=>{const{config:t}=n;t.isWrite=!1,t.lastPoint=e,k()},C=()=>{const{context:e,config:{writeColor:t,lineCap:i,lineJoin:o}}=n;e&&(e.beginPath(),t&&(e.strokeStyle=t),i&&(e.lineCap=i),o&&(e.lineJoin=o))},M=()=>{const{context:e,canvasElement:t,config:{writeColor:i,bgColor:o,borderWidth:a,borderColor:m,isShowBorder:w,isSign:d},dpr:p}=n;if(e&&t){if(e.save(),i&&(e.strokeStyle=i),e.clearRect(0,0,t.width,t.height),o&&o!=="none"&&(e.fillStyle=o,e.fillRect(0,0,t.width,t.height)),e.beginPath(),m&&(e.strokeStyle=m),a!=null&&a!=null){e.lineWidth=a*p;const f=a/2*p;w&&(e.moveTo(f,f),e.lineTo(t.width-f,f),e.lineTo(t.width-f,t.height-f),e.lineTo(f,t.height-f),e.closePath(),e.stroke(),w&&!d&&(e.moveTo(0,0),e.lineTo(t.width,t.height),e.lineTo(t.width,t.height/2),e.lineTo(0,t.height/2),e.lineTo(0,t.height),e.lineTo(t.width,0),e.lineTo(t.width/2,0),e.lineTo(t.width/2,t.height),e.stroke()))}e.restore(),S(null)}},S=e=>{c("update:modelValue",e),c("change",e),console.log(e)},I=()=>{const{canvasElement:e,config:{canvasWidth:t,canvasHeight:i},dpr:o}=n;e&&(t!=null&&t!=null&&(e.width=t*o,e.style.width=`${t}px`),i!=null&&i!=null&&(e.height=i*o,e.style.height=`${i}px`))},b=e=>W(h(e)),R=e=>{n.config.isWrite&&v(h(e))},l=e=>{T(h(e))},r=e=>{n.config.isWrite=!1,n.config.lastPoint=h(e)},B=()=>{const{canvasElement:e}=n;if(e)return e.getBoundingClientRect()},D=(e,t)=>{const i="offset"+t[0].toUpperCase()+t.substring(1);if(e){let o=e[i],a=e.offsetParent;for(;a!=null;)o+=a[i],a=a.offsetParent;return o}return 0},E=e=>{const t=B();if(t){const i=e.clientX?e.clientX-t.left:e.pageX-D(e.target,"left"),o=e.clientY?e.clientY-t.top:e.pageY-D(e.target,"top");return{x:i,y:o}}return{x:0,y:0}},F=e=>{const t=e.targetTouches[0];W(E(t))},$=e=>{const t=e.targetTouches[0];n.config.isWrite&&v(E(t))},V=e=>{const t=e.targetTouches,i=e.changedTouches,o=t&&t.length>0&&t[0]||i&&i.length>0&&i[0];o&&T(E(o))},k=()=>{n.canvasImage=new Image;const{canvasElement:e,config:{imgType:t,quality:i}}=n;return e&&t&&(n.canvasImage.src=e.toDataURL(`image/${t}`),S(n.canvasImage.src)),i!==1?z():n.canvasImage.src},q=e=>{const t=k();L(t,e?`${e}.${n.config.imgType}`:`${+new Date}.${n.config.imgType}`)},L=(e,t)=>{const i=document.createElementNS("http://www.w3.org/1999/xhtml","a");i.href=e,i.download=t;const o=document.createEvent("MouseEvents");o.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),i.dispatchEvent(o)},z=e=>{const{config:{canvasWidth:t,canvasHeight:i,quality:o},canvasImage:a}=n,m=e||o||1,w=m<.1||m>1?.6:m,d=document.createElement("canvas"),p=d.getContext("2d");return t!=null&&t!=null&&(d.width=Math.floor(t*w)),i!=null&&i!=null&&(d.height=Math.floor(i*w)),p&&a&&(p.clearRect(0,0,d.width,d.height),p.drawImage(a,0,0,d.width,d.height)),d.toDataURL("image/png",w)};return s.onMounted(()=>{u(),window.onresize=()=>{n.resizeTimer&&clearTimeout(n.resizeTimer),n.resizeTimer=setTimeout(()=>u(),100)}}),s.onBeforeUnmount(()=>{window.onresize=null,clearTimeout(n.resizeTimer)}),s.watch(()=>x.options,()=>u(),{deep:!0}),{...s.toRefs(n),canvasClear:M,onMousedown:b,onMousemove:R,onMouseup:l,onMouseleave:r,onTouchstart:F,onTouchmove:$,onTouchend:V,saveAsImg:k,dealImage:z,downloadSignImg:q}},g=s.defineComponent({name:"SignCanvas",__name:"SignCanvas",props:s.mergeModels({modelValue:{default:null},options:{default:()=>({isFullScreen:!1,isFullCover:!1,isDpr:!1,lastWriteSpeed:1,lastWriteWidth:2,lineCap:"round",lineJoin:"round",canvasWidth:600,canvasHeight:600,isShowBorder:!0,bgColor:"#fcc",borderWidth:1,borderColor:"#ff787f",writeWidth:5,maxWriteWidth:30,minWriteWidth:5,writeColor:"#101010",isSign:!1,imgType:"png",quality:1})}},{value:{},valueModifiers:{}}),emits:s.mergeModels(["update:modelValue","change"],["update:value"]),setup(c,{expose:x}){s.useModel(c,"value");const{canvasElement:P,onMousedown:n,onMousemove:u,onMouseup:y,onMouseleave:W,onTouchstart:v,onTouchmove:T,onTouchend:C,canvasClear:M,saveAsImg:S,downloadSignImg:I,dealImage:b}=H();return x({canvasClear:M,saveAsImg:S,downloadSignImg:I,dealImage:b}),(R,l)=>(s.openBlock(),s.createElementBlock("canvas",{ref:r=>P.value=r,class:"app-sign-canvas",onMousedown:l[0]||(l[0]=s.withModifiers((...r)=>s.unref(n)&&s.unref(n)(...r),["prevent","stop"])),onMousemove:l[1]||(l[1]=s.withModifiers((...r)=>s.unref(u)&&s.unref(u)(...r),["prevent","stop"])),onMouseup:l[2]||(l[2]=s.withModifiers((...r)=>s.unref(y)&&s.unref(y)(...r),["prevent","stop"])),onMouseleave:l[3]||(l[3]=s.withModifiers((...r)=>s.unref(W)&&s.unref(W)(...r),["prevent","stop"])),onTouchstart:l[4]||(l[4]=s.withModifiers((...r)=>s.unref(v)&&s.unref(v)(...r),["prevent","stop"])),onTouchmove:l[5]||(l[5]=s.withModifiers((...r)=>s.unref(T)&&s.unref(T)(...r),["prevent","stop"])),onTouchend:l[6]||(l[6]=s.withModifiers((...r)=>s.unref(C)&&s.unref(C)(...r),["prevent","stop"]))}," 您的浏览器不支持canvas技术,请升级浏览器! ",544))}});return g.install=function(c){return c.component((g==null?void 0:g.name)??"SignCanvas",g),c},typeof window<"u"&&window.Vue&&g.install(window.Vue),g}); diff --git a/main.ts b/main.ts new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..65e0fcc --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4510 @@ +{ + "name": "sign-canvas", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "sign-canvas", + "version": "2.0.0", + "dependencies": { + "vue": "^3.4.21" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.8.0", + "@tsconfig/node20": "^20.1.4", + "@types/node": "^20.12.5", + "@vitejs/plugin-vue": "^5.0.4", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "@vue/eslint-config-prettier": "^9.0.0", + "@vue/eslint-config-typescript": "^13.0.0", + "@vue/tsconfig": "^0.5.1", + "eslint": "^8.57.0", + "eslint-plugin-vue": "^9.23.0", + "npm-run-all2": "^6.1.2", + "prettier": "^3.2.5", + "typescript": "~5.4.0", + "vite": "^5.2.8", + "vite-plugin-dts": "^3.9.0", + "vite-plugin-vue-devtools": "^7.0.25", + "vue-tsc": "^2.0.11" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.7", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.4", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-decorators": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.24.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-typescript": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.43.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.43.0.tgz", + "integrity": "sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.28.13", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "4.0.2", + "@rushstack/rig-package": "0.5.2", + "@rushstack/terminal": "0.10.0", + "@rushstack/ts-command-line": "4.19.1", + "lodash": "~4.17.15", + "minimatch": "~3.0.3", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.4.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.28.13", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.28.13.tgz", + "integrity": "sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "4.0.2" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.17.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", + "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==", + "dev": true + }, + "node_modules/@rushstack/node-core-library": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-4.0.2.tgz", + "integrity": "sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==", + "dev": true, + "dependencies": { + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "z-schema": "~5.0.2" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@rushstack/rig-package": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.2.tgz", + "integrity": "sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==", + "dev": true, + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.10.0.tgz", + "integrity": "sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "4.0.2", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/terminal/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rushstack/terminal/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.19.1.tgz", + "integrity": "sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==", + "dev": true, + "dependencies": { + "@rushstack/terminal": "0.10.0", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@tsconfig/node20": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz", + "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", + "dev": true + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/type-utils": "7.7.1", + "@typescript-eslint/utils": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.7.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/typescript-estree": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.7.1", + "@typescript-eslint/utils": "7.7.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.7.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.7.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/typescript-estree": "7.7.1", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz", + "integrity": "sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3", + "@vue/babel-plugin-jsx": "^1.1.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "2.2.0-alpha.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.2.0-alpha.10" + } + }, + "node_modules/@volar/source-map": { + "version": "2.2.0-alpha.10", + "dev": true, + "license": "MIT", + "dependencies": { + "muggle-string": "^0.4.0" + } + }, + "node_modules/@volar/typescript": { + "version": "2.2.0-alpha.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.2.0-alpha.10", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "~7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "@vue/babel-helper-vue-transform-on": "1.2.2", + "@vue/babel-plugin-resolve-type": "1.2.2", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-jsx/node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/helper-module-imports": "~7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/parser": "^7.23.9", + "@vue/compiler-sfc": "^3.4.15" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.25", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.24.4", + "@vue/shared": "3.4.25", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.25", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.4.25", + "@vue/shared": "3.4.25" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.25", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.24.4", + "@vue/compiler-core": "3.4.25", + "@vue/compiler-dom": "3.4.25", + "@vue/compiler-ssr": "3.4.25", + "@vue/shared": "3.4.25", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.10", + "postcss": "^8.4.38", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.25", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.4.25", + "@vue/shared": "3.4.25" + } + }, + "node_modules/@vue/devtools-core": { + "version": "7.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.1.3", + "@vue/devtools-shared": "^7.1.3", + "mitt": "^3.0.1", + "nanoid": "^3.3.4", + "pathe": "^1.1.2", + "vite-hot-client": "^0.2.3" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.1.3", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.3.1" + } + }, + "node_modules/@vue/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==", + "dev": true, + "dependencies": { + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0" + }, + "peerDependencies": { + "eslint": ">= 8.0.0", + "prettier": ">= 3.0.0" + } + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", + "integrity": "sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", + "vue-eslint-parser": "^9.3.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "peerDependencies": { + "eslint": "^8.56.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": ">=4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core": { + "version": "2.0.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.2.0-alpha.10", + "@vue/compiler-dom": "^3.4.0", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.25", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.4.25" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.25", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.4.25", + "@vue/shared": "3.4.25" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.25", + "license": "MIT", + "dependencies": { + "@vue/runtime-core": "3.4.25", + "@vue/shared": "3.4.25", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.25", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.4.25", + "@vue/shared": "3.4.25" + }, + "peerDependencies": { + "vue": "3.4.25" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.25", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.5.1.tgz", + "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001613", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/computeds": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/default-browser": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.750", + "dev": true, + "license": "ISC" + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/esbuild": { + "version": "0.20.2", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.25.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz", + "integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.0", + "vue-eslint-parser": "^9.4.2", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-vue/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-vue/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "dev": true, + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-all2": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.1.2.tgz", + "integrity": "sha512-WwwnS8Ft+RpXve6T2EIEVpFLSqN+ORHRvgNk3H9N62SZXjmzKoRhMFg3I17TK3oMaAEr+XFbRirWS2Fn3BCPSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "cross-spawn": "^7.0.3", + "memorystream": "^0.3.1", + "minimatch": "^9.0.0", + "pidtree": "^0.6.0", + "read-package-json-fast": "^3.0.2", + "shell-quote": "^1.7.3" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0", + "npm": ">= 8" + } + }, + "node_modules/npm-run-all2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.17.0", + "@rollup/rollup-android-arm64": "4.17.0", + "@rollup/rollup-darwin-arm64": "4.17.0", + "@rollup/rollup-darwin-x64": "4.17.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.17.0", + "@rollup/rollup-linux-arm-musleabihf": "4.17.0", + "@rollup/rollup-linux-arm64-gnu": "4.17.0", + "@rollup/rollup-linux-arm64-musl": "4.17.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.17.0", + "@rollup/rollup-linux-riscv64-gnu": "4.17.0", + "@rollup/rollup-linux-s390x-gnu": "4.17.0", + "@rollup/rollup-linux-x64-gnu": "4.17.0", + "@rollup/rollup-linux-x64-musl": "4.17.0", + "@rollup/rollup-win32-arm64-msvc": "4.17.0", + "@rollup/rollup-win32-ia32-msvc": "4.17.0", + "@rollup/rollup-win32-x64-msvc": "4.17.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "dev": true + }, + "node_modules/synckit": { + "version": "0.8.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/validator": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vite": { + "version": "5.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-hot-client": { + "version": "0.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0" + } + }, + "node_modules/vite-plugin-dts": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-3.9.0.tgz", + "integrity": "sha512-pwFIEYQ3LZvMafkEGvNnileb6af5JuyZsBfYQrTDYxdeGEy0OS4B4hCsLPo5YGnhK5k9EzyO6BXVO6y+Lt5T2A==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor": "7.43.0", + "@rollup/pluginutils": "^5.1.0", + "@vue/language-core": "^1.8.27", + "debug": "^4.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.8", + "vue-tsc": "^1.8.27" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "typescript": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite-plugin-dts/node_modules/@volar/language-core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz", + "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.11.1" + } + }, + "node_modules/vite-plugin-dts/node_modules/@volar/source-map": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz", + "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", + "dev": true, + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/vite-plugin-dts/node_modules/@volar/typescript": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz", + "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.11.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/vite-plugin-dts/node_modules/@vue/language-core": { + "version": "1.8.27", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz", + "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", + "dev": true, + "dependencies": { + "@volar/language-core": "~1.11.1", + "@volar/source-map": "~1.11.1", + "@vue/compiler-dom": "^3.3.0", + "@vue/shared": "^3.3.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vite-plugin-dts/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vite-plugin-dts/node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true + }, + "node_modules/vite-plugin-dts/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vite-plugin-dts/node_modules/vue-tsc": { + "version": "1.8.27", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz", + "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==", + "dev": true, + "dependencies": { + "@volar/typescript": "~1.11.1", + "@vue/language-core": "1.8.27", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vite-plugin-dts/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/vite-plugin-inspect": { + "version": "0.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/utils": "^0.7.7", + "@rollup/pluginutils": "^5.1.0", + "debug": "^4.3.4", + "error-stack-parser-es": "^0.1.1", + "fs-extra": "^11.2.0", + "open": "^10.1.0", + "perfect-debounce": "^1.0.0", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "7.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-core": "^7.1.3", + "@vue/devtools-kit": "^7.1.3", + "@vue/devtools-shared": "^7.1.3", + "execa": "^8.0.1", + "sirv": "^2.0.4", + "vite-plugin-inspect": "^0.8.4", + "vite-plugin-vue-inspector": "^5.0.1" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0" + } + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0" + } + }, + "node_modules/vue": { + "version": "3.4.25", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.4.25", + "@vue/compiler-sfc": "3.4.25", + "@vue/runtime-dom": "3.4.25", + "@vue/server-renderer": "3.4.25", + "@vue/shared": "3.4.25" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.6.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-eslint-parser/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.0.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.2.0-alpha.10", + "@vue/language-core": "2.0.14", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vue-tsc/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-tsc/node_modules/semver": { + "version": "7.6.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-tsc/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..692d94a --- /dev/null +++ b/package.json @@ -0,0 +1,48 @@ +{ + "name": "sign-canvas-plus", + "version": "2.0.0", + "author": "yxs", + "private": false, + "description": "一个基于canvas和vue3的手写签名板,支持移动端和PC可以直接下载图片和转成base64编码,支持高倍屏高清绘制,(sign-canvas)的vue3版本,可以在vue3中使用了。", + "main": "lib/sign-canvas-plus.umd.js", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build", + "preview": "vite preview", + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", + "format": "prettier --write src/" + }, + "dependencies": { + "vue": "^3.4.21" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.8.0", + "@tsconfig/node20": "^20.1.4", + "@types/node": "^20.12.5", + "@vitejs/plugin-vue": "^5.0.4", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "@vue/eslint-config-prettier": "^9.0.0", + "@vue/eslint-config-typescript": "^13.0.0", + "@vue/tsconfig": "^0.5.1", + "eslint": "^8.57.0", + "eslint-plugin-vue": "^9.23.0", + "npm-run-all2": "^6.1.2", + "prettier": "^3.2.5", + "typescript": "~5.4.0", + "vite": "^5.2.8", + "vite-plugin-dts": "^3.9.0", + "vite-plugin-vue-devtools": "^7.0.25", + "vue-tsc": "^2.0.11" + }, + "repository": { + "type": "git", + "url": "git@github.com:langyuxiansheng/vue-sign-canvas.git" + }, + "types": "lib/index.d.ts", + "files": [ + "lib", + "types", + "packages" + ] +} \ No newline at end of file diff --git a/packages/SignCanvas/SignCanvas.vue b/packages/SignCanvas/SignCanvas.vue new file mode 100644 index 0000000..4a8da4f --- /dev/null +++ b/packages/SignCanvas/SignCanvas.vue @@ -0,0 +1,77 @@ + + + diff --git a/packages/SignCanvas/hooks/useSignCanvas.ts b/packages/SignCanvas/hooks/useSignCanvas.ts new file mode 100644 index 0000000..60263ad --- /dev/null +++ b/packages/SignCanvas/hooks/useSignCanvas.ts @@ -0,0 +1,480 @@ +import { getCurrentInstance, onBeforeUnmount, onMounted, reactive, toRefs, watch } from 'vue'; +import { IOptions, IPoint, SDirection } from '../../types'; +interface IState { + canvasElement: HTMLCanvasElement | null; + context: CanvasRenderingContext2D | null; + dpr: number; + config: IOptions & { + lastWriteTime: number; + isWrite: boolean; + lastPoint: IPoint + }; + resizeTimer: any; //监听窗口变化 + canvasImage: HTMLImageElement | null, //canvas转换的图片 +} + +/** + * 获取鼠标的坐标点 + * @param e + * @returns + */ +const getPoint = (e: MouseEvent) => ({ x: e.offsetX || e.clientX, y: e.offsetY || e.clientY }); + +/** + * useSignCanvas + */ +export const useSignCanvas = () => { + + const { emit, props }: any = getCurrentInstance(); + + const initState = (): IState => ({ + // domId: `sign-canvas-${Math.random().toString(36).substring(2)}`, + canvasElement: null, + context: null, + dpr: 0, + config: { + isFullScreen: false, // 是否全屏手写 [Boolean] 可选 + isFullCover: false, // 是否全屏模式下覆盖所有的元素 [Boolean] 可选 + isDpr: false, // 是否使用dpr兼容高分屏 [Boolean] 可选 + lastWriteSpeed: 1, // 书写速度 [Number] 可选 + lastWriteWidth: 2, // 下笔的宽度 [Number] 可选 + lineCap: 'round', // 线条的边缘类型 [butt]平直的边缘 [round]圆形线帽 [square] 正方形线帽 + lineJoin: 'round', // 线条交汇时边角的类型 [bevel]创建斜角 [round]创建圆角 [miter]创建尖角。 + canvasWidth: 600, // canvas宽高 [Number] 可选 + canvasHeight: 600, // 高度 [Number] 可选 + isShowBorder: true, // 是否显示边框 [可选] + bgColor: '#fcc', // 背景色 [String] 可选 注:这背景色仅仅只是canvas背景,保存的图片仍然是透明的 + borderWidth: 1, // 网格线宽度 [Number] 可选 + borderColor: '#ff787f', // 网格颜色 [String] 可选 + writeWidth: 5, // 基础轨迹宽度 [Number] 可选 + maxWriteWidth: 30, // 写字模式最大线宽 [Number] 可选 + minWriteWidth: 5, // 写字模式最小线宽 [Number] 可选 + writeColor: '#101010', // 轨迹颜色 [String] 可选 + isSign: false, // 签名模式 [Boolean] 默认为非签名模式,有线框, 当设置为true的时候没有任何线框 + imgType: 'png', //下载的图片格式 [String] 可选为 jpeg canvas本是透明背景的 + quality: 1, //压缩比例 [Number] 可选 + + lastWriteTime: 0, + isWrite: false, + lastPoint: { + x: 0, + y: 0 + }, + }, + resizeTimer: null, + canvasImage: null + }); + + const state = reactive(initState()); + + const init = () => { + console.log(state.canvasElement); + const options = props.options; + if (options) { + for (const key in options) { + if (options[key] != undefined && options[key] != null) { + state.config[key] = options[key]; + } + } + } + state.dpr = typeof window !== 'undefined' && state.config.isDpr ? window.devicePixelRatio || window.webkitDevicePixelRatio || window.mozDevicePixelRatio || 1 : 1; + const { canvasElement, config } = state; + if (canvasElement) { + state.context = canvasElement.getContext("2d"); + if (config.isFullScreen) { + config.canvasWidth = window.innerWidth || document.body.clientWidth; + config.canvasHeight = window.innerHeight || document.body.clientHeight; + if (config.isFullCover) {//开启全屏覆盖 + canvasElement.style.position = 'fixed'; + canvasElement.style.top = '0'; + canvasElement.style.left = '0'; + canvasElement.style.margin = '0'; + canvasElement.style.zIndex = '20001'; + } + } + + if (config.canvasWidth) { + canvasElement.width = config.canvasWidth; + } + + if (config.canvasHeight) { + canvasElement.height = config.canvasHeight; + } + canvasInit(); + canvasClear(); + } + } + + /** + * 轨迹宽度 + */ + const setLineWidth = () => { + const { config } = state; + const nowTime = new Date().getTime(); + const diffTime = nowTime - config.lastWriteTime; + config.lastWriteTime = nowTime; + if (config.minWriteWidth != undefined && config.maxWriteWidth != undefined && state.context) { + let returnNum = config.minWriteWidth + (config.maxWriteWidth - config.minWriteWidth) * diffTime / 30; + if (returnNum < config.minWriteWidth) { + returnNum = config.minWriteWidth; + } else if (returnNum > config.maxWriteWidth) { + returnNum = config.maxWriteWidth; + } + returnNum = +returnNum.toFixed(2); + //写字模式和签名模式 + if (config.isSign) { + state.context.lineWidth = (config.writeWidth ?? 0) * state.dpr; + } else { + const lineWidth = config.lastWriteWidth = (config.lastWriteWidth ?? 0) / 4 * 3 + returnNum / 4; + state.context.lineWidth = lineWidth * state.dpr; + } + } + } + + /** + * 写开始 + */ + const writeBegin = (point: IPoint) => { + state.config.isWrite = true; + state.config.lastWriteTime = new Date().getTime(); + console.log(point); + state.config.lastPoint = point; + writeContextStyle(); + } + + /** + * 绘制轨迹 + */ + const writing = (point: IPoint) => { + const { context, config, dpr } = state; + if (context) { + context.beginPath(); + context.moveTo(config.lastPoint.x * dpr, config.lastPoint.y * dpr); + context.lineTo(point.x * dpr, point.y * dpr); + setLineWidth(); + context.stroke(); + config.lastPoint = point; + context.closePath(); + } + } + + /** + * 写结束 + */ + const writeEnd = (point: IPoint) => { + const { config } = state; + config.isWrite = false; + config.lastPoint = point; + saveAsImg(); + } + + + /** + * 轨迹样式 + */ + const writeContextStyle = () => { + const { context, config: { writeColor, lineCap, lineJoin } } = state; + if (context) { + context.beginPath(); + if (writeColor) { + context.strokeStyle = writeColor; + } + + if (lineCap) { + context.lineCap = lineCap; + } + + if (lineJoin) { + context.lineJoin = lineJoin; + } + } + } + + /** + * 清空画板 + */ + const canvasClear = () => { + const { context, canvasElement, config: { writeColor, bgColor, borderWidth, borderColor, isShowBorder, isSign }, dpr } = state; + if (context && canvasElement) { + context.save(); + if (writeColor) { + context.strokeStyle = writeColor; + } + + context.clearRect(0, 0, canvasElement.width, canvasElement.height); + + //设置背景色 + if (bgColor && bgColor !== 'none') { + context.fillStyle = bgColor; + context.fillRect(0, 0, canvasElement.width, canvasElement.height); + } + + //绘制线框 + context.beginPath(); + + if (borderColor) { + context.strokeStyle = borderColor; + } + + if (borderWidth != undefined && borderWidth != null) { + context.lineWidth = borderWidth * dpr; + const size = borderWidth / 2 * dpr; + if (isShowBorder) { + //画外面的框 + context.moveTo(size, size); + context.lineTo(canvasElement.width - size, size); + context.lineTo(canvasElement.width - size, canvasElement.height - size); + context.lineTo(size, canvasElement.height - size); + context.closePath(); + context.stroke(); + + if (isShowBorder && !isSign) { + //画里面的框 + context.moveTo(0, 0); + context.lineTo(canvasElement.width, canvasElement.height); + context.lineTo(canvasElement.width, canvasElement.height / 2); + context.lineTo(0, canvasElement.height / 2); + context.lineTo(0, canvasElement.height); + context.lineTo(canvasElement.width, 0); + context.lineTo(canvasElement.width / 2, 0); + context.lineTo(canvasElement.width / 2, canvasElement.height); + context.stroke(); + } + + } + } + context.restore(); + onChange(null); + } + } + + const onChange = (data: any) => { + emit('update:modelValue', data); + emit('change', data); + console.log(data); + } + + /** + * 初始化画板 + */ + const canvasInit = () => { + const { canvasElement, config: { canvasWidth, canvasHeight }, dpr } = state; + if (canvasElement) { + if (canvasWidth != undefined && canvasWidth != null) { + canvasElement.width = canvasWidth * dpr; + canvasElement.style.width = `${canvasWidth}px`; + } + if (canvasHeight != undefined && canvasHeight != null) { + canvasElement.height = canvasHeight * dpr; + canvasElement.style.height = `${canvasHeight}px`; + } + } + } + + /** + * 鼠标按下 => 下笔 + */ + const onMousedown = (e: MouseEvent) => writeBegin(getPoint(e)); + + /** + * 书写过程 => 下笔书写 + */ + const onMousemove = (e: MouseEvent) => { + if (state.config.isWrite) writing(getPoint(e)); + } + + /** + * 鼠标松开 => 提笔 + */ + const onMouseup = (e: MouseEvent) => { + writeEnd(getPoint(e)); + } + + /** + * 离开书写区域 => 提笔离开 + */ + const onMouseleave = (e: MouseEvent) => { + state.config.isWrite = false; + state.config.lastPoint = getPoint(e); + } + + /* ==========================移动端兼容=Start================================ */ + + /** + * 获取画布的元素的大小及其相对于视口的位置 + * @return {} + */ + const getRect = (): DOMRect | undefined => { + const { canvasElement } = state; + if (canvasElement) { + return canvasElement.getBoundingClientRect(); + } + } + + /** + * 获取dom对象的偏移量 可以获取解决position定位的问题 + * @returns number + */ + const offset = (target: any, direction: SDirection): number => { + //将top,left首字母大写,并拼接成offsetTop,offsetLeft + const offsetDir = 'offset' + direction[0].toUpperCase() + direction.substring(1); + if (target) { + let realNum = target[offsetDir]; + let positionParent = target.offsetParent; //获取上一级定位元素对象 + while (positionParent != null) { + realNum += positionParent[offsetDir]; + positionParent = positionParent.offsetParent; + } + return realNum; + } + return 0; + } + + /** + * 获取移动端的触控点坐标 + * @param e + * @returns + */ + const getTouchPoint = (e: Touch) => { + const rect: DOMRect | undefined = getRect(); + if (rect) { + const x = e.clientX ? e.clientX - rect.left : e.pageX - offset(e.target, 'left'); + const y = e.clientY ? e.clientY - rect.top : e.pageY - offset(e.target, 'top'); + return { x, y }; + } + return { x: 0, y: 0 }; + }; + + /** + * 手指按下 => 下笔 + */ + const onTouchstart = (e: TouchEvent) => { + const touch = e.targetTouches[0]; + writeBegin(getTouchPoint(touch)); + } + + /** + * 手指移动 => 下笔书写 + */ + const onTouchmove = (e: TouchEvent) => { + const touch = e.targetTouches[0]; + if (state.config.isWrite) { + writing(getTouchPoint(touch)); + } + } + + /** + * 手指移动结束 => 提笔离开 + */ + const onTouchend = (e: TouchEvent) => { + const tcs = e.targetTouches; + const ccs = e.changedTouches; + const touch = tcs && tcs.length > 0 && tcs[0] || ccs && ccs.length > 0 && ccs[0]; + if (touch) { + writeEnd(getTouchPoint(touch)); + } + } + + /* ==========================移动端兼容=End================================== */ + + + /** + * 保存图片 格式base64 + */ + const saveAsImg = () => { + state.canvasImage = new Image(); + const { canvasElement, config: { imgType, quality } } = state; + if (canvasElement && imgType) { + state.canvasImage.src = canvasElement.toDataURL(`image/${imgType}`); + onChange(state.canvasImage.src); + } + + return quality !== 1 ? dealImage() : state.canvasImage.src; + } + + /** + * 下载二维码到本地 + * @param name 文件名 + * @param isQual 是否下载压缩后的图片 + */ + const downloadSignImg = (name?: string) => { + const dataURL = saveAsImg(); + saveFile(dataURL, name ? `${name}.${state.config.imgType}` : `${+new Date()}.${state.config.imgType}`); + } + + /** + * 保存文件 + */ + const saveFile = (data: string, filename?: string) => { + const saveLink: any = document.createElementNS('http://www.w3.org/1999/xhtml', 'a'); + saveLink.href = data; + saveLink.download = filename; + const event = document.createEvent('MouseEvents'); + event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); + saveLink.dispatchEvent(event); + } + + /** + * 图片压缩 + * @param quality 压缩系数 + * @returns + * 说明: 此方法返回压缩后的base64,系数[0.1-1]之间 + */ + const dealImage = (q?: number) => { + const { config: { canvasWidth, canvasHeight, quality }, canvasImage } = state; + const cur = q || quality || 1; + const curQuality = cur < 0.1 || cur > 1 ? 0.6 : cur; + + //压缩系数0-1之间 + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + //目标尺寸 + if (canvasWidth != null && canvasWidth != undefined) { + canvas.width = Math.floor(canvasWidth * curQuality); + } + + if (canvasHeight != null && canvasHeight != undefined) { + canvas.height = Math.floor(canvasHeight * curQuality); + } + + if (ctx && canvasImage) { + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.drawImage(canvasImage, 0, 0, canvas.width, canvas.height); + + } + + const drgImg = canvas.toDataURL('image/png', curQuality); + return drgImg; + } + + onMounted(() => { + init(); + //监听窗口变化 + window.onresize = () => { + if (state.resizeTimer) clearTimeout(state.resizeTimer); + state.resizeTimer = setTimeout(() => init(), 100); + } + }); + + onBeforeUnmount(() => { + window.onresize = null; + clearTimeout(state.resizeTimer); + }); + + watch(() => props.options, () => init(), { deep: true }); + + return { + ...toRefs(state), + canvasClear, + onMousedown, + onMousemove, + onMouseup, + onMouseleave, + onTouchstart, + onTouchmove, + onTouchend, + saveAsImg, + dealImage, + downloadSignImg + }; +}; diff --git a/packages/index.ts b/packages/index.ts new file mode 100644 index 0000000..cf0d91b --- /dev/null +++ b/packages/index.ts @@ -0,0 +1,22 @@ +import type { App } from 'vue'; +// 导入单个组件 +import SignCanvas from './SignCanvas/SignCanvas.vue'; +import { IOptions, IPoint, SDirection, SImgType } from './types'; +// import type { Data } from './SignCanvas/interface' +// 导出的对象必须具备一个 install 方法 +SignCanvas.install = function (app: App) { + app.component(SignCanvas?.name ?? 'SignCanvas', SignCanvas); + return app; +} +if (typeof window !== 'undefined' && window.Vue) { + SignCanvas.install(window.Vue); +} + +export default SignCanvas; + +export type { + IOptions, + SImgType, + SDirection, + IPoint +} \ No newline at end of file diff --git a/packages/types.ts b/packages/types.ts new file mode 100644 index 0000000..c607ced --- /dev/null +++ b/packages/types.ts @@ -0,0 +1,37 @@ +/** + * 配置项 + */ +export interface IOptions { + isFullScreen?: boolean; // 是否全屏手写 [Boolean] 可选 + isFullCover?: boolean; // 是否全屏模式下覆盖所有的元素 [Boolean] 可选 + isDpr?: boolean; // 是否使用dpr兼容高分屏 [Boolean] 可选 + lastWriteSpeed?: number; // 书写速度 [Number] 可选 + lastWriteWidth?: number; // 下笔的宽度 [Number] 可选 + lineCap: CanvasRenderingContext2D['lineCap']; // 线条的边缘类型 [butt] 平直的边缘 [round] 圆形线帽 [square] 正方形线帽 + lineJoin: CanvasRenderingContext2D['lineJoin']; // 线条交汇时边角的类型 [bevel] 创建斜角 [round] 创建圆角 [miter] 创建尖角。 + canvasWidth?: number; // canvas宽度 [Number] 可选 + canvasHeight?: number; // 高度 [Number] 可选 + isShowBorder?: boolean; // 是否显示边框 [可选] + bgColor?: string; // 背景色 [String] 可选 直接渲染到图片 [移除:这背景色仅仅只是canvas背景,保存的图片仍然是透明的] + borderWidth?: number; // 网格线宽度 [Number] 可选 + borderColor?: string; // 网格颜色 [String] 可选 + writeWidth?: number; // 基础轨迹宽度 [Number] 可选 + maxWriteWidth?: number; // 写字模式最大线宽 [Number] 可选 + minWriteWidth?: number; // 写字模式最小线宽 [Number] 可选 + writeColor?: string; // 轨迹颜色 [String] 可选 + isSign?: boolean; // 签名模式 [Boolean] 默认为非签名模式,有线框, 当设置为true的时候没有任何线框 + imgType?: SImgType; // 下载的图片格式 [String] 可选为 jpeg canvas本是透明背景的 + quality?: number; // 压缩质量 [Number] 可选范围为[0-1]之间, 0.1 表示以10%的质量进行压缩; +} + +/** + * 图片格式 + */ +export type SImgType = 'png' | 'jpeg' | 'webp'; + +export type SDirection = 'left' | 'right' | 'top' | 'bottom'; + +export interface IPoint { + x: number + y: number +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/t.sh b/t.sh new file mode 100644 index 0000000..90153ba --- /dev/null +++ b/t.sh @@ -0,0 +1,43 @@ +echo "设置 npm config set registry https://registry.npmjs.org" + +npm config set registry https://registry.npmjs.org + +echo "打包 => dist"; + +# 打包 => dist +npm run build; + +echo "打包 插件lib"; + +# 打包 插件 +npm run lib; + +echo "推送到npmjs"; + +#推送到npmjs +npm publish; + +echo "设置 npm config set registry https://registry.npm.taobao.org" + +npm config set registry https://registry.npm.taobao.org + +# 更新gh-pages +echo "更新gh-pages"; + +git branch -D gh-pages; + +echo "删除gh-pages"; + +git checkout -b gh-pages; + +echo "创建并切换到gh-pages"; + +git add -f dist; + +git commit -m 'create gh-pages'; + +git push origin -d gh-pages; + +git subtree push --prefix dist origin gh-pages; + +echo "已推送gh-pages"; \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..e14c754 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,14 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..66b5e57 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..f094063 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,19 @@ +{ + "extends": "@tsconfig/node20/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*" + ], + "compilerOptions": { + "composite": true, + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..6c6e365 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,40 @@ +// vite.config.ts +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; // pnpm add -D @vitejs/plugin-vue-jsx +import path from "path"; +import dts from 'vite-plugin-dts'; + +const resolve = (dir: string) => path.join(__dirname, dir); +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueJsx({}), + dts() + ], + resolve: { + alias: { + "@": resolve("examples"), + packages: resolve("packages"), + }, + }, + build: { + outDir: 'lib', + rollupOptions: { + // 请确保外部化那些你的库中不需要的依赖 + external: ['vue'], + output: { + // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量 + globals: { + vue: 'Vue', + }, + }, + }, + lib: { + entry: 'packages/index.ts', + name: 'sign-canvas-plus', + fileName: (format) => `sign-canvas-plus.${format}.js`, + }, + }, +})