├── .gitignore ├── .vscode └── extensions.json ├── README.md ├── dist ├── style.css ├── vue-input-highlighter.es.js └── vue-input-highlighter.umd.js ├── index.html ├── package-lock.json ├── package.json ├── src ├── components │ └── input-highlighter.vue ├── index.js ├── style.css └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist-ssr 12 | *.local 13 | 14 | # Editor directories and files 15 | .vscode/* 16 | !.vscode/extensions.json 17 | .idea 18 | .DS_Store 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

vue input highlighter banner

2 | 3 | # Vue Input Highlighter 4 | 5 | Component that allows content highlighting within an input field based on specified regular expressions (regexes). 6 | 7 | It enhances user experience by providing visual feedback about specified patterns recognized and improves the interaction the user have with the input. 8 | 9 |

vue input highlighter animation

10 | 11 | 12 | # Table of contents 13 | 14 | - [Installation](#installation) 15 | 16 | 17 | - [Imports](#imports) 18 | 19 | 20 | - [Usage example](#usage-example) 21 | 22 | 23 | - [How it works](#how-it-works) 24 | 25 | 26 | - [Use Cases](#use-cases) 27 | 28 | 29 | - [Props](#props) 30 | 31 | 32 | - [Events](#events) 33 | 34 | 35 | - [Contribution](#contribution) 36 | 37 | 38 | - [Acknowledgments](#acknowledgments) 39 | 40 | 41 | # Installation 42 | 43 | Using npm : 44 | 45 | $ npm i @leyton-techlab/vue-input-highlighter 46 | 47 | 48 | Using yarn : 49 | 50 | $ yarn add @leyton-techlab/vue-input-highlighter 51 | 52 | 53 | # Imports 54 | 55 | Register the component globally : 56 | 57 | #### inside main.(js/ts) 58 | ````typescript 59 | 60 | import InputHighlighter from '@leyton-techlab/vue-input-highlighter'; 61 | import '@leyton-techlab/vue-input-highlighter/style.css'; 62 | 63 | const app = createApp(App) 64 | 65 | app.component("InputHighlighter", InputHighlighter); 66 | 67 | app.mount('#app') 68 | 69 | ```` 70 | Import within the scope of a component 71 | 72 | #### Script Setup 73 | ````typescript 74 | 84 | 85 | 92 | ```` 93 | 94 | #### Option Api 95 | ````typescript 96 | 110 | 111 | 118 | 119 | ```` 120 | # Usage example 121 | 122 | Please refer to the following link content as usage example : [codesandbox](https://codesandbox.io/s/admiring-kilby-4h9swj?file=/src/App.vue) 123 | 124 |

vue input highlighter demo

125 | 126 | 127 | # How it works 128 | 129 | The component is based on a 'content editable' div that replicates the behavior of an input tag. 130 | 131 | As the user inputs content, the component evaluates the div's text and analyzes it using regular expressions (regex). 132 | 133 | Any fragment that matches the regex is encapsulated within an HTML tag, with the default being \ (or as specified) for which the relevant styles are then applied. 134 | 135 | # Use Cases 136 | 137 | Use cases example : 138 | 139 | - Highlight search operators (example : and, or, not, ") inside a search bar 140 | 141 | - Highlight id like entries (ex: company number, salesforce id, random code) 142 | 143 | - Highlight business specific keyword 144 | 145 | - Protocols : http/https 146 | 147 | - Language syntax : select, from, where 148 | 149 | - Auth methods : Basic, Bearer 150 | 151 | # Props 152 | 153 | List of component props : 154 | 155 | | Props | Description | 156 | |-------------|-----------------------------------------------------------------------------| 157 | | modelValue | allow v-model behavior for the component | 158 | | rules | array of rules as composed object defined in more details in the next table | 159 | | placeholder | string value displayed when input is empty as a placeholder for explanation | 160 | 161 | 162 | List of component "rules" props sub-elements : 163 | 164 | | Sub-element | Description | 165 | |-------------|---------------------------------------------------------------------------------| 166 | | regex | pattern to be matched | 167 | | style | string value to be mapped inside the style attribute of the matched element tag | 168 | | class | string value to be mapped inside the class attribute of the matched element tag | 169 | | tag | tag used when wrapping the matched element | 170 | 171 | # Events 172 | 173 | List of component custom events 174 | 175 | | Events | Description | 176 | |------------|-------------------------------------------------------------------------------------------| 177 | | highlight | fires whenever one or multiple highlights are matched. return list of newly matched text. | 178 | | highlights | fires at each input. return list of all matched text by the input. | 179 | 180 | # Contribution 181 | 182 | Every improvement of the package is welcome, just fork the project make the necessary changes and create a pull request. 183 | 184 | If you want to contact me (@GAliNor) here is a [link](https://www.linkedin.com/in/ali-guedda/) to my linkedin profile 185 | 186 | # Acknowledgments 187 | 188 | Many thanks to : 189 | 190 | - [@karimerrahli](https://github.com/karimerrahli) 191 | - [@afaddoul](https://github.com/afaddoul) 192 | - [@AdnaneAm](https://github.com/adnaneam) 193 | - [@akiyamaSM](https://github.com/akiyamaSM) 194 | 195 | for the reviews and advice 196 | -------------------------------------------------------------------------------- /dist/style.css: -------------------------------------------------------------------------------- 1 | .input-highlighter{width:200px;padding:3px 5px;border:1px solid black;overflow-x:auto;white-space:nowrap;-ms-overflow-style:none;scrollbar-width:none}.input-highlighter::-webkit-scrollbar{display:none}.input-highlighter:focus{outline:0px solid transparent}.input-highlighter[placeholder]:empty:before{content:attr(placeholder);color:#000;opacity:.6} 2 | -------------------------------------------------------------------------------- /dist/vue-input-highlighter.es.js: -------------------------------------------------------------------------------- 1 | import { toRefs as E, ref as p, onMounted as R, openBlock as $, createElementBlock as b, unref as T } from "vue"; 2 | const V = ["placeholder"], f = "strong", w = { 3 | __name: "input-highlighter", 4 | props: { 5 | modelValue: String, 6 | rules: { 7 | type: Array, 8 | default: [] 9 | }, 10 | placeholder: { 11 | type: String, 12 | default: "" 13 | } 14 | }, 15 | emits: ["update:modelValue", "highlight", "highlights"], 16 | setup(m, { emit: r }) { 17 | const _ = m, { modelValue: v, rules: x, placeholder: y } = E(_), s = p(""), c = p(v.value), g = []; 18 | let i = []; 19 | for (const e of x.value) 20 | e instanceof RegExp ? g.push({ 21 | regex: e, 22 | class: "", 23 | style: "", 24 | tag: f 25 | }) : e instanceof Object && g.push({ 26 | regex: e.regex, 27 | class: e.class ? e.class : "", 28 | style: e.style ? e.style : "", 29 | tag: e.tag ? e.tag : f 30 | }); 31 | R(() => { 32 | a(); 33 | }); 34 | const H = (e) => e.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"), u = (e, t, o, l) => { 35 | if (l.done) 36 | return l; 37 | let n = null; 38 | if (e.childNodes.length == 0) 39 | l.pos += e.textContent.length; 40 | else 41 | for (let h = 0; h < e.childNodes.length && !l.done; h++) { 42 | if (n = e.childNodes[h], n === t) 43 | return l.pos += o, l.done = !0, l; 44 | u(n, t, o, l); 45 | } 46 | return l; 47 | }, d = (e, t, o) => { 48 | if (o.done) 49 | return t; 50 | if (e.childNodes.length == 0) 51 | e.textContent.length >= o.pos ? (t.setStart(e, o.pos), o.done = !0) : o.pos = o.pos - e.textContent.length; 52 | else 53 | for (let l = 0; l < e.childNodes.length && !o.done; l++) { 54 | let n = e.childNodes[l]; 55 | d(n, t, o); 56 | } 57 | return t; 58 | }, N = (e) => { 59 | for (const t of g) 60 | e = e.replaceAll( 61 | t.regex, 62 | `<${t.tag} class="${t.class}" style="${t.style}">$1` 63 | ); 64 | return e; 65 | }, a = () => { 66 | const e = H(c.value), t = N(e); 67 | s.value.innerHTML = t; 68 | }, S = (e) => { 69 | const t = Array.from(e); 70 | return i.forEach((o) => { 71 | const l = t.indexOf(o); 72 | l > -1 && t.splice(l, 1); 73 | }), t; 74 | }, C = () => { 75 | const e = Array.from(s.value.children).map((t) => t.innerHTML); 76 | e.length > i.length && r("highlight", S(e)), i = e, r("highlights", i); 77 | }, A = () => { 78 | c.value = s.value.textContent; 79 | const e = window.getSelection(), t = e.focusNode, o = e.focusOffset, l = u(s.value, t, o, { pos: 0, done: !1 }); 80 | o === 0 && (l.pos += 0.5), a(), e.removeAllRanges(); 81 | const n = d(s.value, document.createRange(), { 82 | pos: l.pos, 83 | done: !1 84 | }); 85 | n.collapse(!0), e.addRange(n), C(), r("update:modelValue", c.value); 86 | }; 87 | return (e, t) => ($(), b("div", { 88 | contenteditable: "true", 89 | ref_key: "editableElmt", 90 | ref: s, 91 | class: "input-highlighter", 92 | placeholder: T(y), 93 | onInput: A 94 | }, null, 40, V)); 95 | } 96 | }; 97 | export { 98 | w as default 99 | }; 100 | -------------------------------------------------------------------------------- /dist/vue-input-highlighter.umd.js: -------------------------------------------------------------------------------- 1 | (function(o,r){typeof exports=="object"&&typeof module<"u"?module.exports=r(require("vue")):typeof define=="function"&&define.amd?define(["vue"],r):(o=typeof globalThis<"u"?globalThis:o||self,o["vue-input-highlighter"]=r(o.Vue))})(this,function(o){"use strict";const r="",_=["placeholder"],f="strong";return{__name:"input-highlighter",props:{modelValue:String,rules:{type:Array,default:[]},placeholder:{type:String,default:""}},emits:["update:modelValue","highlight","highlights"],setup(x,{emit:h}){const y=x,{modelValue:v,rules:H,placeholder:N}=o.toRefs(y),i=o.ref(""),u=o.ref(v.value),g=[];let c=[];for(const e of H.value)e instanceof RegExp?g.push({regex:e,class:"",style:"",tag:f}):e instanceof Object&&g.push({regex:e.regex,class:e.class?e.class:"",style:e.style?e.style:"",tag:e.tag?e.tag:f});o.onMounted(()=>{m()});const S=e=>e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"),a=(e,t,n,l)=>{if(l.done)return l;let s=null;if(e.childNodes.length==0)l.pos+=e.textContent.length;else for(let d=0;d{if(n.done)return t;if(e.childNodes.length==0)e.textContent.length>=n.pos?(t.setStart(e,n.pos),n.done=!0):n.pos=n.pos-e.textContent.length;else for(let l=0;l{for(const t of g)e=e.replaceAll(t.regex,`<${t.tag} class="${t.class}" style="${t.style}">$1`);return e},m=()=>{const e=S(u.value),t=C(e);i.value.innerHTML=t},A=e=>{const t=Array.from(e);return c.forEach(n=>{const l=t.indexOf(n);l>-1&&t.splice(l,1)}),t},E=()=>{const e=Array.from(i.value.children).map(t=>t.innerHTML);e.length>c.length&&h("highlight",A(e)),c=e,h("highlights",c)},R=()=>{u.value=i.value.textContent;const e=window.getSelection(),t=e.focusNode,n=e.focusOffset,l=a(i.value,t,n,{pos:0,done:!1});n===0&&(l.pos+=.5),m(),e.removeAllRanges();const s=p(i.value,document.createRange(),{pos:l.pos,done:!1});s.collapse(!0),e.addRange(s),E(),h("update:modelValue",u.value)};return(e,t)=>(o.openBlock(),o.createElementBlock("div",{contenteditable:"true",ref_key:"editableElmt",ref:i,class:"input-highlighter",placeholder:o.unref(N),onInput:R},null,40,_))}}}); 2 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + Vue + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-input-highlighter", 3 | "version": "0.0.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "vue-input-highlighter", 9 | "version": "0.0.1", 10 | "dependencies": { 11 | "vue": "^3.3.4" 12 | }, 13 | "devDependencies": { 14 | "@vitejs/plugin-vue": "^4.2.3", 15 | "typescript": "^5.0.2", 16 | "vite": "^4.4.5", 17 | "vue-tsc": "^1.8.5" 18 | } 19 | }, 20 | "node_modules/@babel/parser": { 21 | "version": "7.22.7", 22 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", 23 | "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", 24 | "bin": { 25 | "parser": "bin/babel-parser.js" 26 | }, 27 | "engines": { 28 | "node": ">=6.0.0" 29 | } 30 | }, 31 | "node_modules/@esbuild/android-arm": { 32 | "version": "0.18.16", 33 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz", 34 | "integrity": "sha512-gCHjjQmA8L0soklKbLKA6pgsLk1byULuHe94lkZDzcO3/Ta+bbeewJioEn1Fr7kgy9NWNFy/C+MrBwC6I/WCug==", 35 | "cpu": [ 36 | "arm" 37 | ], 38 | "dev": true, 39 | "optional": true, 40 | "os": [ 41 | "android" 42 | ], 43 | "engines": { 44 | "node": ">=12" 45 | } 46 | }, 47 | "node_modules/@esbuild/android-arm64": { 48 | "version": "0.18.16", 49 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.16.tgz", 50 | "integrity": "sha512-wsCqSPqLz+6Ov+OM4EthU43DyYVVyfn15S4j1bJzylDpc1r1jZFFfJQNfDuT8SlgwuqpmpJXK4uPlHGw6ve7eA==", 51 | "cpu": [ 52 | "arm64" 53 | ], 54 | "dev": true, 55 | "optional": true, 56 | "os": [ 57 | "android" 58 | ], 59 | "engines": { 60 | "node": ">=12" 61 | } 62 | }, 63 | "node_modules/@esbuild/android-x64": { 64 | "version": "0.18.16", 65 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.16.tgz", 66 | "integrity": "sha512-ldsTXolyA3eTQ1//4DS+E15xl0H/3DTRJaRL0/0PgkqDsI0fV/FlOtD+h0u/AUJr+eOTlZv4aC9gvfppo3C4sw==", 67 | "cpu": [ 68 | "x64" 69 | ], 70 | "dev": true, 71 | "optional": true, 72 | "os": [ 73 | "android" 74 | ], 75 | "engines": { 76 | "node": ">=12" 77 | } 78 | }, 79 | "node_modules/@esbuild/darwin-arm64": { 80 | "version": "0.18.16", 81 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.16.tgz", 82 | "integrity": "sha512-aBxruWCII+OtluORR/KvisEw0ALuw/qDQWvkoosA+c/ngC/Kwk0lLaZ+B++LLS481/VdydB2u6tYpWxUfnLAIw==", 83 | "cpu": [ 84 | "arm64" 85 | ], 86 | "dev": true, 87 | "optional": true, 88 | "os": [ 89 | "darwin" 90 | ], 91 | "engines": { 92 | "node": ">=12" 93 | } 94 | }, 95 | "node_modules/@esbuild/darwin-x64": { 96 | "version": "0.18.16", 97 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.16.tgz", 98 | "integrity": "sha512-6w4Dbue280+rp3LnkgmriS1icOUZDyPuZo/9VsuMUTns7SYEiOaJ7Ca1cbhu9KVObAWfmdjUl4gwy9TIgiO5eA==", 99 | "cpu": [ 100 | "x64" 101 | ], 102 | "dev": true, 103 | "optional": true, 104 | "os": [ 105 | "darwin" 106 | ], 107 | "engines": { 108 | "node": ">=12" 109 | } 110 | }, 111 | "node_modules/@esbuild/freebsd-arm64": { 112 | "version": "0.18.16", 113 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.16.tgz", 114 | "integrity": "sha512-x35fCebhe9s979DGKbVAwXUOcTmCIE32AIqB9CB1GralMIvxdnMLAw5CnID17ipEw9/3MvDsusj/cspYt2ZLNQ==", 115 | "cpu": [ 116 | "arm64" 117 | ], 118 | "dev": true, 119 | "optional": true, 120 | "os": [ 121 | "freebsd" 122 | ], 123 | "engines": { 124 | "node": ">=12" 125 | } 126 | }, 127 | "node_modules/@esbuild/freebsd-x64": { 128 | "version": "0.18.16", 129 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.16.tgz", 130 | "integrity": "sha512-YM98f+PeNXF3GbxIJlUsj+McUWG1irguBHkszCIwfr3BXtXZsXo0vqybjUDFfu9a8Wr7uUD/YSmHib+EeGAFlg==", 131 | "cpu": [ 132 | "x64" 133 | ], 134 | "dev": true, 135 | "optional": true, 136 | "os": [ 137 | "freebsd" 138 | ], 139 | "engines": { 140 | "node": ">=12" 141 | } 142 | }, 143 | "node_modules/@esbuild/linux-arm": { 144 | "version": "0.18.16", 145 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.16.tgz", 146 | "integrity": "sha512-b5ABb+5Ha2C9JkeZXV+b+OruR1tJ33ePmv9ZwMeETSEKlmu/WJ45XTTG+l6a2KDsQtJJ66qo/hbSGBtk0XVLHw==", 147 | "cpu": [ 148 | "arm" 149 | ], 150 | "dev": true, 151 | "optional": true, 152 | "os": [ 153 | "linux" 154 | ], 155 | "engines": { 156 | "node": ">=12" 157 | } 158 | }, 159 | "node_modules/@esbuild/linux-arm64": { 160 | "version": "0.18.16", 161 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.16.tgz", 162 | "integrity": "sha512-XIqhNUxJiuy+zsR77+H5Z2f7s4YRlriSJKtvx99nJuG5ATuJPjmZ9n0ANgnGlPCpXGSReFpgcJ7O3SMtzIFeiQ==", 163 | "cpu": [ 164 | "arm64" 165 | ], 166 | "dev": true, 167 | "optional": true, 168 | "os": [ 169 | "linux" 170 | ], 171 | "engines": { 172 | "node": ">=12" 173 | } 174 | }, 175 | "node_modules/@esbuild/linux-ia32": { 176 | "version": "0.18.16", 177 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.16.tgz", 178 | "integrity": "sha512-no+pfEpwnRvIyH+txbBAWtjxPU9grslmTBfsmDndj7bnBmr55rOo/PfQmRfz7Qg9isswt1FP5hBbWb23fRWnow==", 179 | "cpu": [ 180 | "ia32" 181 | ], 182 | "dev": true, 183 | "optional": true, 184 | "os": [ 185 | "linux" 186 | ], 187 | "engines": { 188 | "node": ">=12" 189 | } 190 | }, 191 | "node_modules/@esbuild/linux-loong64": { 192 | "version": "0.18.16", 193 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.16.tgz", 194 | "integrity": "sha512-Zbnczs9ZXjmo0oZSS0zbNlJbcwKXa/fcNhYQjahDs4Xg18UumpXG/lwM2lcSvHS3mTrRyCYZvJbmzYc4laRI1g==", 195 | "cpu": [ 196 | "loong64" 197 | ], 198 | "dev": true, 199 | "optional": true, 200 | "os": [ 201 | "linux" 202 | ], 203 | "engines": { 204 | "node": ">=12" 205 | } 206 | }, 207 | "node_modules/@esbuild/linux-mips64el": { 208 | "version": "0.18.16", 209 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.16.tgz", 210 | "integrity": "sha512-YMF7hih1HVR/hQVa/ot4UVffc5ZlrzEb3k2ip0nZr1w6fnYypll9td2qcoMLvd3o8j3y6EbJM3MyIcXIVzXvQQ==", 211 | "cpu": [ 212 | "mips64el" 213 | ], 214 | "dev": true, 215 | "optional": true, 216 | "os": [ 217 | "linux" 218 | ], 219 | "engines": { 220 | "node": ">=12" 221 | } 222 | }, 223 | "node_modules/@esbuild/linux-ppc64": { 224 | "version": "0.18.16", 225 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.16.tgz", 226 | "integrity": "sha512-Wkz++LZ29lDwUyTSEnzDaaP5OveOgTU69q9IyIw9WqLRxM4BjTBjz9un4G6TOvehWpf/J3gYVFN96TjGHrbcNQ==", 227 | "cpu": [ 228 | "ppc64" 229 | ], 230 | "dev": true, 231 | "optional": true, 232 | "os": [ 233 | "linux" 234 | ], 235 | "engines": { 236 | "node": ">=12" 237 | } 238 | }, 239 | "node_modules/@esbuild/linux-riscv64": { 240 | "version": "0.18.16", 241 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.16.tgz", 242 | "integrity": "sha512-LFMKZ30tk78/mUv1ygvIP+568bwf4oN6reG/uczXnz6SvFn4e2QUFpUpZY9iSJT6Qpgstrhef/nMykIXZtZWGQ==", 243 | "cpu": [ 244 | "riscv64" 245 | ], 246 | "dev": true, 247 | "optional": true, 248 | "os": [ 249 | "linux" 250 | ], 251 | "engines": { 252 | "node": ">=12" 253 | } 254 | }, 255 | "node_modules/@esbuild/linux-s390x": { 256 | "version": "0.18.16", 257 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.16.tgz", 258 | "integrity": "sha512-3ZC0BgyYHYKfZo3AV2/66TD/I9tlSBaW7eWTEIkrQQKfJIifKMMttXl9FrAg+UT0SGYsCRLI35Gwdmm96vlOjg==", 259 | "cpu": [ 260 | "s390x" 261 | ], 262 | "dev": true, 263 | "optional": true, 264 | "os": [ 265 | "linux" 266 | ], 267 | "engines": { 268 | "node": ">=12" 269 | } 270 | }, 271 | "node_modules/@esbuild/linux-x64": { 272 | "version": "0.18.16", 273 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.16.tgz", 274 | "integrity": "sha512-xu86B3647DihHJHv/wx3NCz2Dg1gjQ8bbf9cVYZzWKY+gsvxYmn/lnVlqDRazObc3UMwoHpUhNYaZset4X8IPA==", 275 | "cpu": [ 276 | "x64" 277 | ], 278 | "dev": true, 279 | "optional": true, 280 | "os": [ 281 | "linux" 282 | ], 283 | "engines": { 284 | "node": ">=12" 285 | } 286 | }, 287 | "node_modules/@esbuild/netbsd-x64": { 288 | "version": "0.18.16", 289 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.16.tgz", 290 | "integrity": "sha512-uVAgpimx9Ffw3xowtg/7qQPwHFx94yCje+DoBx+LNm2ePDpQXHrzE+Sb0Si2VBObYz+LcRps15cq+95YM7gkUw==", 291 | "cpu": [ 292 | "x64" 293 | ], 294 | "dev": true, 295 | "optional": true, 296 | "os": [ 297 | "netbsd" 298 | ], 299 | "engines": { 300 | "node": ">=12" 301 | } 302 | }, 303 | "node_modules/@esbuild/openbsd-x64": { 304 | "version": "0.18.16", 305 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.16.tgz", 306 | "integrity": "sha512-6OjCQM9wf7z8/MBi6BOWaTL2AS/SZudsZtBziXMtNI8r/U41AxS9x7jn0ATOwVy08OotwkPqGRMkpPR2wcTJXA==", 307 | "cpu": [ 308 | "x64" 309 | ], 310 | "dev": true, 311 | "optional": true, 312 | "os": [ 313 | "openbsd" 314 | ], 315 | "engines": { 316 | "node": ">=12" 317 | } 318 | }, 319 | "node_modules/@esbuild/sunos-x64": { 320 | "version": "0.18.16", 321 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.16.tgz", 322 | "integrity": "sha512-ZoNkruFYJp9d1LbUYCh8awgQDvB9uOMZqlQ+gGEZR7v6C+N6u7vPr86c+Chih8niBR81Q/bHOSKGBK3brJyvkQ==", 323 | "cpu": [ 324 | "x64" 325 | ], 326 | "dev": true, 327 | "optional": true, 328 | "os": [ 329 | "sunos" 330 | ], 331 | "engines": { 332 | "node": ">=12" 333 | } 334 | }, 335 | "node_modules/@esbuild/win32-arm64": { 336 | "version": "0.18.16", 337 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.16.tgz", 338 | "integrity": "sha512-+j4anzQ9hrs+iqO+/wa8UE6TVkKua1pXUb0XWFOx0FiAj6R9INJ+WE//1/Xo6FG1vB5EpH3ko+XcgwiDXTxcdw==", 339 | "cpu": [ 340 | "arm64" 341 | ], 342 | "dev": true, 343 | "optional": true, 344 | "os": [ 345 | "win32" 346 | ], 347 | "engines": { 348 | "node": ">=12" 349 | } 350 | }, 351 | "node_modules/@esbuild/win32-ia32": { 352 | "version": "0.18.16", 353 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.16.tgz", 354 | "integrity": "sha512-5PFPmq3sSKTp9cT9dzvI67WNfRZGvEVctcZa1KGjDDu4n3H8k59Inbk0du1fz0KrAbKKNpJbdFXQMDUz7BG4rQ==", 355 | "cpu": [ 356 | "ia32" 357 | ], 358 | "dev": true, 359 | "optional": true, 360 | "os": [ 361 | "win32" 362 | ], 363 | "engines": { 364 | "node": ">=12" 365 | } 366 | }, 367 | "node_modules/@esbuild/win32-x64": { 368 | "version": "0.18.16", 369 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz", 370 | "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==", 371 | "cpu": [ 372 | "x64" 373 | ], 374 | "dev": true, 375 | "optional": true, 376 | "os": [ 377 | "win32" 378 | ], 379 | "engines": { 380 | "node": ">=12" 381 | } 382 | }, 383 | "node_modules/@jridgewell/sourcemap-codec": { 384 | "version": "1.4.15", 385 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 386 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 387 | }, 388 | "node_modules/@vitejs/plugin-vue": { 389 | "version": "4.2.3", 390 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", 391 | "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", 392 | "dev": true, 393 | "engines": { 394 | "node": "^14.18.0 || >=16.0.0" 395 | }, 396 | "peerDependencies": { 397 | "vite": "^4.0.0", 398 | "vue": "^3.2.25" 399 | } 400 | }, 401 | "node_modules/@volar/language-core": { 402 | "version": "1.9.1", 403 | "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.9.1.tgz", 404 | "integrity": "sha512-FlllCDE0HdUYh66zS1S4u8WobqKFStOwkd3OCXCOhPmalfm4Fte3gHNXzqs+R8VlbjK7ZvBxrG9MSiaRGXZygg==", 405 | "dev": true, 406 | "dependencies": { 407 | "@volar/source-map": "1.9.1" 408 | } 409 | }, 410 | "node_modules/@volar/source-map": { 411 | "version": "1.9.1", 412 | "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.9.1.tgz", 413 | "integrity": "sha512-KIttDVrbr3ACLzEP891uj+XdVaCnNErFNRGjNQio+gW2a9fDdz407usAJu6DHgIkJU1l18HyOxMU2VX1l2+D5g==", 414 | "dev": true, 415 | "dependencies": { 416 | "muggle-string": "^0.3.1" 417 | } 418 | }, 419 | "node_modules/@volar/typescript": { 420 | "version": "1.9.1", 421 | "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.9.1.tgz", 422 | "integrity": "sha512-UO8bhflYMNuOpXeGYHSm3xItU4kEVhJQNGjwgw1ZqLr/sm1C7Y+pVQ/S01NpsojhFC8S+P6/p+jOTK6DO214kQ==", 423 | "dev": true, 424 | "dependencies": { 425 | "@volar/language-core": "1.9.1" 426 | } 427 | }, 428 | "node_modules/@vue/compiler-core": { 429 | "version": "3.3.4", 430 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", 431 | "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", 432 | "dependencies": { 433 | "@babel/parser": "^7.21.3", 434 | "@vue/shared": "3.3.4", 435 | "estree-walker": "^2.0.2", 436 | "source-map-js": "^1.0.2" 437 | } 438 | }, 439 | "node_modules/@vue/compiler-dom": { 440 | "version": "3.3.4", 441 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", 442 | "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", 443 | "dependencies": { 444 | "@vue/compiler-core": "3.3.4", 445 | "@vue/shared": "3.3.4" 446 | } 447 | }, 448 | "node_modules/@vue/compiler-sfc": { 449 | "version": "3.3.4", 450 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", 451 | "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", 452 | "dependencies": { 453 | "@babel/parser": "^7.20.15", 454 | "@vue/compiler-core": "3.3.4", 455 | "@vue/compiler-dom": "3.3.4", 456 | "@vue/compiler-ssr": "3.3.4", 457 | "@vue/reactivity-transform": "3.3.4", 458 | "@vue/shared": "3.3.4", 459 | "estree-walker": "^2.0.2", 460 | "magic-string": "^0.30.0", 461 | "postcss": "^8.1.10", 462 | "source-map-js": "^1.0.2" 463 | } 464 | }, 465 | "node_modules/@vue/compiler-ssr": { 466 | "version": "3.3.4", 467 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", 468 | "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", 469 | "dependencies": { 470 | "@vue/compiler-dom": "3.3.4", 471 | "@vue/shared": "3.3.4" 472 | } 473 | }, 474 | "node_modules/@vue/language-core": { 475 | "version": "1.8.6", 476 | "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.6.tgz", 477 | "integrity": "sha512-PyYDMArbR7hnhqw9OEupr0s4ut0/ZfITp7WEjigF58cd2R0lRLNM1HPvzFMuULpy3ImBEOZI11KRIDirqOe+tQ==", 478 | "dev": true, 479 | "dependencies": { 480 | "@volar/language-core": "~1.9.0", 481 | "@volar/source-map": "~1.9.0", 482 | "@vue/compiler-dom": "^3.3.0", 483 | "@vue/reactivity": "^3.3.0", 484 | "@vue/shared": "^3.3.0", 485 | "minimatch": "^9.0.0", 486 | "muggle-string": "^0.3.1", 487 | "vue-template-compiler": "^2.7.14" 488 | }, 489 | "peerDependencies": { 490 | "typescript": "*" 491 | }, 492 | "peerDependenciesMeta": { 493 | "typescript": { 494 | "optional": true 495 | } 496 | } 497 | }, 498 | "node_modules/@vue/reactivity": { 499 | "version": "3.3.4", 500 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", 501 | "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", 502 | "dependencies": { 503 | "@vue/shared": "3.3.4" 504 | } 505 | }, 506 | "node_modules/@vue/reactivity-transform": { 507 | "version": "3.3.4", 508 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", 509 | "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", 510 | "dependencies": { 511 | "@babel/parser": "^7.20.15", 512 | "@vue/compiler-core": "3.3.4", 513 | "@vue/shared": "3.3.4", 514 | "estree-walker": "^2.0.2", 515 | "magic-string": "^0.30.0" 516 | } 517 | }, 518 | "node_modules/@vue/runtime-core": { 519 | "version": "3.3.4", 520 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", 521 | "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", 522 | "dependencies": { 523 | "@vue/reactivity": "3.3.4", 524 | "@vue/shared": "3.3.4" 525 | } 526 | }, 527 | "node_modules/@vue/runtime-dom": { 528 | "version": "3.3.4", 529 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", 530 | "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", 531 | "dependencies": { 532 | "@vue/runtime-core": "3.3.4", 533 | "@vue/shared": "3.3.4", 534 | "csstype": "^3.1.1" 535 | } 536 | }, 537 | "node_modules/@vue/server-renderer": { 538 | "version": "3.3.4", 539 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", 540 | "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", 541 | "dependencies": { 542 | "@vue/compiler-ssr": "3.3.4", 543 | "@vue/shared": "3.3.4" 544 | }, 545 | "peerDependencies": { 546 | "vue": "3.3.4" 547 | } 548 | }, 549 | "node_modules/@vue/shared": { 550 | "version": "3.3.4", 551 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", 552 | "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" 553 | }, 554 | "node_modules/@vue/typescript": { 555 | "version": "1.8.6", 556 | "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.6.tgz", 557 | "integrity": "sha512-sDQ5tltrSVS3lAkE3JtMRGJo91CLIxcWPy7yms/DT+ssxXpwxbVRD5Gok68HenEZBA4Klq7nW99sG/nTRnpPuQ==", 558 | "dev": true, 559 | "dependencies": { 560 | "@volar/typescript": "~1.9.0", 561 | "@vue/language-core": "1.8.6" 562 | } 563 | }, 564 | "node_modules/balanced-match": { 565 | "version": "1.0.2", 566 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 567 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 568 | "dev": true 569 | }, 570 | "node_modules/brace-expansion": { 571 | "version": "2.0.1", 572 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 573 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 574 | "dev": true, 575 | "dependencies": { 576 | "balanced-match": "^1.0.0" 577 | } 578 | }, 579 | "node_modules/csstype": { 580 | "version": "3.1.2", 581 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", 582 | "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" 583 | }, 584 | "node_modules/de-indent": { 585 | "version": "1.0.2", 586 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", 587 | "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", 588 | "dev": true 589 | }, 590 | "node_modules/esbuild": { 591 | "version": "0.18.16", 592 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.16.tgz", 593 | "integrity": "sha512-1xLsOXrDqwdHxyXb/x/SOyg59jpf/SH7YMvU5RNSU7z3TInaASNJWNFJ6iRvLvLETZMasF3d1DdZLg7sgRimRQ==", 594 | "dev": true, 595 | "hasInstallScript": true, 596 | "bin": { 597 | "esbuild": "bin/esbuild" 598 | }, 599 | "engines": { 600 | "node": ">=12" 601 | }, 602 | "optionalDependencies": { 603 | "@esbuild/android-arm": "0.18.16", 604 | "@esbuild/android-arm64": "0.18.16", 605 | "@esbuild/android-x64": "0.18.16", 606 | "@esbuild/darwin-arm64": "0.18.16", 607 | "@esbuild/darwin-x64": "0.18.16", 608 | "@esbuild/freebsd-arm64": "0.18.16", 609 | "@esbuild/freebsd-x64": "0.18.16", 610 | "@esbuild/linux-arm": "0.18.16", 611 | "@esbuild/linux-arm64": "0.18.16", 612 | "@esbuild/linux-ia32": "0.18.16", 613 | "@esbuild/linux-loong64": "0.18.16", 614 | "@esbuild/linux-mips64el": "0.18.16", 615 | "@esbuild/linux-ppc64": "0.18.16", 616 | "@esbuild/linux-riscv64": "0.18.16", 617 | "@esbuild/linux-s390x": "0.18.16", 618 | "@esbuild/linux-x64": "0.18.16", 619 | "@esbuild/netbsd-x64": "0.18.16", 620 | "@esbuild/openbsd-x64": "0.18.16", 621 | "@esbuild/sunos-x64": "0.18.16", 622 | "@esbuild/win32-arm64": "0.18.16", 623 | "@esbuild/win32-ia32": "0.18.16", 624 | "@esbuild/win32-x64": "0.18.16" 625 | } 626 | }, 627 | "node_modules/estree-walker": { 628 | "version": "2.0.2", 629 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 630 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 631 | }, 632 | "node_modules/fsevents": { 633 | "version": "2.3.2", 634 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 635 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 636 | "dev": true, 637 | "hasInstallScript": true, 638 | "optional": true, 639 | "os": [ 640 | "darwin" 641 | ], 642 | "engines": { 643 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 644 | } 645 | }, 646 | "node_modules/he": { 647 | "version": "1.2.0", 648 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 649 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 650 | "dev": true, 651 | "bin": { 652 | "he": "bin/he" 653 | } 654 | }, 655 | "node_modules/lru-cache": { 656 | "version": "6.0.0", 657 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 658 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 659 | "dev": true, 660 | "dependencies": { 661 | "yallist": "^4.0.0" 662 | }, 663 | "engines": { 664 | "node": ">=10" 665 | } 666 | }, 667 | "node_modules/magic-string": { 668 | "version": "0.30.1", 669 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", 670 | "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", 671 | "dependencies": { 672 | "@jridgewell/sourcemap-codec": "^1.4.15" 673 | }, 674 | "engines": { 675 | "node": ">=12" 676 | } 677 | }, 678 | "node_modules/minimatch": { 679 | "version": "9.0.3", 680 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", 681 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 682 | "dev": true, 683 | "dependencies": { 684 | "brace-expansion": "^2.0.1" 685 | }, 686 | "engines": { 687 | "node": ">=16 || 14 >=14.17" 688 | }, 689 | "funding": { 690 | "url": "https://github.com/sponsors/isaacs" 691 | } 692 | }, 693 | "node_modules/muggle-string": { 694 | "version": "0.3.1", 695 | "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", 696 | "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", 697 | "dev": true 698 | }, 699 | "node_modules/nanoid": { 700 | "version": "3.3.6", 701 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 702 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 703 | "funding": [ 704 | { 705 | "type": "github", 706 | "url": "https://github.com/sponsors/ai" 707 | } 708 | ], 709 | "bin": { 710 | "nanoid": "bin/nanoid.cjs" 711 | }, 712 | "engines": { 713 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 714 | } 715 | }, 716 | "node_modules/picocolors": { 717 | "version": "1.0.0", 718 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 719 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 720 | }, 721 | "node_modules/postcss": { 722 | "version": "8.4.27", 723 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", 724 | "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", 725 | "funding": [ 726 | { 727 | "type": "opencollective", 728 | "url": "https://opencollective.com/postcss/" 729 | }, 730 | { 731 | "type": "tidelift", 732 | "url": "https://tidelift.com/funding/github/npm/postcss" 733 | }, 734 | { 735 | "type": "github", 736 | "url": "https://github.com/sponsors/ai" 737 | } 738 | ], 739 | "dependencies": { 740 | "nanoid": "^3.3.6", 741 | "picocolors": "^1.0.0", 742 | "source-map-js": "^1.0.2" 743 | }, 744 | "engines": { 745 | "node": "^10 || ^12 || >=14" 746 | } 747 | }, 748 | "node_modules/rollup": { 749 | "version": "3.26.3", 750 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", 751 | "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", 752 | "dev": true, 753 | "bin": { 754 | "rollup": "dist/bin/rollup" 755 | }, 756 | "engines": { 757 | "node": ">=14.18.0", 758 | "npm": ">=8.0.0" 759 | }, 760 | "optionalDependencies": { 761 | "fsevents": "~2.3.2" 762 | } 763 | }, 764 | "node_modules/semver": { 765 | "version": "7.5.4", 766 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 767 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 768 | "dev": true, 769 | "dependencies": { 770 | "lru-cache": "^6.0.0" 771 | }, 772 | "bin": { 773 | "semver": "bin/semver.js" 774 | }, 775 | "engines": { 776 | "node": ">=10" 777 | } 778 | }, 779 | "node_modules/source-map-js": { 780 | "version": "1.0.2", 781 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 782 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 783 | "engines": { 784 | "node": ">=0.10.0" 785 | } 786 | }, 787 | "node_modules/typescript": { 788 | "version": "5.1.6", 789 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", 790 | "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", 791 | "dev": true, 792 | "bin": { 793 | "tsc": "bin/tsc", 794 | "tsserver": "bin/tsserver" 795 | }, 796 | "engines": { 797 | "node": ">=14.17" 798 | } 799 | }, 800 | "node_modules/vite": { 801 | "version": "4.4.6", 802 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.6.tgz", 803 | "integrity": "sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==", 804 | "dev": true, 805 | "dependencies": { 806 | "esbuild": "^0.18.10", 807 | "postcss": "^8.4.26", 808 | "rollup": "^3.25.2" 809 | }, 810 | "bin": { 811 | "vite": "bin/vite.js" 812 | }, 813 | "engines": { 814 | "node": "^14.18.0 || >=16.0.0" 815 | }, 816 | "funding": { 817 | "url": "https://github.com/vitejs/vite?sponsor=1" 818 | }, 819 | "optionalDependencies": { 820 | "fsevents": "~2.3.2" 821 | }, 822 | "peerDependencies": { 823 | "@types/node": ">= 14", 824 | "less": "*", 825 | "lightningcss": "^1.21.0", 826 | "sass": "*", 827 | "stylus": "*", 828 | "sugarss": "*", 829 | "terser": "^5.4.0" 830 | }, 831 | "peerDependenciesMeta": { 832 | "@types/node": { 833 | "optional": true 834 | }, 835 | "less": { 836 | "optional": true 837 | }, 838 | "lightningcss": { 839 | "optional": true 840 | }, 841 | "sass": { 842 | "optional": true 843 | }, 844 | "stylus": { 845 | "optional": true 846 | }, 847 | "sugarss": { 848 | "optional": true 849 | }, 850 | "terser": { 851 | "optional": true 852 | } 853 | } 854 | }, 855 | "node_modules/vue": { 856 | "version": "3.3.4", 857 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", 858 | "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", 859 | "dependencies": { 860 | "@vue/compiler-dom": "3.3.4", 861 | "@vue/compiler-sfc": "3.3.4", 862 | "@vue/runtime-dom": "3.3.4", 863 | "@vue/server-renderer": "3.3.4", 864 | "@vue/shared": "3.3.4" 865 | } 866 | }, 867 | "node_modules/vue-template-compiler": { 868 | "version": "2.7.14", 869 | "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", 870 | "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", 871 | "dev": true, 872 | "dependencies": { 873 | "de-indent": "^1.0.2", 874 | "he": "^1.2.0" 875 | } 876 | }, 877 | "node_modules/vue-tsc": { 878 | "version": "1.8.6", 879 | "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.6.tgz", 880 | "integrity": "sha512-8ffD4NGfwyATjw/s40Lw2EgB7L2/PAqnGlJBaVQLgblr3SU4EYdhJ67TNXXuDD8NMbDAFSM24V8i3ZIJgTs32Q==", 881 | "dev": true, 882 | "dependencies": { 883 | "@vue/language-core": "1.8.6", 884 | "@vue/typescript": "1.8.6", 885 | "semver": "^7.3.8" 886 | }, 887 | "bin": { 888 | "vue-tsc": "bin/vue-tsc.js" 889 | }, 890 | "peerDependencies": { 891 | "typescript": "*" 892 | } 893 | }, 894 | "node_modules/yallist": { 895 | "version": "4.0.0", 896 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 897 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 898 | "dev": true 899 | } 900 | }, 901 | "dependencies": { 902 | "@babel/parser": { 903 | "version": "7.22.7", 904 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", 905 | "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==" 906 | }, 907 | "@esbuild/android-arm": { 908 | "version": "0.18.16", 909 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz", 910 | "integrity": "sha512-gCHjjQmA8L0soklKbLKA6pgsLk1byULuHe94lkZDzcO3/Ta+bbeewJioEn1Fr7kgy9NWNFy/C+MrBwC6I/WCug==", 911 | "dev": true, 912 | "optional": true 913 | }, 914 | "@esbuild/android-arm64": { 915 | "version": "0.18.16", 916 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.16.tgz", 917 | "integrity": "sha512-wsCqSPqLz+6Ov+OM4EthU43DyYVVyfn15S4j1bJzylDpc1r1jZFFfJQNfDuT8SlgwuqpmpJXK4uPlHGw6ve7eA==", 918 | "dev": true, 919 | "optional": true 920 | }, 921 | "@esbuild/android-x64": { 922 | "version": "0.18.16", 923 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.16.tgz", 924 | "integrity": "sha512-ldsTXolyA3eTQ1//4DS+E15xl0H/3DTRJaRL0/0PgkqDsI0fV/FlOtD+h0u/AUJr+eOTlZv4aC9gvfppo3C4sw==", 925 | "dev": true, 926 | "optional": true 927 | }, 928 | "@esbuild/darwin-arm64": { 929 | "version": "0.18.16", 930 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.16.tgz", 931 | "integrity": "sha512-aBxruWCII+OtluORR/KvisEw0ALuw/qDQWvkoosA+c/ngC/Kwk0lLaZ+B++LLS481/VdydB2u6tYpWxUfnLAIw==", 932 | "dev": true, 933 | "optional": true 934 | }, 935 | "@esbuild/darwin-x64": { 936 | "version": "0.18.16", 937 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.16.tgz", 938 | "integrity": "sha512-6w4Dbue280+rp3LnkgmriS1icOUZDyPuZo/9VsuMUTns7SYEiOaJ7Ca1cbhu9KVObAWfmdjUl4gwy9TIgiO5eA==", 939 | "dev": true, 940 | "optional": true 941 | }, 942 | "@esbuild/freebsd-arm64": { 943 | "version": "0.18.16", 944 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.16.tgz", 945 | "integrity": "sha512-x35fCebhe9s979DGKbVAwXUOcTmCIE32AIqB9CB1GralMIvxdnMLAw5CnID17ipEw9/3MvDsusj/cspYt2ZLNQ==", 946 | "dev": true, 947 | "optional": true 948 | }, 949 | "@esbuild/freebsd-x64": { 950 | "version": "0.18.16", 951 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.16.tgz", 952 | "integrity": "sha512-YM98f+PeNXF3GbxIJlUsj+McUWG1irguBHkszCIwfr3BXtXZsXo0vqybjUDFfu9a8Wr7uUD/YSmHib+EeGAFlg==", 953 | "dev": true, 954 | "optional": true 955 | }, 956 | "@esbuild/linux-arm": { 957 | "version": "0.18.16", 958 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.16.tgz", 959 | "integrity": "sha512-b5ABb+5Ha2C9JkeZXV+b+OruR1tJ33ePmv9ZwMeETSEKlmu/WJ45XTTG+l6a2KDsQtJJ66qo/hbSGBtk0XVLHw==", 960 | "dev": true, 961 | "optional": true 962 | }, 963 | "@esbuild/linux-arm64": { 964 | "version": "0.18.16", 965 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.16.tgz", 966 | "integrity": "sha512-XIqhNUxJiuy+zsR77+H5Z2f7s4YRlriSJKtvx99nJuG5ATuJPjmZ9n0ANgnGlPCpXGSReFpgcJ7O3SMtzIFeiQ==", 967 | "dev": true, 968 | "optional": true 969 | }, 970 | "@esbuild/linux-ia32": { 971 | "version": "0.18.16", 972 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.16.tgz", 973 | "integrity": "sha512-no+pfEpwnRvIyH+txbBAWtjxPU9grslmTBfsmDndj7bnBmr55rOo/PfQmRfz7Qg9isswt1FP5hBbWb23fRWnow==", 974 | "dev": true, 975 | "optional": true 976 | }, 977 | "@esbuild/linux-loong64": { 978 | "version": "0.18.16", 979 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.16.tgz", 980 | "integrity": "sha512-Zbnczs9ZXjmo0oZSS0zbNlJbcwKXa/fcNhYQjahDs4Xg18UumpXG/lwM2lcSvHS3mTrRyCYZvJbmzYc4laRI1g==", 981 | "dev": true, 982 | "optional": true 983 | }, 984 | "@esbuild/linux-mips64el": { 985 | "version": "0.18.16", 986 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.16.tgz", 987 | "integrity": "sha512-YMF7hih1HVR/hQVa/ot4UVffc5ZlrzEb3k2ip0nZr1w6fnYypll9td2qcoMLvd3o8j3y6EbJM3MyIcXIVzXvQQ==", 988 | "dev": true, 989 | "optional": true 990 | }, 991 | "@esbuild/linux-ppc64": { 992 | "version": "0.18.16", 993 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.16.tgz", 994 | "integrity": "sha512-Wkz++LZ29lDwUyTSEnzDaaP5OveOgTU69q9IyIw9WqLRxM4BjTBjz9un4G6TOvehWpf/J3gYVFN96TjGHrbcNQ==", 995 | "dev": true, 996 | "optional": true 997 | }, 998 | "@esbuild/linux-riscv64": { 999 | "version": "0.18.16", 1000 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.16.tgz", 1001 | "integrity": "sha512-LFMKZ30tk78/mUv1ygvIP+568bwf4oN6reG/uczXnz6SvFn4e2QUFpUpZY9iSJT6Qpgstrhef/nMykIXZtZWGQ==", 1002 | "dev": true, 1003 | "optional": true 1004 | }, 1005 | "@esbuild/linux-s390x": { 1006 | "version": "0.18.16", 1007 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.16.tgz", 1008 | "integrity": "sha512-3ZC0BgyYHYKfZo3AV2/66TD/I9tlSBaW7eWTEIkrQQKfJIifKMMttXl9FrAg+UT0SGYsCRLI35Gwdmm96vlOjg==", 1009 | "dev": true, 1010 | "optional": true 1011 | }, 1012 | "@esbuild/linux-x64": { 1013 | "version": "0.18.16", 1014 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.16.tgz", 1015 | "integrity": "sha512-xu86B3647DihHJHv/wx3NCz2Dg1gjQ8bbf9cVYZzWKY+gsvxYmn/lnVlqDRazObc3UMwoHpUhNYaZset4X8IPA==", 1016 | "dev": true, 1017 | "optional": true 1018 | }, 1019 | "@esbuild/netbsd-x64": { 1020 | "version": "0.18.16", 1021 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.16.tgz", 1022 | "integrity": "sha512-uVAgpimx9Ffw3xowtg/7qQPwHFx94yCje+DoBx+LNm2ePDpQXHrzE+Sb0Si2VBObYz+LcRps15cq+95YM7gkUw==", 1023 | "dev": true, 1024 | "optional": true 1025 | }, 1026 | "@esbuild/openbsd-x64": { 1027 | "version": "0.18.16", 1028 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.16.tgz", 1029 | "integrity": "sha512-6OjCQM9wf7z8/MBi6BOWaTL2AS/SZudsZtBziXMtNI8r/U41AxS9x7jn0ATOwVy08OotwkPqGRMkpPR2wcTJXA==", 1030 | "dev": true, 1031 | "optional": true 1032 | }, 1033 | "@esbuild/sunos-x64": { 1034 | "version": "0.18.16", 1035 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.16.tgz", 1036 | "integrity": "sha512-ZoNkruFYJp9d1LbUYCh8awgQDvB9uOMZqlQ+gGEZR7v6C+N6u7vPr86c+Chih8niBR81Q/bHOSKGBK3brJyvkQ==", 1037 | "dev": true, 1038 | "optional": true 1039 | }, 1040 | "@esbuild/win32-arm64": { 1041 | "version": "0.18.16", 1042 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.16.tgz", 1043 | "integrity": "sha512-+j4anzQ9hrs+iqO+/wa8UE6TVkKua1pXUb0XWFOx0FiAj6R9INJ+WE//1/Xo6FG1vB5EpH3ko+XcgwiDXTxcdw==", 1044 | "dev": true, 1045 | "optional": true 1046 | }, 1047 | "@esbuild/win32-ia32": { 1048 | "version": "0.18.16", 1049 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.16.tgz", 1050 | "integrity": "sha512-5PFPmq3sSKTp9cT9dzvI67WNfRZGvEVctcZa1KGjDDu4n3H8k59Inbk0du1fz0KrAbKKNpJbdFXQMDUz7BG4rQ==", 1051 | "dev": true, 1052 | "optional": true 1053 | }, 1054 | "@esbuild/win32-x64": { 1055 | "version": "0.18.16", 1056 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz", 1057 | "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==", 1058 | "dev": true, 1059 | "optional": true 1060 | }, 1061 | "@jridgewell/sourcemap-codec": { 1062 | "version": "1.4.15", 1063 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 1064 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 1065 | }, 1066 | "@vitejs/plugin-vue": { 1067 | "version": "4.2.3", 1068 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", 1069 | "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", 1070 | "dev": true, 1071 | "requires": {} 1072 | }, 1073 | "@volar/language-core": { 1074 | "version": "1.9.1", 1075 | "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.9.1.tgz", 1076 | "integrity": "sha512-FlllCDE0HdUYh66zS1S4u8WobqKFStOwkd3OCXCOhPmalfm4Fte3gHNXzqs+R8VlbjK7ZvBxrG9MSiaRGXZygg==", 1077 | "dev": true, 1078 | "requires": { 1079 | "@volar/source-map": "1.9.1" 1080 | } 1081 | }, 1082 | "@volar/source-map": { 1083 | "version": "1.9.1", 1084 | "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.9.1.tgz", 1085 | "integrity": "sha512-KIttDVrbr3ACLzEP891uj+XdVaCnNErFNRGjNQio+gW2a9fDdz407usAJu6DHgIkJU1l18HyOxMU2VX1l2+D5g==", 1086 | "dev": true, 1087 | "requires": { 1088 | "muggle-string": "^0.3.1" 1089 | } 1090 | }, 1091 | "@volar/typescript": { 1092 | "version": "1.9.1", 1093 | "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.9.1.tgz", 1094 | "integrity": "sha512-UO8bhflYMNuOpXeGYHSm3xItU4kEVhJQNGjwgw1ZqLr/sm1C7Y+pVQ/S01NpsojhFC8S+P6/p+jOTK6DO214kQ==", 1095 | "dev": true, 1096 | "requires": { 1097 | "@volar/language-core": "1.9.1" 1098 | } 1099 | }, 1100 | "@vue/compiler-core": { 1101 | "version": "3.3.4", 1102 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", 1103 | "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", 1104 | "requires": { 1105 | "@babel/parser": "^7.21.3", 1106 | "@vue/shared": "3.3.4", 1107 | "estree-walker": "^2.0.2", 1108 | "source-map-js": "^1.0.2" 1109 | } 1110 | }, 1111 | "@vue/compiler-dom": { 1112 | "version": "3.3.4", 1113 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", 1114 | "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", 1115 | "requires": { 1116 | "@vue/compiler-core": "3.3.4", 1117 | "@vue/shared": "3.3.4" 1118 | } 1119 | }, 1120 | "@vue/compiler-sfc": { 1121 | "version": "3.3.4", 1122 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", 1123 | "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", 1124 | "requires": { 1125 | "@babel/parser": "^7.20.15", 1126 | "@vue/compiler-core": "3.3.4", 1127 | "@vue/compiler-dom": "3.3.4", 1128 | "@vue/compiler-ssr": "3.3.4", 1129 | "@vue/reactivity-transform": "3.3.4", 1130 | "@vue/shared": "3.3.4", 1131 | "estree-walker": "^2.0.2", 1132 | "magic-string": "^0.30.0", 1133 | "postcss": "^8.1.10", 1134 | "source-map-js": "^1.0.2" 1135 | } 1136 | }, 1137 | "@vue/compiler-ssr": { 1138 | "version": "3.3.4", 1139 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", 1140 | "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", 1141 | "requires": { 1142 | "@vue/compiler-dom": "3.3.4", 1143 | "@vue/shared": "3.3.4" 1144 | } 1145 | }, 1146 | "@vue/language-core": { 1147 | "version": "1.8.6", 1148 | "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.6.tgz", 1149 | "integrity": "sha512-PyYDMArbR7hnhqw9OEupr0s4ut0/ZfITp7WEjigF58cd2R0lRLNM1HPvzFMuULpy3ImBEOZI11KRIDirqOe+tQ==", 1150 | "dev": true, 1151 | "requires": { 1152 | "@volar/language-core": "~1.9.0", 1153 | "@volar/source-map": "~1.9.0", 1154 | "@vue/compiler-dom": "^3.3.0", 1155 | "@vue/reactivity": "^3.3.0", 1156 | "@vue/shared": "^3.3.0", 1157 | "minimatch": "^9.0.0", 1158 | "muggle-string": "^0.3.1", 1159 | "vue-template-compiler": "^2.7.14" 1160 | } 1161 | }, 1162 | "@vue/reactivity": { 1163 | "version": "3.3.4", 1164 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", 1165 | "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", 1166 | "requires": { 1167 | "@vue/shared": "3.3.4" 1168 | } 1169 | }, 1170 | "@vue/reactivity-transform": { 1171 | "version": "3.3.4", 1172 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", 1173 | "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", 1174 | "requires": { 1175 | "@babel/parser": "^7.20.15", 1176 | "@vue/compiler-core": "3.3.4", 1177 | "@vue/shared": "3.3.4", 1178 | "estree-walker": "^2.0.2", 1179 | "magic-string": "^0.30.0" 1180 | } 1181 | }, 1182 | "@vue/runtime-core": { 1183 | "version": "3.3.4", 1184 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", 1185 | "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", 1186 | "requires": { 1187 | "@vue/reactivity": "3.3.4", 1188 | "@vue/shared": "3.3.4" 1189 | } 1190 | }, 1191 | "@vue/runtime-dom": { 1192 | "version": "3.3.4", 1193 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", 1194 | "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", 1195 | "requires": { 1196 | "@vue/runtime-core": "3.3.4", 1197 | "@vue/shared": "3.3.4", 1198 | "csstype": "^3.1.1" 1199 | } 1200 | }, 1201 | "@vue/server-renderer": { 1202 | "version": "3.3.4", 1203 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", 1204 | "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", 1205 | "requires": { 1206 | "@vue/compiler-ssr": "3.3.4", 1207 | "@vue/shared": "3.3.4" 1208 | } 1209 | }, 1210 | "@vue/shared": { 1211 | "version": "3.3.4", 1212 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", 1213 | "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" 1214 | }, 1215 | "@vue/typescript": { 1216 | "version": "1.8.6", 1217 | "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.6.tgz", 1218 | "integrity": "sha512-sDQ5tltrSVS3lAkE3JtMRGJo91CLIxcWPy7yms/DT+ssxXpwxbVRD5Gok68HenEZBA4Klq7nW99sG/nTRnpPuQ==", 1219 | "dev": true, 1220 | "requires": { 1221 | "@volar/typescript": "~1.9.0", 1222 | "@vue/language-core": "1.8.6" 1223 | } 1224 | }, 1225 | "balanced-match": { 1226 | "version": "1.0.2", 1227 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1228 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1229 | "dev": true 1230 | }, 1231 | "brace-expansion": { 1232 | "version": "2.0.1", 1233 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1234 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1235 | "dev": true, 1236 | "requires": { 1237 | "balanced-match": "^1.0.0" 1238 | } 1239 | }, 1240 | "csstype": { 1241 | "version": "3.1.2", 1242 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", 1243 | "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" 1244 | }, 1245 | "de-indent": { 1246 | "version": "1.0.2", 1247 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", 1248 | "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", 1249 | "dev": true 1250 | }, 1251 | "esbuild": { 1252 | "version": "0.18.16", 1253 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.16.tgz", 1254 | "integrity": "sha512-1xLsOXrDqwdHxyXb/x/SOyg59jpf/SH7YMvU5RNSU7z3TInaASNJWNFJ6iRvLvLETZMasF3d1DdZLg7sgRimRQ==", 1255 | "dev": true, 1256 | "requires": { 1257 | "@esbuild/android-arm": "0.18.16", 1258 | "@esbuild/android-arm64": "0.18.16", 1259 | "@esbuild/android-x64": "0.18.16", 1260 | "@esbuild/darwin-arm64": "0.18.16", 1261 | "@esbuild/darwin-x64": "0.18.16", 1262 | "@esbuild/freebsd-arm64": "0.18.16", 1263 | "@esbuild/freebsd-x64": "0.18.16", 1264 | "@esbuild/linux-arm": "0.18.16", 1265 | "@esbuild/linux-arm64": "0.18.16", 1266 | "@esbuild/linux-ia32": "0.18.16", 1267 | "@esbuild/linux-loong64": "0.18.16", 1268 | "@esbuild/linux-mips64el": "0.18.16", 1269 | "@esbuild/linux-ppc64": "0.18.16", 1270 | "@esbuild/linux-riscv64": "0.18.16", 1271 | "@esbuild/linux-s390x": "0.18.16", 1272 | "@esbuild/linux-x64": "0.18.16", 1273 | "@esbuild/netbsd-x64": "0.18.16", 1274 | "@esbuild/openbsd-x64": "0.18.16", 1275 | "@esbuild/sunos-x64": "0.18.16", 1276 | "@esbuild/win32-arm64": "0.18.16", 1277 | "@esbuild/win32-ia32": "0.18.16", 1278 | "@esbuild/win32-x64": "0.18.16" 1279 | } 1280 | }, 1281 | "estree-walker": { 1282 | "version": "2.0.2", 1283 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1284 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 1285 | }, 1286 | "fsevents": { 1287 | "version": "2.3.2", 1288 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1289 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1290 | "dev": true, 1291 | "optional": true 1292 | }, 1293 | "he": { 1294 | "version": "1.2.0", 1295 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1296 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1297 | "dev": true 1298 | }, 1299 | "lru-cache": { 1300 | "version": "6.0.0", 1301 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1302 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1303 | "dev": true, 1304 | "requires": { 1305 | "yallist": "^4.0.0" 1306 | } 1307 | }, 1308 | "magic-string": { 1309 | "version": "0.30.1", 1310 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", 1311 | "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", 1312 | "requires": { 1313 | "@jridgewell/sourcemap-codec": "^1.4.15" 1314 | } 1315 | }, 1316 | "minimatch": { 1317 | "version": "9.0.3", 1318 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", 1319 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 1320 | "dev": true, 1321 | "requires": { 1322 | "brace-expansion": "^2.0.1" 1323 | } 1324 | }, 1325 | "muggle-string": { 1326 | "version": "0.3.1", 1327 | "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", 1328 | "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", 1329 | "dev": true 1330 | }, 1331 | "nanoid": { 1332 | "version": "3.3.6", 1333 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 1334 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" 1335 | }, 1336 | "picocolors": { 1337 | "version": "1.0.0", 1338 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1339 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1340 | }, 1341 | "postcss": { 1342 | "version": "8.4.27", 1343 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", 1344 | "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", 1345 | "requires": { 1346 | "nanoid": "^3.3.6", 1347 | "picocolors": "^1.0.0", 1348 | "source-map-js": "^1.0.2" 1349 | } 1350 | }, 1351 | "rollup": { 1352 | "version": "3.26.3", 1353 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", 1354 | "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", 1355 | "dev": true, 1356 | "requires": { 1357 | "fsevents": "~2.3.2" 1358 | } 1359 | }, 1360 | "semver": { 1361 | "version": "7.5.4", 1362 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 1363 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 1364 | "dev": true, 1365 | "requires": { 1366 | "lru-cache": "^6.0.0" 1367 | } 1368 | }, 1369 | "source-map-js": { 1370 | "version": "1.0.2", 1371 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1372 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 1373 | }, 1374 | "typescript": { 1375 | "version": "5.1.6", 1376 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", 1377 | "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", 1378 | "dev": true 1379 | }, 1380 | "vite": { 1381 | "version": "4.4.6", 1382 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.6.tgz", 1383 | "integrity": "sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==", 1384 | "dev": true, 1385 | "requires": { 1386 | "esbuild": "^0.18.10", 1387 | "fsevents": "~2.3.2", 1388 | "postcss": "^8.4.26", 1389 | "rollup": "^3.25.2" 1390 | } 1391 | }, 1392 | "vue": { 1393 | "version": "3.3.4", 1394 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", 1395 | "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", 1396 | "requires": { 1397 | "@vue/compiler-dom": "3.3.4", 1398 | "@vue/compiler-sfc": "3.3.4", 1399 | "@vue/runtime-dom": "3.3.4", 1400 | "@vue/server-renderer": "3.3.4", 1401 | "@vue/shared": "3.3.4" 1402 | } 1403 | }, 1404 | "vue-template-compiler": { 1405 | "version": "2.7.14", 1406 | "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", 1407 | "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", 1408 | "dev": true, 1409 | "requires": { 1410 | "de-indent": "^1.0.2", 1411 | "he": "^1.2.0" 1412 | } 1413 | }, 1414 | "vue-tsc": { 1415 | "version": "1.8.6", 1416 | "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.6.tgz", 1417 | "integrity": "sha512-8ffD4NGfwyATjw/s40Lw2EgB7L2/PAqnGlJBaVQLgblr3SU4EYdhJ67TNXXuDD8NMbDAFSM24V8i3ZIJgTs32Q==", 1418 | "dev": true, 1419 | "requires": { 1420 | "@vue/language-core": "1.8.6", 1421 | "@vue/typescript": "1.8.6", 1422 | "semver": "^7.3.8" 1423 | } 1424 | }, 1425 | "yallist": { 1426 | "version": "4.0.0", 1427 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1428 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1429 | "dev": true 1430 | } 1431 | } 1432 | } 1433 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@leyton-techlab/vue-input-highlighter", 3 | "version": "0.0.6", 4 | "main": "./dist/vue-input-highlighter.umd.js", 5 | "module": "./dist/vue-input-highlighter.es.js", 6 | "exports": { 7 | ".": { 8 | "import": "./dist/vue-input-highlighter.es.js", 9 | "require": "./dist/vue-input-highlighter.umd.js" 10 | }, 11 | "./style.css": "./dist/style.css" 12 | }, 13 | "files": [ 14 | "dist/" 15 | ], 16 | "type": "module", 17 | "scripts": { 18 | "dev": "vite", 19 | "build": "vue-tsc && vite build", 20 | "preview": "vite preview" 21 | }, 22 | "dependencies": { 23 | "vue": "^3.3.4" 24 | }, 25 | "devDependencies": { 26 | "@vitejs/plugin-vue": "^4.2.3", 27 | "typescript": "^5.0.2", 28 | "vite": "^4.4.5", 29 | "vue-tsc": "^1.8.5" 30 | }, 31 | "description": "Vue component that let you highlight content inside an input according to regexes", 32 | "repository": { 33 | "type": "git", 34 | "url": "git+https://github.com/leyton-group/vue-input-highlighter.git" 35 | }, 36 | "keywords": [ 37 | "ux", 38 | "vue", 39 | "vue3", 40 | "input", 41 | "highlight", 42 | "highlighter" 43 | ], 44 | "author": "galinor", 45 | "bugs": { 46 | "url": "https://github.com/leyton-group/vue-input-highlighter/issues" 47 | }, 48 | "homepage": "https://github.com/leyton-group/vue-input-highlighter#readme" 49 | } 50 | -------------------------------------------------------------------------------- /src/components/input-highlighter.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 177 | 178 | 205 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import InputHighlighter from './components/input-highlighter.vue'; 2 | 3 | export default InputHighlighter; 4 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leyton-group/vue-input-highlighter/1b104fe7cb840f32fb946561cd623ef18895ffc7/src/style.css -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | "allowJs": true, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "bundler", 12 | "allowImportingTsExtensions": true, 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "noEmit": true, 16 | "jsx": "preserve", 17 | 18 | /* Linting */ 19 | "strict": true, 20 | "noUnusedLocals": true, 21 | "noUnusedParameters": true, 22 | "noFallthroughCasesInSwitch": true 23 | }, 24 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], 25 | "references": [{ "path": "./tsconfig.node.json" }] 26 | } 27 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from 'path' 2 | import { defineConfig } from 'vite' 3 | import vue from '@vitejs/plugin-vue' 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig({ 7 | build: { 8 | lib: { 9 | entry: resolve(__dirname, 'src/index.js'), 10 | name: 'vue-input-highlighter', 11 | fileName: (format) => `vue-input-highlighter.${format}.js`, 12 | }, 13 | rollupOptions: { 14 | external: ['vue'], 15 | output: { 16 | globals: { 17 | vue: 'Vue' 18 | } 19 | } 20 | }, 21 | }, 22 | plugins: [vue()], 23 | }) 24 | --------------------------------------------------------------------------------