├── .editorconfig ├── .eslintrc ├── .gitignore ├── LICENSE ├── README.md ├── dist ├── tawk-messenger-vue-3.es.js └── tawk-messenger-vue-3.umd.js ├── docs ├── api-reference.md ├── spa-setup.md └── ssr-setup.md ├── images └── tawk-vue-logo.png ├── package-lock.json ├── package.json ├── src ├── index.js ├── lib │ └── index.js └── utils │ ├── helper.js │ └── widget.js ├── tests ├── setup.js ├── units │ ├── features.spec.js │ ├── install.spec.js │ └── lib.spec.js └── utils │ └── helper.js ├── vite.config.js └── vitest.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*.js, *.vue] 4 | indent_style = tab 5 | indent_size = 4 6 | insert_final_newline = true 7 | trim_trailing_whitespace = true 8 | end_of_line = lf 9 | charset = utf-8 10 | 11 | [*.md] 12 | indent_style = space 13 | indent_size = 4 14 | insert_final_newline = true 15 | trim_trailing_whitespace = true 16 | end_of_line = lf 17 | charset = utf-8 18 | 19 | [*.json] 20 | indent_style = space 21 | indent_size = 2 22 | insert_final_newline = true 23 | trim_trailing_whitespace = true 24 | end_of_line = lf 25 | charset = utf-8 -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parserOptions": { 3 | "sourceType": "module", 4 | "ecmaVersion": 2020 5 | } 6 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | 84 | # Gatsby files 85 | .cache/ 86 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 87 | # https://nextjs.org/blog/next-9-1#public-directory-support 88 | # public 89 | 90 | # vuepress build output 91 | .vuepress/dist 92 | 93 | # Serverless directories 94 | .serverless/ 95 | 96 | # FuseBox cache 97 | .fusebox/ 98 | 99 | # DynamoDB Local files 100 | .dynamodb/ 101 | 102 | # TernJS port file 103 | .tern-port 104 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2022 tawk.to inc. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Tawk Vue logo 5 |

6 | 7 | ## Features 8 | - Compatible on Vue 3 and Nuxt 9 | - Documented and self-explaining methods 10 | - Small size without any external libraries 11 | - All Javascript API methods are avaiable 12 | - Maintained by the [tawk.to](https://www.tawk.to]) team 13 | 14 |
15 | 16 | ## Installation 17 | The plugins are available from the node and yarn package managers. 18 | ```bash 19 | # Node 20 | npm install @tawk.to/tawk-messenger-vue-3 21 | 22 | # Yarn 23 | yarn add @tawk.to/tawk-messenger-vue-3 24 | ``` 25 | 26 |
27 | 28 | ## Quickstart 29 | Import the **tawk-messenger-vue** in your main JavaScript file in **src/** folder. The **propertyId** and **widgetId** will 30 | be found on your tawk Dashboard. 31 | 32 | Log in to your account and go to **Administration > Channels > Chat Widget**. 33 | 34 | ```js 35 | import TawkMessengerVue from '@tawk.to/tawk-messenger-vue-3'; 36 | 37 | app.use(TawkMessengerVue, { 38 | propertyId : 'property_id', 39 | widgetId : 'widget_id' 40 | }); 41 | ``` 42 | 43 |
44 | 45 | ## Server Side Rendering 46 | If you will use the plugin with Nuxt JS follow this [guide for setup](docs/ssr-setup.md). 47 | 48 |
49 | 50 | ## Documentation 51 | 52 | This project includes a `docs` folder with more details on the following: 53 | 1. [SPA setup](docs/spa-setup.md) 54 | 1. [SSR setup](docs/ssr-setup.md) 55 | 1. [API Reference](docs/api-reference.md) 56 | 57 |
58 | 59 | ## Other JS frameworks we support 60 | - [Vue 2](https://github.com/tawk/tawk-messenger-vue-2) 61 | - [React Js](https://github.com/tawk/tawk-messenger-react) 62 | - [Angular Js](https://github.com/tawk/tawk-messenger-angular) 63 | - [Ember Js](https://github.com/tawk/tawk-messenger-ember) 64 | 65 |
66 | 67 | ## Frequently Asked Questions 68 | 69 | **Do you have a knowledge base or article to support implementation?** 70 | 71 | Here is our guide for the [Vue.js integration](https://help.tawk.to/article/vue-js ) 72 | 73 | **Where can I find more information and support?** 74 | 75 | Visit our [help center](https://help.tawk.to) or reach out in the chat on our [website](https://tawk.to). Our agents are available to assist you 24/7. 76 | 77 | **Where can I submit a suggestion or report a bug?** 78 | 79 | Check to see if the issue already exists. If not, open a new issue in the [Issues tab](https://github.com/tawk/tawk-messenger-vue-3/issues) 80 | -------------------------------------------------------------------------------- /dist/tawk-messenger-vue-3.es.js: -------------------------------------------------------------------------------- 1 | function loadScript({ propertyId = "", widgetId = "", embedId = "", basePath = "tawk.to", autoStart = true }) { 2 | if (embedId.length) { 3 | if (!document.getElementById(embedId)) { 4 | const element = document.createElement("div"); 5 | element.id = embedId; 6 | document.body.appendChild(element); 7 | } 8 | window.Tawk_API.embedded = embedId; 9 | } 10 | if (!autoStart) { 11 | window.Tawk_API.autoStart = autoStart; 12 | } 13 | const script = document.createElement("script"); 14 | script.async = true; 15 | script.src = `https://embed.${basePath}/${propertyId}/${widgetId}`; 16 | script.charset = "UTF-8"; 17 | script.setAttribute("crossorigin", "*"); 18 | const firstScript = document.getElementsByTagName("script")[0]; 19 | firstScript.parentNode.insertBefore(script, firstScript); 20 | } 21 | function isValidString(value) { 22 | if (!value || value.length === 0) { 23 | return false; 24 | } 25 | return value !== null && value !== void 0 && typeof value === "string"; 26 | } 27 | class TawkMessenger { 28 | constructor(app, options) { 29 | if (!isValidString(options.propertyId)) { 30 | return; 31 | } 32 | if (!isValidString(options.widgetId)) { 33 | return; 34 | } 35 | this.app = app; 36 | this.propertyId = options.propertyId; 37 | this.widgetId = options.widgetId; 38 | this.embedId = options.embedId; 39 | this.autoStart = options.autoStart; 40 | this.customStyle = options.customStyle; 41 | this.basePath = options.basePath; 42 | this.load(); 43 | } 44 | load() { 45 | if (!window || !document) { 46 | return; 47 | } 48 | window.Tawk_API = window.Tawk_API || {}; 49 | window.Tawk_LoadStart = new Date(); 50 | loadScript({ 51 | propertyId: this.propertyId, 52 | widgetId: this.widgetId, 53 | embedId: this.embedId, 54 | basePath: this.basePath, 55 | autoStart: this.autoStart 56 | }); 57 | this.init(); 58 | } 59 | init() { 60 | if (this.customStyle && typeof this.customStyle === "object") { 61 | window.Tawk_API.customStyle = this.customStyle; 62 | } 63 | if (typeof this.app !== "object") { 64 | return; 65 | } 66 | this.provideActions(); 67 | this.provideGetters(); 68 | this.provideListeners(); 69 | this.provideSetters(); 70 | } 71 | provideActions() { 72 | this.app.provide("start", () => { 73 | window.Tawk_API.start(); 74 | }); 75 | this.app.provide("shutdown", () => { 76 | window.Tawk_API.shutdown(); 77 | }); 78 | this.app.provide("maximize", () => { 79 | window.Tawk_API.maximize(); 80 | }); 81 | this.app.provide("minimize", () => { 82 | window.Tawk_API.minimize(); 83 | }); 84 | this.app.provide("toggle", () => { 85 | window.Tawk_API.toggle(); 86 | }); 87 | this.app.provide("popup", () => { 88 | window.Tawk_API.popup(); 89 | }); 90 | this.app.provide("showWidget", () => { 91 | window.Tawk_API.showWidget(); 92 | }); 93 | this.app.provide("hideWidget", () => { 94 | window.Tawk_API.hideWidget(); 95 | }); 96 | this.app.provide("toggleVisibility", () => { 97 | window.Tawk_API.toggleVisibility(); 98 | }); 99 | this.app.provide("endChat", () => { 100 | window.Tawk_API.endChat(); 101 | }); 102 | } 103 | provideGetters() { 104 | this.app.provide("getWindowType", () => { 105 | return window.Tawk_API.getWindowType(); 106 | }); 107 | this.app.provide("getStatus", () => { 108 | return window.Tawk_API.getStatus(); 109 | }); 110 | this.app.provide("isChatMaximized", () => { 111 | return window.Tawk_API.isChatMaximized(); 112 | }); 113 | this.app.provide("isChatMinimized", () => { 114 | return window.Tawk_API.isChatMinimized(); 115 | }); 116 | this.app.provide("isChatHidden", () => { 117 | return window.Tawk_API.isChatHidden(); 118 | }); 119 | this.app.provide("isChatOngoing", () => { 120 | return window.Tawk_API.isChatOngoing(); 121 | }); 122 | this.app.provide("isVisitorEngaged", () => { 123 | return window.Tawk_API.isVisitorEngaged(); 124 | }); 125 | this.app.provide("onLoaded", () => { 126 | return window.Tawk_API.onLoaded; 127 | }); 128 | this.app.provide("onBeforeLoaded", () => { 129 | return window.Tawk_API.onBeforeLoaded; 130 | }); 131 | this.app.provide("widgetPosition", () => { 132 | return window.Tawk_API.widgetPosition(); 133 | }); 134 | } 135 | provideListeners() { 136 | this.app.provide("onLoad", (callback) => { 137 | window.addEventListener("tawkLoad", () => { 138 | callback(); 139 | }); 140 | }); 141 | this.app.provide("onStatusChange", (callback) => { 142 | window.addEventListener("tawkStatusChange", (status) => { 143 | callback(status.detail); 144 | }); 145 | }); 146 | this.app.provide("onBeforeLoad", (callback) => { 147 | window.addEventListener("tawkBeforeLoad", () => { 148 | callback(); 149 | }); 150 | }); 151 | this.app.provide("onChatMaximized", (callback) => { 152 | window.addEventListener("tawkChatMaximized", () => { 153 | callback(); 154 | }); 155 | }); 156 | this.app.provide("onChatMinimized", (callback) => { 157 | window.addEventListener("tawkChatMinimized", () => { 158 | callback(); 159 | }); 160 | }); 161 | this.app.provide("onChatHidden", (callback) => { 162 | window.addEventListener("tawkChatHidden", () => { 163 | callback(); 164 | }); 165 | }); 166 | this.app.provide("onChatStarted", (callback) => { 167 | window.addEventListener("tawkChatStarted", () => { 168 | callback(); 169 | }); 170 | }); 171 | this.app.provide("onChatEnded", (callback) => { 172 | window.addEventListener("tawkChatEnded", () => { 173 | callback(); 174 | }); 175 | }); 176 | this.app.provide("onPrechatSubmit", (callback) => { 177 | window.addEventListener("tawkPrechatSubmit", (data) => { 178 | callback(data.detail); 179 | }); 180 | }); 181 | this.app.provide("onOfflineSubmit", (callback) => { 182 | window.addEventListener("tawkOfflineSubmit", (data) => { 183 | callback(data.detail); 184 | }); 185 | }); 186 | this.app.provide("onChatMessageVisitor", (callback) => { 187 | window.addEventListener("tawkChatMessageVisitor", (message) => { 188 | callback(message.detail); 189 | }); 190 | }); 191 | this.app.provide("onChatMessageAgent", (callback) => { 192 | window.addEventListener("tawkChatMessageAgent", (message) => { 193 | callback(message.detail); 194 | }); 195 | }); 196 | this.app.provide("onChatMessageSystem", (callback) => { 197 | window.addEventListener("tawkChatMessageSystem", (message) => { 198 | callback(message.detail); 199 | }); 200 | }); 201 | this.app.provide("onAgentJoinChat", (callback) => { 202 | window.addEventListener("tawkAgentJoinChat", (data) => { 203 | callback(data.detail); 204 | }); 205 | }); 206 | this.app.provide("onAgentLeaveChat", (callback) => { 207 | window.addEventListener("tawkAgentLeaveChat", (data) => { 208 | callback(data.detail); 209 | }); 210 | }); 211 | this.app.provide("onChatSatisfaction", (callback) => { 212 | window.addEventListener("tawkChatSatisfaction", (satisfaction) => { 213 | callback(satisfaction.detail); 214 | }); 215 | }); 216 | this.app.provide("onVisitorNameChanged", (callback) => { 217 | window.addEventListener("tawkVisitorNameChanged", (visitorName) => { 218 | callback(visitorName.detail); 219 | }); 220 | }); 221 | this.app.provide("onFileUpload", (callback) => { 222 | window.addEventListener("tawkFileUpload", (link) => { 223 | callback(link.detail); 224 | }); 225 | }); 226 | this.app.provide("onTagsUpdated", (callback) => { 227 | window.addEventListener("tawkTagsUpdated", (data) => { 228 | callback(data.detail); 229 | }); 230 | }); 231 | this.app.provide("onUnreadCountChanged", (callback) => { 232 | window.addEventListener("tawkUnreadCountChanged", (data) => { 233 | callback(data.detail); 234 | }); 235 | }); 236 | } 237 | provideSetters() { 238 | this.app.provide("visitor", (data) => { 239 | window.Tawk_API.visitor = data; 240 | }); 241 | this.app.provide("setAttributes", (attribute, callback) => { 242 | window.Tawk_API.setAttributes(attribute, callback); 243 | }); 244 | this.app.provide("addEvent", (event, metadata, callback) => { 245 | window.Tawk_API.addEvent(event, metadata, callback); 246 | }); 247 | this.app.provide("addTags", (tags, callback) => { 248 | window.Tawk_API.addTags(tags, callback); 249 | }); 250 | this.app.provide("removeTags", (tags, callback) => { 251 | window.Tawk_API.removeTags(tags, callback); 252 | }); 253 | this.app.provide("switchWidget", (data, callback) => { 254 | window.Tawk_API.switchWidget(data, callback); 255 | }); 256 | } 257 | } 258 | var index = { 259 | install: (app, options = {}) => { 260 | if (!isValidString(options.propertyId)) { 261 | console.error("[Tawk-messenger-vue warn]: You didn't specified 'propertyId' property in the plugin."); 262 | return; 263 | } 264 | if (!isValidString(options.widgetId)) { 265 | console.error("[Tawk-messenger-vue warn]: You didn't specified 'widgetId' property in the plugin."); 266 | return; 267 | } 268 | new TawkMessenger(app, options); 269 | } 270 | }; 271 | export { index as default }; 272 | -------------------------------------------------------------------------------- /dist/tawk-messenger-vue-3.umd.js: -------------------------------------------------------------------------------- 1 | (function(a,d){typeof exports=="object"&&typeof module!="undefined"?module.exports=d():typeof define=="function"&&define.amd?define(d):(a=typeof globalThis!="undefined"?globalThis:a||self,a["tawk-messenger-vue-3"]=d())})(this,function(){"use strict";function a({propertyId:i="",widgetId:t="",embedId:e="",basePath:o="tawk.to",autoStart:s=!0}){if(e.length){if(!document.getElementById(e)){const p=document.createElement("div");p.id=e,document.body.appendChild(p)}window.Tawk_API.embedded=e}s||(window.Tawk_API.autoStart=s);const n=document.createElement("script");n.async=!0,n.src=`https://embed.${o}/${i}/${t}`,n.charset="UTF-8",n.setAttribute("crossorigin","*");const r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(n,r)}function d(i){return!i||i.length===0?!1:i!=null&&typeof i=="string"}class w{constructor(t,e){!d(e.propertyId)||!d(e.widgetId)||(this.app=t,this.propertyId=e.propertyId,this.widgetId=e.widgetId,this.embedId=e.embedId,this.autoStart=e.autoStart,this.customStyle=e.customStyle,this.basePath=e.basePath,this.load())}load(){!window||!document||(window.Tawk_API=window.Tawk_API||{},window.Tawk_LoadStart=new Date,a({propertyId:this.propertyId,widgetId:this.widgetId,embedId:this.embedId,basePath:this.basePath,autoStart:this.autoStart}),this.init())}init(){this.customStyle&&typeof this.customStyle=="object"&&(window.Tawk_API.customStyle=this.customStyle),typeof this.app=="object"&&(this.provideActions(),this.provideGetters(),this.provideListeners(),this.provideSetters())}provideActions(){this.app.provide("start",()=>{window.Tawk_API.start()}),this.app.provide("shutdown",()=>{window.Tawk_API.shutdown()}),this.app.provide("maximize",()=>{window.Tawk_API.maximize()}),this.app.provide("minimize",()=>{window.Tawk_API.minimize()}),this.app.provide("toggle",()=>{window.Tawk_API.toggle()}),this.app.provide("popup",()=>{window.Tawk_API.popup()}),this.app.provide("showWidget",()=>{window.Tawk_API.showWidget()}),this.app.provide("hideWidget",()=>{window.Tawk_API.hideWidget()}),this.app.provide("toggleVisibility",()=>{window.Tawk_API.toggleVisibility()}),this.app.provide("endChat",()=>{window.Tawk_API.endChat()})}provideGetters(){this.app.provide("getWindowType",()=>window.Tawk_API.getWindowType()),this.app.provide("getStatus",()=>window.Tawk_API.getStatus()),this.app.provide("isChatMaximized",()=>window.Tawk_API.isChatMaximized()),this.app.provide("isChatMinimized",()=>window.Tawk_API.isChatMinimized()),this.app.provide("isChatHidden",()=>window.Tawk_API.isChatHidden()),this.app.provide("isChatOngoing",()=>window.Tawk_API.isChatOngoing()),this.app.provide("isVisitorEngaged",()=>window.Tawk_API.isVisitorEngaged()),this.app.provide("onLoaded",()=>window.Tawk_API.onLoaded),this.app.provide("onBeforeLoaded",()=>window.Tawk_API.onBeforeLoaded),this.app.provide("widgetPosition",()=>window.Tawk_API.widgetPosition())}provideListeners(){this.app.provide("onLoad",t=>{window.addEventListener("tawkLoad",()=>{t()})}),this.app.provide("onStatusChange",t=>{window.addEventListener("tawkStatusChange",e=>{t(e.detail)})}),this.app.provide("onBeforeLoad",t=>{window.addEventListener("tawkBeforeLoad",()=>{t()})}),this.app.provide("onChatMaximized",t=>{window.addEventListener("tawkChatMaximized",()=>{t()})}),this.app.provide("onChatMinimized",t=>{window.addEventListener("tawkChatMinimized",()=>{t()})}),this.app.provide("onChatHidden",t=>{window.addEventListener("tawkChatHidden",()=>{t()})}),this.app.provide("onChatStarted",t=>{window.addEventListener("tawkChatStarted",()=>{t()})}),this.app.provide("onChatEnded",t=>{window.addEventListener("tawkChatEnded",()=>{t()})}),this.app.provide("onPrechatSubmit",t=>{window.addEventListener("tawkPrechatSubmit",e=>{t(e.detail)})}),this.app.provide("onOfflineSubmit",t=>{window.addEventListener("tawkOfflineSubmit",e=>{t(e.detail)})}),this.app.provide("onChatMessageVisitor",t=>{window.addEventListener("tawkChatMessageVisitor",e=>{t(e.detail)})}),this.app.provide("onChatMessageAgent",t=>{window.addEventListener("tawkChatMessageAgent",e=>{t(e.detail)})}),this.app.provide("onChatMessageSystem",t=>{window.addEventListener("tawkChatMessageSystem",e=>{t(e.detail)})}),this.app.provide("onAgentJoinChat",t=>{window.addEventListener("tawkAgentJoinChat",e=>{t(e.detail)})}),this.app.provide("onAgentLeaveChat",t=>{window.addEventListener("tawkAgentLeaveChat",e=>{t(e.detail)})}),this.app.provide("onChatSatisfaction",t=>{window.addEventListener("tawkChatSatisfaction",e=>{t(e.detail)})}),this.app.provide("onVisitorNameChanged",t=>{window.addEventListener("tawkVisitorNameChanged",e=>{t(e.detail)})}),this.app.provide("onFileUpload",t=>{window.addEventListener("tawkFileUpload",e=>{t(e.detail)})}),this.app.provide("onTagsUpdated",t=>{window.addEventListener("tawkTagsUpdated",e=>{t(e.detail)})}),this.app.provide("onUnreadCountChanged",t=>{window.addEventListener("tawkUnreadCountChanged",e=>{t(e.detail)})})}provideSetters(){this.app.provide("visitor",t=>{window.Tawk_API.visitor=t}),this.app.provide("setAttributes",(t,e)=>{window.Tawk_API.setAttributes(t,e)}),this.app.provide("addEvent",(t,e,o)=>{window.Tawk_API.addEvent(t,e,o)}),this.app.provide("addTags",(t,e)=>{window.Tawk_API.addTags(t,e)}),this.app.provide("removeTags",(t,e)=>{window.Tawk_API.removeTags(t,e)}),this.app.provide("switchWidget",(t,e)=>{window.Tawk_API.switchWidget(t,e)})}}var h={install:(i,t={})=>{if(!d(t.propertyId)){console.error("[Tawk-messenger-vue warn]: You didn't specified 'propertyId' property in the plugin.");return}if(!d(t.widgetId)){console.error("[Tawk-messenger-vue warn]: You didn't specified 'widgetId' property in the plugin.");return}new w(i,t)}};return h}); 2 | -------------------------------------------------------------------------------- /docs/api-reference.md: -------------------------------------------------------------------------------- 1 | # API Reference 2 | Welcome to the [tawk.to](https://www.tawk.to) JavaScript API documentation. 3 | 4 | The API provides a flexible set of methods that can be used in your web projects. To invoke one 5 | of the methods below, please be sure to call a method after the embed code on your page. 6 | 7 | Use the JavaScript API to manipulate the chat widget displayed on your website. 8 | 9 |
10 | 11 | ## Table of contents 12 | - [API Reference](#api-reference) 13 | - [Table of contents](#table-of-contents) 14 | - [onLoad](#onload) 15 | - [onStatusChange](#onstatuschange) 16 | - [onBeforeLoad](#onbeforeload) 17 | - [onChatMaximized](#onchatmaximized) 18 | - [onChatMinimized](#onchatminimized) 19 | - [onChatHidden](#onchathidden) 20 | - [onChatStarted](#onchatstarted) 21 | - [onChatEnded](#onchatended) 22 | - [onPrechatSubmit](#onprechatsubmit) 23 | - [onOfflineSubmit](#onofflinesubmit) 24 | - [onChatMessageVisitor](#onchatmessagevisitor) 25 | - [onChatMessageAgent](#onchatmessageagent) 26 | - [onChatMessageSystem](#onchatmessagesystem) 27 | - [onAgentJoinChat](#onagentjoinchat) 28 | - [onAgentLeaveChat](#onagentleavechat) 29 | - [onChatSatisfaction](#onchatsatisfaction) 30 | - [onVisitorNameChanged](#onvisitornamechanged) 31 | - [onFileUpload](#onfileupload) 32 | - [onTagsUpdated](#ontagsupdated) 33 | - [onUnreadCountChanged](#onunreadcountchanged) 34 | - [visitor](#visitor) 35 | - [autoStart](#autostart) 36 | - [start](#start) 37 | - [shutdown](#shutdown) 38 | - [maximize](#maximize) 39 | - [minimize](#minimize) 40 | - [toggle](#toggle) 41 | - [popup](#popup) 42 | - [getWindowType](#getwindowtype) 43 | - [showWidget](#showwidget) 44 | - [hideWidget](#hidewidget) 45 | - [toggleVisibility](#togglevisibility) 46 | - [getStatus](#getstatus) 47 | - [isChatMaximized](#ischatmaximized) 48 | - [isChatMinimized](#ischatminimized) 49 | - [isChatHidden](#ischathidden) 50 | - [isChatOngoing](#ischatongoing) 51 | - [isVisitorEngaged](#isvisitorengaged) 52 | - [onLoaded](#onloaded) 53 | - [onBeforeLoaded](#onbeforeloaded) 54 | - [widgetPosition](#widgetposition) 55 | - [endChat](#endchat) 56 | - [setAttributes](#setattributes) 57 | - [addEvent](#addevent) 58 | - [addTags](#addtags) 59 | - [removeTags](#removetags) 60 | - [secureMode](#securemode) 61 | - [customstyle](#customstyle) 62 | - [zIndex](#zindex) 63 | - [Visibility](#visibility) 64 | - [switchWidget](#switchwidget) 65 | 66 |
67 | 68 | ## onLoad 69 | Callback function invoked right after the widget is rendered. This callback is not supported in 70 | pop out chat window. 71 | 72 | `Composition API` 73 | ```html 74 | 81 | ``` 82 | 83 | `Options API` 84 | ```js 85 | export default { 86 | inject : ['onLoad'], 87 | 88 | mounted() { 89 | this.onLoad(() => { 90 | // place your code here 91 | }); 92 | } 93 | } 94 | ``` 95 | 96 |
97 | 98 | ## onStatusChange 99 | Callback function invoked when the page status changes. The function will receive the changed status which will be either online, away or offline. This callback is not supported in pop out chat window. 100 | 101 | `Composition API` 102 | ```html 103 | 110 | ``` 111 | 112 | `Options API` 113 | ```js 114 | export default { 115 | inject : ['onStatusChange'], 116 | 117 | mounted() { 118 | this.onStatusChange((status) => { 119 | // place your code here 120 | }); 121 | } 122 | } 123 | ``` 124 | 125 |
126 | 127 | ## onBeforeLoad 128 | Callback function invoked right when Tawk_API is ready to be used and before the widget is rendered. This callback is not supported in pop out chat window. 129 | 130 | `Composition API` 131 | ```html 132 | 139 | ``` 140 | 141 | `Options API` 142 | ```js 143 | export default { 144 | inject : ['onBeforeLoad'], 145 | 146 | mounted() { 147 | this.onBeforeLoad(() => { 148 | // place your code here 149 | }); 150 | } 151 | } 152 | ``` 153 | 154 |
155 | 156 | ## onChatMaximized 157 | Callback function invoked when the widget is maximized. This callback is not supported in pop out chat window. 158 | 159 | `Composition API` 160 | ```html 161 | 168 | ``` 169 | 170 | `Options API` 171 | ```js 172 | export default { 173 | inject : ['onChatMaximized'], 174 | 175 | mounted() { 176 | this.onChatMaximized(() => { 177 | // place your code here 178 | }); 179 | } 180 | } 181 | ``` 182 | 183 |
184 | 185 | ## onChatMinimized 186 | Callback function invoked when the widget is minimized. This callback is not supported in pop out chat window. 187 | 188 | `Composition API` 189 | ```html 190 | 197 | ``` 198 | 199 | `Options API` 200 | ```js 201 | export default { 202 | inject : ['onChatMinimized'], 203 | 204 | mounted() { 205 | this.onChatMinimized(() => { 206 | // place your code here 207 | }); 208 | } 209 | } 210 | ``` 211 | 212 |
213 | 214 | ## onChatHidden 215 | Callback function invoked when the widget is hidden. This callback is not supported in pop out chat window. 216 | 217 | `Composition API` 218 | ```html 219 | 226 | ``` 227 | 228 | `Options API` 229 | ```js 230 | export default { 231 | inject : ['onChatHidden'], 232 | 233 | mounted() { 234 | this.onChatHidden(() => { 235 | // place your code here 236 | }); 237 | } 238 | } 239 | ``` 240 | 241 |
242 | 243 | ## onChatStarted 244 | Callback function invoked when the widget is started. 245 | 246 | `Composition API` 247 | ```html 248 | 255 | ``` 256 | 257 | `Options API` 258 | ```js 259 | export default { 260 | inject : ['onChatStarted'], 261 | 262 | mounted() { 263 | this.onChatStarted(() => { 264 | // place your code here 265 | }); 266 | } 267 | } 268 | ``` 269 | 270 |
271 | 272 | ## onChatEnded 273 | Callback function invoked when the widget is ended. This callback is not supported in pop out chat window. 274 | 275 | `Composition API` 276 | ```html 277 | 284 | ``` 285 | 286 | `Options API` 287 | ```js 288 | export default { 289 | inject : ['onChatEnded'], 290 | 291 | mounted() { 292 | this.onChatEnded(() => { 293 | // place your code here 294 | }); 295 | } 296 | } 297 | ``` 298 | 299 |
300 | 301 | ## onPrechatSubmit 302 | Callback function invoked when the Pre-Chat Form is submitted. The submitted form data is passed to the function. This callback is not supported in pop out chat window. 303 | 304 | `Composition API` 305 | ```html 306 | 313 | ``` 314 | 315 | `Options API` 316 | ```js 317 | export default { 318 | inject : ['onPrechatSubmit'], 319 | 320 | mounted() { 321 | this.onPrechatSubmit((data) => { 322 | // place your code here 323 | }); 324 | } 325 | } 326 | ``` 327 | 328 |
329 | 330 | ## onOfflineSubmit 331 | Callback function invoked when the Offline form is submitted. The submitted form data is passed to the function. Form data will contain {name : ”, email : ”, message : ”, questions : []}. This callback is not supported in pop out chat window. 332 | 333 | `Composition API` 334 | ```html 335 | 342 | ``` 343 | 344 | `Options API` 345 | ```js 346 | export default { 347 | inject : ['onOfflineSubmit'], 348 | 349 | mounted() { 350 | this.onOfflineSubmit((data => { 351 | // place your code here 352 | }); 353 | } 354 | } 355 | ``` 356 | 357 |
358 | 359 | ## onChatMessageVisitor 360 | Callback function invoked when message is sent by the visitor. The message is passed to the function. This callback is not supported in pop out chat window. 361 | 362 | `Composition API` 363 | ```html 364 | 371 | ``` 372 | 373 | `Options API` 374 | ```js 375 | export default { 376 | inject : ['onChatMessageVisitor'], 377 | 378 | mounted() { 379 | this.onChatMessageVisitor((message) => { 380 | // place your code here 381 | }); 382 | } 383 | } 384 | ``` 385 | 386 |
387 | 388 | ## onChatMessageAgent 389 | Callback function invoked when message is sent by the agent. The message is passed to the function. This callback is not supported in pop out chat window. 390 | 391 | `Composition API` 392 | ```html 393 | 400 | ``` 401 | 402 | `Options API` 403 | ```js 404 | export default { 405 | inject : ['onChatMessageeAgent'], 406 | 407 | mounted() { 408 | this.onChatMessageeAgent((message) => { 409 | // place your code here 410 | }); 411 | } 412 | } 413 | ``` 414 | 415 |
416 | 417 | ## onChatMessageSystem 418 | Callback function invoked when message is sent by the system. The message is passed to the function. This callback is not supported in pop out chat window. 419 | 420 | `Composition API` 421 | ```html 422 | 429 | ``` 430 | 431 | `Options API` 432 | ```js 433 | export default { 434 | inject : ['onChatMessageSystem'], 435 | 436 | mounted() { 437 | this.onChatMessageSystem((message) => { 438 | // place your code here 439 | }); 440 | } 441 | } 442 | ``` 443 | 444 |
445 | 446 | ## onAgentJoinChat 447 | Callback function invoked when an agent joins the chat. The data is passed to the function. Will contain {name : ”, position : ”, image : ”, id : ”}. This callback is not supported in pop out chat window. 448 | 449 | `Composition API` 450 | ```html 451 | 458 | ``` 459 | 460 | `Options API` 461 | ```js 462 | export default { 463 | inject : ['onAgentJoinChat'], 464 | 465 | mounted() { 466 | this.onAgentJoinChat((data) => { 467 | // place your code here 468 | }); 469 | } 470 | } 471 | ``` 472 | 473 |
474 | 475 | ## onAgentLeaveChat 476 | Callback function invoked when an agent leaves the chat. The data is passed to the function. Will contain {name : ”, id : ”}. This callback is not supported in pop out chat window. 477 | 478 | `Composition API` 479 | ```html 480 | 487 | ``` 488 | 489 | `Options API` 490 | ```js 491 | export default { 492 | inject : ['onAgentLeaveChat'], 493 | 494 | mounted() { 495 | this.onAgentLeaveChat((data) => { 496 | // place your code here 497 | }); 498 | } 499 | } 500 | ``` 501 | 502 |
503 | 504 | ## onChatSatisfaction 505 | Callback function invoked when an agent leaves the chat. The satisfaction is passed to the function. -1 = dislike | 0 = neutral | 1 = like. This callback is not supported in pop out chat window. 506 | 507 | `Composition API` 508 | ```html 509 | 516 | ``` 517 | 518 | `Options API` 519 | ```js 520 | export default { 521 | inject : ['onChatSatisfaction'], 522 | 523 | mounted() { 524 | this.onChatSatisfaction((satisfaction) => { 525 | // place your code here 526 | }); 527 | } 528 | } 529 | ``` 530 | 531 |
532 | 533 | ## onVisitorNameChanged 534 | Callback function invoked when the visitor manually changes his name. The visitorName is passed to the function. This callback is not supported in pop out chat window. 535 | 536 | `Composition API` 537 | ```html 538 | 545 | ``` 546 | 547 | `Options API` 548 | ```js 549 | export default { 550 | inject : ['onVisitorNameChanged'], 551 | 552 | mounted() { 553 | this.onVisitorNameChanged((visitorName) => { 554 | // place your code here 555 | }); 556 | } 557 | } 558 | ``` 559 | 560 |
561 | 562 | ## onFileUpload 563 | Callback function invoked when a file is uploaded. The link to the uploaded file is passed to the function. This callback is not supported in pop out chat window. 564 | 565 | `Composition API` 566 | ```html 567 | 574 | ``` 575 | 576 | `Options API` 577 | ```js 578 | export default { 579 | inject : ['onFileUpload'], 580 | 581 | mounted() { 582 | this.onFileUpload((link) => { 583 | // place your code here 584 | }); 585 | } 586 | } 587 | ``` 588 | 589 |
590 | 591 | ## onTagsUpdated 592 | Callback function invoked when a tag is updated. 593 | 594 | `Composition API` 595 | ```html 596 | 603 | ``` 604 | 605 | `Options API` 606 | ```js 607 | export default { 608 | inject : ['onTagsUpdated'], 609 | 610 | mounted() { 611 | this.onTagsUpdated((data) => { 612 | // place your code here 613 | }); 614 | } 615 | } 616 | ``` 617 | 618 |
619 | 620 | ## onUnreadCountChanged 621 | Callback function returns count of unread messages. 622 | 623 | `Composition API` 624 | ```html 625 | 632 | ``` 633 | 634 | `Options API` 635 | ```js 636 | export default { 637 | inject : ['onUnreadCountChanged'], 638 | 639 | mounted() { 640 | this.onUnreadCountChanged((count) => { 641 | // place your code here 642 | }); 643 | } 644 | } 645 | ``` 646 | 647 |
648 | 649 | ## visitor 650 | Object used to set the visitor name and email. Do not place this object in a function, as the values need to be available before the widget script is downloaded. 651 | 652 | Setting or changing the values after the widget script has been downloaded will not send the values to the dashboard. 653 | 654 | If the name and email will not be available on load time (eg single page app, ajax login), then use the [setAttributes](#setAttributes) function instead. 655 | 656 | `Composition API` 657 | ```html 658 | 666 | ``` 667 | 668 | `Options API` 669 | ```js 670 | export default { 671 | inject : ['visitor'], 672 | 673 | mounted() { 674 | this.visitor({ 675 | name : 'Name', 676 | email : 'email@email.com' 677 | }); 678 | } 679 | } 680 | ``` 681 | 682 |
683 | 684 | ## autoStart 685 | If set to true, it will auto-start the Tawk socket connection for chat services. If set to false, 686 | you will need to manually call the start API. It will not register and connect to the dashboard 687 | if this is set to false. 688 | 689 | ```js 690 | import TawkMessengerVue from '@tawk.to/tawk-messenger-vue-3'; 691 | 692 | app.use(TawkMessengerVue, { 693 | propertyId : 'property_id', 694 | widgetId : 'widget_id', 695 | autoStart : false 696 | }); 697 | ``` 698 | 699 |
700 | 701 | ## start 702 | Start the tawk socket connection. 703 | 704 | `Composition API` 705 | ```html 706 | 712 | ``` 713 | 714 | `Options API` 715 | ```js 716 | export default { 717 | inject : ['start', 'onLoad'], 718 | 719 | mounted() { 720 | this.start(); 721 | } 722 | } 723 | ``` 724 | 725 |
726 | 727 | ## shutdown 728 | End the tawk socket connection. 729 | 730 | `Composition API` 731 | ```html 732 | 738 | ``` 739 | 740 | `Options API` 741 | ```js 742 | export default { 743 | inject : ['shutdown', 'onLoad'], 744 | 745 | mounted() { 746 | this.shutdown(); 747 | } 748 | } 749 | ``` 750 | 751 |
752 | 753 | ## maximize 754 | Maximizes the chat widget. 755 | 756 | `Composition API` 757 | ```html 758 | 766 | ``` 767 | 768 | `Options API` 769 | ```js 770 | export default { 771 | inject : ['maximize', 'onLoad'], 772 | 773 | mounted() { 774 | this.onLoad(() => { 775 | this.maximize(); 776 | }); 777 | } 778 | } 779 | ``` 780 | 781 |
782 | 783 | ## minimize 784 | Minimizes the chat widget. 785 | 786 | `Composition API` 787 | ```html 788 | 796 | ``` 797 | 798 | `Options API` 799 | ```js 800 | export default { 801 | inject : ['minimize', 'onLoad'], 802 | 803 | mounted() { 804 | this.onLoad(() => { 805 | this.minimize(); 806 | }); 807 | } 808 | } 809 | ``` 810 | 811 |
812 | 813 | ## toggle 814 | Minimizes or Maximizes the chat widget based on the current state. 815 | 816 | `Composition API` 817 | ```html 818 | 826 | ``` 827 | 828 | `Options API` 829 | ```js 830 | export default { 831 | inject : ['toggle', 'onLoad'], 832 | 833 | mounted() { 834 | this.onLoad(() => { 835 | this.toggle(); 836 | }); 837 | } 838 | } 839 | ``` 840 | 841 |
842 | 843 | ## popup 844 | Opens the chat widget as a pop out. 845 | 846 | `Composition API` 847 | ```html 848 | 856 | ``` 857 | 858 | `Options API` 859 | ```js 860 | export default { 861 | inject : ['popup', 'onLoad'], 862 | 863 | mounted() { 864 | this.onLoad(() => { 865 | this.popup(); 866 | }); 867 | } 868 | } 869 | ``` 870 | 871 |
872 | 873 | ## getWindowType 874 | Returns the current widget type whether it’s inline or embed. 875 | 876 | `Composition API` 877 | ```html 878 | 890 | ``` 891 | 892 | `Options API` 893 | ```js 894 | export default { 895 | inject : ['getWindowType', 'onLoad'], 896 | 897 | mounted() { 898 | this.onLoad(() => { 899 | if (this.getWindowType() === 'inline') { 900 | // do something if it's inline 901 | } else { 902 | // do something if it's embed 903 | } 904 | }); 905 | } 906 | } 907 | ``` 908 | 909 |
910 | 911 | ## showWidget 912 | Shows the chat widget. 913 | 914 | `Composition API` 915 | ```html 916 | 924 | ``` 925 | 926 | `Options API` 927 | ```js 928 | export default { 929 | inject : ['showWidget', 'onLoad'], 930 | 931 | mounted() { 932 | this.onLoad(() => { 933 | this.showWidget(); 934 | }); 935 | } 936 | } 937 | ``` 938 | 939 |
940 | 941 | ## hideWidget 942 | Hide the chat widget. 943 | 944 | `Composition API` 945 | ```html 946 | 954 | ``` 955 | 956 | `Options API` 957 | ```js 958 | export default { 959 | inject : ['hideWidget', 'onLoad'], 960 | 961 | mounted() { 962 | this.onLoad(() => { 963 | this.hideWidget(); 964 | }); 965 | } 966 | } 967 | ``` 968 | 969 |
970 | 971 | ## toggleVisibility 972 | Hides or Shows the chat widget based on the current visibility state. 973 | 974 | `Composition API` 975 | ```html 976 | 984 | ``` 985 | 986 | `Options API` 987 | ```js 988 | export default { 989 | inject : ['toggleVisibility', 'onLoad'], 990 | 991 | mounted() { 992 | this.onLoad(() => { 993 | this.toggleVisibility(); 994 | }); 995 | } 996 | } 997 | ``` 998 | 999 |
1000 | 1001 | ## getStatus 1002 | Returns the current page status (online, away or offline). 1003 | 1004 | `Composition API` 1005 | ```html 1006 | 1020 | ``` 1021 | 1022 | `Options API` 1023 | ```js 1024 | export default { 1025 | inject : ['getStatus', 'onLoad'], 1026 | 1027 | mounted() { 1028 | this.onLoad(() => { 1029 | if (this.getStatus() === 'online') { 1030 | // do something for online 1031 | } else if (this.getStatus() === 'away') { 1032 | // do something for away 1033 | } else { 1034 | // do something for offline 1035 | } 1036 | }); 1037 | } 1038 | } 1039 | ``` 1040 | 1041 |
1042 | 1043 | ## isChatMaximized 1044 | Returns a boolean value (true or false) indicating whether the chat widget is maximized. 1045 | 1046 | `Composition API` 1047 | ```html 1048 | 1058 | ``` 1059 | 1060 | `Options API` 1061 | ```js 1062 | export default { 1063 | inject : ['isChatMaximized', 'onLoad'], 1064 | 1065 | mounted() { 1066 | this.onLoad(() => { 1067 | if (this.isChatMaximized()) { 1068 | // do something if it's maximized 1069 | } 1070 | }); 1071 | } 1072 | } 1073 | ``` 1074 | 1075 |
1076 | 1077 | ## isChatMinimized 1078 | Returns a boolean value (true or false) indicating whether the chat widget is minimized. 1079 | 1080 | `Composition API` 1081 | ```html 1082 | 1092 | ``` 1093 | 1094 | `Options API` 1095 | ```js 1096 | export default { 1097 | inject : ['isChatMinimized', 'onLoad'], 1098 | 1099 | mounted() { 1100 | this.onLoad(() => { 1101 | if(this.isChatMinimized()) { 1102 | // do something if it's minimized 1103 | } 1104 | }); 1105 | } 1106 | } 1107 | ``` 1108 | 1109 |
1110 | 1111 | ## isChatHidden 1112 | Returns a boolean value (true or false) indicating whether the chat widget is hidden. 1113 | 1114 | `Composition API` 1115 | ```html 1116 | 1126 | ``` 1127 | 1128 | `Options API` 1129 | ```js 1130 | export default { 1131 | inject : ['isChatHidden', 'onLoad'], 1132 | 1133 | mounted() { 1134 | this.onLoad(() => { 1135 | if(this.isChatHidden()) { 1136 | // do something if chat widget is hidden 1137 | } 1138 | }); 1139 | } 1140 | } 1141 | ``` 1142 | 1143 |
1144 | 1145 | ## isChatOngoing 1146 | Returns a boolean value (true or false) indicating whether currently there is an ongoing chat. 1147 | 1148 | `Composition API` 1149 | ```html 1150 | 1160 | ``` 1161 | 1162 | `Options API` 1163 | ```js 1164 | export default { 1165 | inject : ['isChatOngoing', 'onLoad'], 1166 | 1167 | mounted() { 1168 | this.onLoad(() => { 1169 | if(this.isChatOngoing()) { 1170 | // do something if there's ongoing chat 1171 | } 1172 | }); 1173 | } 1174 | } 1175 | ``` 1176 | 1177 |
1178 | 1179 | ## isVisitorEngaged 1180 | Returns a boolean value (true or false) indicating whether the visitor is currently chatting or has requested a chat. 1181 | 1182 | `Composition API` 1183 | ```html 1184 | 1194 | ``` 1195 | 1196 | `Options API` 1197 | ```js 1198 | export default { 1199 | inject : ['isVisitorEngaged', 'onLoad'], 1200 | 1201 | mounted() { 1202 | this.onLoad(() => { 1203 | if(this.isVisitorEngaged()) { 1204 | // do something if visitor engaged in chat 1205 | } 1206 | }); 1207 | } 1208 | } 1209 | ``` 1210 | 1211 |
1212 | 1213 | ## onLoaded 1214 | Returns a boolean value (true or undefined) indicating when the plugin is ready. 1215 | 1216 | `Composition API` 1217 | ```html 1218 | 1225 | ``` 1226 | 1227 | `Options API` 1228 | ```js 1229 | export default { 1230 | inject : ['onLoaded'], 1231 | 1232 | mounted() { 1233 | if(this.onLoaded()) { 1234 | // do something when widget is loaded 1235 | } 1236 | } 1237 | } 1238 | ``` 1239 | 1240 | ## onBeforeLoaded 1241 | Returns a boolean value (true or undefined) indicating when plugin is initialize. 1242 | 1243 | `Composition API` 1244 | ```html 1245 | 1252 | ``` 1253 | 1254 | `Options API` 1255 | ```js 1256 | export default { 1257 | inject : ['onBeforeLoaded'], 1258 | 1259 | mounted() { 1260 | if(this.onBeforeLoaded()) { 1261 | // do something before onload 1262 | } 1263 | } 1264 | } 1265 | ``` 1266 | 1267 | ## widgetPosition 1268 | Returns a string for current position of the widget. 1269 | 1270 | `Composition API` 1271 | ```html 1272 | 1282 | ``` 1283 | 1284 | `Options API` 1285 | ```js 1286 | export default { 1287 | inject : ['widgetPosition', 'onLoad'], 1288 | 1289 | mounted() { 1290 | this.onLoad(() => { 1291 | if(this.widgetPosition() === 'br') { 1292 | // do something if the widget is at bottom right 1293 | } 1294 | }); 1295 | } 1296 | } 1297 | ``` 1298 | 1299 |
1300 | 1301 | ## endChat 1302 | Ends the current ongoing chat. 1303 | 1304 | `Composition API` 1305 | ```html 1306 | 1314 | ``` 1315 | 1316 | `Options API` 1317 | ```js 1318 | export default { 1319 | inject : ['endChat', 'onLoad'], 1320 | 1321 | mounted() { 1322 | this.onLoad(() => { 1323 | this.endChat(); 1324 | }); 1325 | } 1326 | } 1327 | ``` 1328 | 1329 | 1330 |
1331 | 1332 | ## setAttributes 1333 | Set custom metadata regarding this chat/visitor. 1334 | 1335 | This function takes in two values: attribute and callback. 1336 | 1337 | The attribute value is of the object data type, which is a key value pair. 1338 | 1339 | The key is of the string data type and can contain only alphanumeric characters and ‘-‘ (dash). 1340 | 1341 | You can also use this function to set the visitor name and email. However, you will need to enable the secure mode first and also supply the calculated hash value in this function. 1342 | 1343 | Refer to the secure mode section below on how to do this. 1344 | 1345 | The reason it needs to be in [secure mode](#securemode) is to ensure data integrity — to ensure the value sent from the widget to the dashboard is true and has not been tampered with. 1346 | 1347 | The callback, which is a function, will be invoked to notify whether the save failed. 1348 | 1349 | Error messages returned: 1350 | 1351 | 1. INVALID_ATTRIBUTES: No attributes were sent 1352 | 1. SESSION_EXPIRED: The visitor’s current session has expired 1353 | 1. SERVER_ERROR: Internal server error 1354 | 1. ACCESS_ERROR: Error in accessing the page 1355 | 1. ATTRIBUTE_LIMIT_EXCEEDED: Total custom attributes (excluding name, email and hash) is 50 1356 | 1. CONTAINS_INVALID_KEY: Custom key is not alphanumeric or dash (keys will be lower case) 1357 | 1. CONTAINS_INVALID_VALUE: Custom value is empty or the total length is more than 255 characters 1358 | 1359 | `Composition API` 1360 | ```html 1361 | 1375 | ``` 1376 | 1377 | `Options API` 1378 | ```js 1379 | export default { 1380 | inject : ['setAttributes', 'onLoad'], 1381 | 1382 | mounted() { 1383 | this.onLoad(() => { 1384 | this.setAttributes({ 1385 | id : 'A1234', 1386 | store : 'Midvalley', 1387 | hash : 'hash value' // Optional 1388 | }, function(error) { 1389 | // do something if error 1390 | }); 1391 | }); 1392 | } 1393 | } 1394 | ``` 1395 | 1396 |
1397 | 1398 | ## addEvent 1399 | Set a custom event to chat. 1400 | This function takes in 3 values: event name, optional metadata and callback. 1401 | 1402 | The event name is of the string data type and can contain only alphanumeric characters and ‘-‘ (dash) 1403 | 1404 | The callback which is a function will be invoked to notify whether the save failed. 1405 | 1406 | INVALID_EVENT_NAME, INVALID_ATTRIBUTES, ATTRIBUTE_LIMIT_EXCEEDED, CONTAINS_INVALID_KEY, CONTAINS_INVALID_VALUE, SESSION_EXPIRED, SERVER_ERROR 1407 | 1408 | `Composition API` 1409 | ```html 1410 | 1428 | ``` 1429 | 1430 | `Options API` 1431 | ```js 1432 | export default { 1433 | inject : ['addEvent', 'onLoad'], 1434 | 1435 | mounted() { 1436 | this.onLoad(() => { 1437 | this.addEvent( 1438 | 'requested-quotation', 1439 | { 1440 | skU : 'A0012', 1441 | name : 'Jeans', 1442 | price : '50' 1443 | }, 1444 | function(error) { 1445 | // do something if error 1446 | } 1447 | ); 1448 | }); 1449 | } 1450 | } 1451 | ``` 1452 | 1453 |
1454 | 1455 | ## addTags 1456 | Add tags to the chat. 1457 | This function takes in two values; tags and callback. 1458 | This is of the array data type. 1459 | The content of the tags should be of the string data type. 1460 | 1461 | The total number of tags is 10. 1462 | The callback, which is a function, will be invoked to notify whether the save failed. 1463 | 1464 | INVALID_TAGS, TAG_LIMIT_EXCEEDED, VERSION_CONFLICT, SESSION_EXPIRED, SERVER_ERROR 1465 | 1466 | `Composition API` 1467 | ```html 1468 | 1481 | ``` 1482 | 1483 | `Options API` 1484 | ```js 1485 | export default { 1486 | inject : ['addTags', 'onLoad'], 1487 | 1488 | mounted() { 1489 | this.onLoad(() => { 1490 | this.addTags([ 1491 | 'hello', 1492 | 'world' 1493 | ], function(error) { 1494 | // do something if error 1495 | }); 1496 | }); 1497 | } 1498 | } 1499 | ``` 1500 | 1501 |
1502 | 1503 | ## removeTags 1504 | Remove tags from the chat. 1505 | This function takes in two values: tags and callback. 1506 | This is of the array data type. 1507 | The content of the tags should be of the string data type. 1508 | 1509 | The callback, which is a function, will be invoked to notify whether the save failed. 1510 | 1511 | INVALID_TAGS, TAG_LIMIT_EXCEEDED, SESSION_EXPIRED, SERVER_ERROR 1512 | 1513 | `Composition API` 1514 | ```html 1515 | 1528 | ``` 1529 | 1530 | `Options API` 1531 | ```js 1532 | export default { 1533 | inject : ['removeTags', 'onLoad'], 1534 | 1535 | mounted() { 1536 | this.onLoad(() => { 1537 | this.removeTags([ 1538 | 'hello', 1539 | 'world' 1540 | ], function(error) { 1541 | // do something if error 1542 | }); 1543 | }); 1544 | } 1545 | } 1546 | ``` 1547 | 1548 |
1549 | 1550 | ## secureMode 1551 | Secure method is to ensure the data you are sending is actually from you. 1552 | 1553 | To enable secure mode, embed following code on your page. 1554 | 1555 | The hash is server side generated HMAC using SHA256, the user’s email and your site’s API key. 1556 | 1557 | You can get your API key from **Admin>Property Settings**. 1558 | 1559 | `Composition API` 1560 | ```html 1561 | 1570 | ``` 1571 | 1572 | `Options API` 1573 | ```js 1574 | export default { 1575 | inject : ['visitor'], 1576 | 1577 | mounted() { 1578 | this.visitor({ 1579 | name : 'Name', 1580 | email : 'email@email.com', 1581 | hash : '' 1582 | }); 1583 | } 1584 | } 1585 | ``` 1586 | 1587 |
1588 | 1589 | ## customstyle 1590 | Object used to update the widget styling. Currently only supports zIndex style. Do not place this object in a function, as the values need to be available before the widget script is downloaded. Setting or changing the values after the widget script has been downloaded will not update the widget’s style. 1591 | 1592 | ### zIndex 1593 | ```js 1594 | // ZIndex 1595 | app.use(TawkMessengerVue, { 1596 | customStyle : { 1597 | zIndex : Integer | String 1598 | } 1599 | }); 1600 | 1601 | // Example 1602 | 1603 | app.use(TawkMessengerVue, { 1604 | customStyle : { 1605 | zIndex : 1000 1606 | } 1607 | }); 1608 | 1609 | app.use(TawkMessengerVue, { 1610 | customStyle : { 1611 | zIndex : '1000' 1612 | } 1613 | }); 1614 | 1615 | app.use(TawkMessengerVue, { 1616 | customStyle : { 1617 | zIndex : '1000 !important' 1618 | } 1619 | }); 1620 | ``` 1621 | 1622 |
1623 | 1624 | ### Visibility 1625 | ```js 1626 | // ZIndex 1627 | app.use(TawkMessengerVue, { 1628 | customStyle : { 1629 | visibility : { 1630 | desktop : { 1631 | xOffset : String | Integer, // '20' || 20 1632 | yOffset : String | Integer, 1633 | position : '' // 'br', 'bl', 'cr', 'cl', 'tr', 'tl' 1634 | }, 1635 | 1636 | mobile : { 1637 | xOffset : String | Integer, // '20' || 20 1638 | yOffset : String | Integer, 1639 | position : '' // 'br', 'bl', 'cr', 'cl', 'tr', 'tl' 1640 | } 1641 | } 1642 | } 1643 | }); 1644 | 1645 | // Example 1646 | 1647 | app.use(TawkMessengerVue, { 1648 | customStyle : { 1649 | visibility : { 1650 | desktop : { 1651 | xOffset : '15', 1652 | yOffset : '15', 1653 | position : 'cr' 1654 | }, 1655 | 1656 | mobile : { 1657 | xOffset : 15, 1658 | yOffset : 15, 1659 | position : 'bl' 1660 | } 1661 | } 1662 | } 1663 | }); 1664 | ``` 1665 | 1666 |
1667 | 1668 | ## switchWidget 1669 | Disconnect the current widget connection, logout if it has existing user login and switch to 1670 | another widget. 1671 | 1672 | `Composition API` 1673 | ```html 1674 | 1684 | ``` 1685 | 1686 | `Options API` 1687 | ```js 1688 | export default { 1689 | inject : ['switchWidget'], 1690 | 1691 | mounted() { 1692 | this.switchWidget({ 1693 | propertyId : 'your-property-id', 1694 | widgetId : 'your-widget-id' 1695 | }, function() { 1696 | // do something 1697 | }); 1698 | } 1699 | } 1700 | ``` 1701 | -------------------------------------------------------------------------------- /docs/spa-setup.md: -------------------------------------------------------------------------------- 1 | # Single Page Application 2 | Here are the basic of how to use callbacks and expose functions from the plugin. 3 | 4 |
5 | 6 | ## Inject function 7 | To access the provided functions from the plugin, use the `inject()` function 8 | 9 | ```html 10 | // Composition API 11 | 18 | ``` 19 | 20 | ```html 21 | // Options API 22 | 31 | ``` 32 | 33 |
34 | 35 | ## Event handling 36 | You can listen on events emitted by the plugin by Injecting the function using `inject()`, 37 | It must be exactly match the name used to listen to that event, you can see the list of 38 | [events](api-reference.md) here. 39 | 40 | ```html 41 | // Composition API 42 | 51 | ``` 52 | 53 | ```html 54 | // Options API 55 | 66 | ``` 67 | 68 |

69 | You can see the list of APIs in [API reference](api-reference.md). 70 | -------------------------------------------------------------------------------- /docs/ssr-setup.md: -------------------------------------------------------------------------------- 1 | # Server Side Rendering 2 | The plugin is fully compatible in Nuxt 3, but we need to setup few things. 3 | 4 |
5 | 6 | ## Setup 7 | Create a file **tawk-messenger.client.js** in **plugins/** directory in your project, and add the 8 | code below. 9 | 10 | ```js 11 | import TawkMessengerVue from '@tawk.to/tawk-messenger-vue-3'; 12 | 13 | export default defineNuxtPlugin((nuxtApp) => { 14 | nuxtApp.vueApp.use(TawkMessengerVue, { 15 | propertyId : 'property_id', 16 | widgetId : 'widget_id' 17 | }); 18 | }); 19 | ``` 20 | 21 |
22 | 23 | ## Instance property 24 | To access the API functions, call the **$tawkMessenger** anywhere in your components. 25 | 26 | `Options API` 27 | ```js 28 | export default { 29 | inject ['onLoad', 'toggle'], 30 | 31 | mounted() { 32 | this.onLoad(() => { 33 | this.toggle(); 34 | }); 35 | } 36 | }; 37 | ``` 38 | 39 |
40 | 41 | ## Event handling 42 | You can listen on events emitted by the plugin, It must be exactly match the name used to listen 43 | to that event. 44 | 45 | `Options API` 46 | ```js 47 | export default { 48 | inject ['onLoad', 'toggle'], 49 | 50 | mounted() { 51 | this.onLoad(() => { 52 | // place your code here 53 | }); 54 | } 55 | }; 56 | ``` 57 | 58 |
59 | 60 | You can see the list of APIs in [API reference](api-reference.md). 61 | -------------------------------------------------------------------------------- /images/tawk-vue-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tawk/tawk-messenger-vue-3/eaa5b140e0ae0aeaae074122d49304b657a0ac00/images/tawk-vue-logo.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@tawk.to/tawk-messenger-vue-3", 3 | "version": "1.0.3", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/parser": { 8 | "version": "7.17.9", 9 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", 10 | "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" 11 | }, 12 | "@bcoe/v8-coverage": { 13 | "version": "0.2.3", 14 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 15 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 16 | "dev": true 17 | }, 18 | "@eslint/eslintrc": { 19 | "version": "1.2.1", 20 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", 21 | "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", 22 | "dev": true, 23 | "requires": { 24 | "ajv": "^6.12.4", 25 | "debug": "^4.3.2", 26 | "espree": "^9.3.1", 27 | "globals": "^13.9.0", 28 | "ignore": "^5.2.0", 29 | "import-fresh": "^3.2.1", 30 | "js-yaml": "^4.1.0", 31 | "minimatch": "^3.0.4", 32 | "strip-json-comments": "^3.1.1" 33 | } 34 | }, 35 | "@humanwhocodes/config-array": { 36 | "version": "0.9.5", 37 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", 38 | "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", 39 | "dev": true, 40 | "requires": { 41 | "@humanwhocodes/object-schema": "^1.2.1", 42 | "debug": "^4.1.1", 43 | "minimatch": "^3.0.4" 44 | } 45 | }, 46 | "@humanwhocodes/object-schema": { 47 | "version": "1.2.1", 48 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 49 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 50 | "dev": true 51 | }, 52 | "@istanbuljs/schema": { 53 | "version": "0.1.3", 54 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 55 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 56 | "dev": true 57 | }, 58 | "@jridgewell/resolve-uri": { 59 | "version": "3.0.5", 60 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", 61 | "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", 62 | "dev": true 63 | }, 64 | "@jridgewell/sourcemap-codec": { 65 | "version": "1.4.11", 66 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", 67 | "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", 68 | "dev": true 69 | }, 70 | "@jridgewell/trace-mapping": { 71 | "version": "0.3.9", 72 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 73 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 74 | "dev": true, 75 | "requires": { 76 | "@jridgewell/resolve-uri": "^3.0.3", 77 | "@jridgewell/sourcemap-codec": "^1.4.10" 78 | } 79 | }, 80 | "@rushstack/eslint-patch": { 81 | "version": "1.1.2", 82 | "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.2.tgz", 83 | "integrity": "sha512-oe5WJEDaVsW8fBlGT7udrSCgOwWfoYHQOmSpnh8X+0GXpqqcRCP8k4y+Dxb0taWJDPpB+rdDUtumIiBwkY9qGA==", 84 | "dev": true 85 | }, 86 | "@tootallnate/once": { 87 | "version": "2.0.0", 88 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", 89 | "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", 90 | "dev": true 91 | }, 92 | "@types/chai": { 93 | "version": "4.3.0", 94 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", 95 | "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==", 96 | "dev": true 97 | }, 98 | "@types/chai-subset": { 99 | "version": "1.3.3", 100 | "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", 101 | "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", 102 | "dev": true, 103 | "requires": { 104 | "@types/chai": "*" 105 | } 106 | }, 107 | "@types/istanbul-lib-coverage": { 108 | "version": "2.0.4", 109 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", 110 | "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", 111 | "dev": true 112 | }, 113 | "@vitejs/plugin-vue": { 114 | "version": "2.3.1", 115 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.1.tgz", 116 | "integrity": "sha512-YNzBt8+jt6bSwpt7LP890U1UcTOIZZxfpE5WOJ638PNxSEKOqAi0+FSKS0nVeukfdZ0Ai/H7AFd6k3hayfGZqQ==", 117 | "dev": true 118 | }, 119 | "@vue/compiler-core": { 120 | "version": "3.2.33", 121 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.33.tgz", 122 | "integrity": "sha512-AAmr52ji3Zhk7IKIuigX2osWWsb2nQE5xsdFYjdnmtQ4gymmqXbjLvkSE174+fF3A3kstYrTgGkqgOEbsdLDpw==", 123 | "requires": { 124 | "@babel/parser": "^7.16.4", 125 | "@vue/shared": "3.2.33", 126 | "estree-walker": "^2.0.2", 127 | "source-map": "^0.6.1" 128 | } 129 | }, 130 | "@vue/compiler-dom": { 131 | "version": "3.2.33", 132 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.33.tgz", 133 | "integrity": "sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ==", 134 | "requires": { 135 | "@vue/compiler-core": "3.2.33", 136 | "@vue/shared": "3.2.33" 137 | } 138 | }, 139 | "@vue/compiler-sfc": { 140 | "version": "3.2.33", 141 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.33.tgz", 142 | "integrity": "sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q==", 143 | "requires": { 144 | "@babel/parser": "^7.16.4", 145 | "@vue/compiler-core": "3.2.33", 146 | "@vue/compiler-dom": "3.2.33", 147 | "@vue/compiler-ssr": "3.2.33", 148 | "@vue/reactivity-transform": "3.2.33", 149 | "@vue/shared": "3.2.33", 150 | "estree-walker": "^2.0.2", 151 | "magic-string": "^0.25.7", 152 | "postcss": "^8.1.10", 153 | "source-map": "^0.6.1" 154 | } 155 | }, 156 | "@vue/compiler-ssr": { 157 | "version": "3.2.33", 158 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.33.tgz", 159 | "integrity": "sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ==", 160 | "requires": { 161 | "@vue/compiler-dom": "3.2.33", 162 | "@vue/shared": "3.2.33" 163 | } 164 | }, 165 | "@vue/eslint-config-prettier": { 166 | "version": "7.0.0", 167 | "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-7.0.0.tgz", 168 | "integrity": "sha512-/CTc6ML3Wta1tCe1gUeO0EYnVXfo3nJXsIhZ8WJr3sov+cGASr6yuiibJTL6lmIBm7GobopToOuB3B6AWyV0Iw==", 169 | "dev": true, 170 | "requires": { 171 | "eslint-config-prettier": "^8.3.0", 172 | "eslint-plugin-prettier": "^4.0.0" 173 | } 174 | }, 175 | "@vue/reactivity": { 176 | "version": "3.2.33", 177 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.33.tgz", 178 | "integrity": "sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ==", 179 | "requires": { 180 | "@vue/shared": "3.2.33" 181 | } 182 | }, 183 | "@vue/reactivity-transform": { 184 | "version": "3.2.33", 185 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.33.tgz", 186 | "integrity": "sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw==", 187 | "requires": { 188 | "@babel/parser": "^7.16.4", 189 | "@vue/compiler-core": "3.2.33", 190 | "@vue/shared": "3.2.33", 191 | "estree-walker": "^2.0.2", 192 | "magic-string": "^0.25.7" 193 | } 194 | }, 195 | "@vue/runtime-core": { 196 | "version": "3.2.33", 197 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.33.tgz", 198 | "integrity": "sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw==", 199 | "requires": { 200 | "@vue/reactivity": "3.2.33", 201 | "@vue/shared": "3.2.33" 202 | } 203 | }, 204 | "@vue/runtime-dom": { 205 | "version": "3.2.33", 206 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.33.tgz", 207 | "integrity": "sha512-LSrJ6W7CZTSUygX5s8aFkraDWlO6K4geOwA3quFF2O+hC3QuAMZt/0Xb7JKE3C4JD4pFwCSO7oCrZmZ0BIJUnw==", 208 | "requires": { 209 | "@vue/runtime-core": "3.2.33", 210 | "@vue/shared": "3.2.33", 211 | "csstype": "^2.6.8" 212 | } 213 | }, 214 | "@vue/server-renderer": { 215 | "version": "3.2.33", 216 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.33.tgz", 217 | "integrity": "sha512-4jpJHRD4ORv8PlbYi+/MfP8ec1okz6rybe36MdpkDrGIdEItHEUyaHSKvz+ptNEyQpALmmVfRteHkU9F8vxOew==", 218 | "requires": { 219 | "@vue/compiler-ssr": "3.2.33", 220 | "@vue/shared": "3.2.33" 221 | } 222 | }, 223 | "@vue/shared": { 224 | "version": "3.2.33", 225 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.33.tgz", 226 | "integrity": "sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==" 227 | }, 228 | "@vue/test-utils": { 229 | "version": "2.0.0-rc.19", 230 | "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.0.0-rc.19.tgz", 231 | "integrity": "sha512-vQ/34z9NH/pqJzl9YTWtTq/vrx5JzLbMojcBB0qydeb7FtGqxp11nLYCgVso+pa8ZOSn2j+OQfjc5aBnb32uzw==", 232 | "dev": true 233 | }, 234 | "abab": { 235 | "version": "2.0.5", 236 | "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", 237 | "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", 238 | "dev": true 239 | }, 240 | "acorn": { 241 | "version": "8.7.0", 242 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", 243 | "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", 244 | "dev": true 245 | }, 246 | "acorn-globals": { 247 | "version": "6.0.0", 248 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", 249 | "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", 250 | "dev": true, 251 | "requires": { 252 | "acorn": "^7.1.1", 253 | "acorn-walk": "^7.1.1" 254 | }, 255 | "dependencies": { 256 | "acorn": { 257 | "version": "7.4.1", 258 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 259 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 260 | "dev": true 261 | } 262 | } 263 | }, 264 | "acorn-jsx": { 265 | "version": "5.3.2", 266 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 267 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 268 | "dev": true 269 | }, 270 | "acorn-walk": { 271 | "version": "7.2.0", 272 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 273 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 274 | "dev": true 275 | }, 276 | "agent-base": { 277 | "version": "6.0.2", 278 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 279 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 280 | "dev": true, 281 | "requires": { 282 | "debug": "4" 283 | } 284 | }, 285 | "ajv": { 286 | "version": "6.12.6", 287 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 288 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 289 | "dev": true, 290 | "requires": { 291 | "fast-deep-equal": "^3.1.1", 292 | "fast-json-stable-stringify": "^2.0.0", 293 | "json-schema-traverse": "^0.4.1", 294 | "uri-js": "^4.2.2" 295 | } 296 | }, 297 | "ansi-regex": { 298 | "version": "5.0.1", 299 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 300 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 301 | "dev": true 302 | }, 303 | "ansi-styles": { 304 | "version": "4.3.0", 305 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 306 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 307 | "dev": true, 308 | "requires": { 309 | "color-convert": "^2.0.1" 310 | } 311 | }, 312 | "argparse": { 313 | "version": "2.0.1", 314 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 315 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 316 | "dev": true 317 | }, 318 | "assertion-error": { 319 | "version": "1.1.0", 320 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 321 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 322 | "dev": true 323 | }, 324 | "asynckit": { 325 | "version": "0.4.0", 326 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 327 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 328 | "dev": true 329 | }, 330 | "balanced-match": { 331 | "version": "1.0.2", 332 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 333 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 334 | "dev": true 335 | }, 336 | "brace-expansion": { 337 | "version": "1.1.11", 338 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 339 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 340 | "dev": true, 341 | "requires": { 342 | "balanced-match": "^1.0.0", 343 | "concat-map": "0.0.1" 344 | } 345 | }, 346 | "browser-process-hrtime": { 347 | "version": "1.0.0", 348 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", 349 | "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", 350 | "dev": true 351 | }, 352 | "c8": { 353 | "version": "7.11.2", 354 | "resolved": "https://registry.npmjs.org/c8/-/c8-7.11.2.tgz", 355 | "integrity": "sha512-6ahJSrhS6TqSghHm+HnWt/8Y2+z0hM/FQyB1ybKhAR30+NYL9CTQ1uwHxuWw6U7BHlHv6wvhgOrH81I+lfCkxg==", 356 | "dev": true, 357 | "requires": { 358 | "@bcoe/v8-coverage": "^0.2.3", 359 | "@istanbuljs/schema": "^0.1.3", 360 | "find-up": "^5.0.0", 361 | "foreground-child": "^2.0.0", 362 | "istanbul-lib-coverage": "^3.2.0", 363 | "istanbul-lib-report": "^3.0.0", 364 | "istanbul-reports": "^3.1.4", 365 | "rimraf": "^3.0.2", 366 | "test-exclude": "^6.0.0", 367 | "v8-to-istanbul": "^9.0.0", 368 | "yargs": "^16.2.0", 369 | "yargs-parser": "^20.2.9" 370 | } 371 | }, 372 | "callsites": { 373 | "version": "3.1.0", 374 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 375 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 376 | "dev": true 377 | }, 378 | "chai": { 379 | "version": "4.3.6", 380 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", 381 | "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", 382 | "dev": true, 383 | "requires": { 384 | "assertion-error": "^1.1.0", 385 | "check-error": "^1.0.2", 386 | "deep-eql": "^3.0.1", 387 | "get-func-name": "^2.0.0", 388 | "loupe": "^2.3.1", 389 | "pathval": "^1.1.1", 390 | "type-detect": "^4.0.5" 391 | } 392 | }, 393 | "chalk": { 394 | "version": "4.1.2", 395 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 396 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 397 | "dev": true, 398 | "requires": { 399 | "ansi-styles": "^4.1.0", 400 | "supports-color": "^7.1.0" 401 | } 402 | }, 403 | "check-error": { 404 | "version": "1.0.2", 405 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 406 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 407 | "dev": true 408 | }, 409 | "cliui": { 410 | "version": "7.0.4", 411 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 412 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 413 | "dev": true, 414 | "requires": { 415 | "string-width": "^4.2.0", 416 | "strip-ansi": "^6.0.0", 417 | "wrap-ansi": "^7.0.0" 418 | } 419 | }, 420 | "color-convert": { 421 | "version": "2.0.1", 422 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 423 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 424 | "dev": true, 425 | "requires": { 426 | "color-name": "~1.1.4" 427 | } 428 | }, 429 | "color-name": { 430 | "version": "1.1.4", 431 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 432 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 433 | "dev": true 434 | }, 435 | "combined-stream": { 436 | "version": "1.0.8", 437 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 438 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 439 | "dev": true, 440 | "requires": { 441 | "delayed-stream": "~1.0.0" 442 | } 443 | }, 444 | "concat-map": { 445 | "version": "0.0.1", 446 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 447 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 448 | "dev": true 449 | }, 450 | "convert-source-map": { 451 | "version": "1.8.0", 452 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 453 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 454 | "dev": true, 455 | "requires": { 456 | "safe-buffer": "~5.1.1" 457 | } 458 | }, 459 | "cross-spawn": { 460 | "version": "7.0.3", 461 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 462 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 463 | "dev": true, 464 | "requires": { 465 | "path-key": "^3.1.0", 466 | "shebang-command": "^2.0.0", 467 | "which": "^2.0.1" 468 | } 469 | }, 470 | "cssom": { 471 | "version": "0.5.0", 472 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", 473 | "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", 474 | "dev": true 475 | }, 476 | "cssstyle": { 477 | "version": "2.3.0", 478 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", 479 | "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", 480 | "dev": true, 481 | "requires": { 482 | "cssom": "~0.3.6" 483 | }, 484 | "dependencies": { 485 | "cssom": { 486 | "version": "0.3.8", 487 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", 488 | "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", 489 | "dev": true 490 | } 491 | } 492 | }, 493 | "csstype": { 494 | "version": "2.6.20", 495 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", 496 | "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" 497 | }, 498 | "data-urls": { 499 | "version": "3.0.1", 500 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.1.tgz", 501 | "integrity": "sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw==", 502 | "dev": true, 503 | "requires": { 504 | "abab": "^2.0.3", 505 | "whatwg-mimetype": "^3.0.0", 506 | "whatwg-url": "^10.0.0" 507 | } 508 | }, 509 | "debug": { 510 | "version": "4.3.4", 511 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 512 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 513 | "dev": true, 514 | "requires": { 515 | "ms": "2.1.2" 516 | } 517 | }, 518 | "decimal.js": { 519 | "version": "10.3.1", 520 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", 521 | "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", 522 | "dev": true 523 | }, 524 | "deep-eql": { 525 | "version": "3.0.1", 526 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 527 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 528 | "dev": true, 529 | "requires": { 530 | "type-detect": "^4.0.0" 531 | } 532 | }, 533 | "deep-is": { 534 | "version": "0.1.4", 535 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 536 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 537 | "dev": true 538 | }, 539 | "delayed-stream": { 540 | "version": "1.0.0", 541 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 542 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 543 | "dev": true 544 | }, 545 | "doctrine": { 546 | "version": "3.0.0", 547 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 548 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 549 | "dev": true, 550 | "requires": { 551 | "esutils": "^2.0.2" 552 | } 553 | }, 554 | "domexception": { 555 | "version": "4.0.0", 556 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", 557 | "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", 558 | "dev": true, 559 | "requires": { 560 | "webidl-conversions": "^7.0.0" 561 | } 562 | }, 563 | "emoji-regex": { 564 | "version": "8.0.0", 565 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 566 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 567 | "dev": true 568 | }, 569 | "esbuild": { 570 | "version": "0.14.34", 571 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.34.tgz", 572 | "integrity": "sha512-QIWdPT/gFF6hCaf4m7kP0cJ+JIuFkdHibI7vVFvu3eJS1HpVmYHWDulyN5WXwbRA0SX/7ZDaJ/1DH8SdY9xOJg==", 573 | "dev": true, 574 | "requires": { 575 | "esbuild-android-64": "0.14.34", 576 | "esbuild-android-arm64": "0.14.34", 577 | "esbuild-darwin-64": "0.14.34", 578 | "esbuild-darwin-arm64": "0.14.34", 579 | "esbuild-freebsd-64": "0.14.34", 580 | "esbuild-freebsd-arm64": "0.14.34", 581 | "esbuild-linux-32": "0.14.34", 582 | "esbuild-linux-64": "0.14.34", 583 | "esbuild-linux-arm": "0.14.34", 584 | "esbuild-linux-arm64": "0.14.34", 585 | "esbuild-linux-mips64le": "0.14.34", 586 | "esbuild-linux-ppc64le": "0.14.34", 587 | "esbuild-linux-riscv64": "0.14.34", 588 | "esbuild-linux-s390x": "0.14.34", 589 | "esbuild-netbsd-64": "0.14.34", 590 | "esbuild-openbsd-64": "0.14.34", 591 | "esbuild-sunos-64": "0.14.34", 592 | "esbuild-windows-32": "0.14.34", 593 | "esbuild-windows-64": "0.14.34", 594 | "esbuild-windows-arm64": "0.14.34" 595 | } 596 | }, 597 | "esbuild-android-64": { 598 | "version": "0.14.34", 599 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.34.tgz", 600 | "integrity": "sha512-XfxcfJqmMYsT/LXqrptzFxmaR3GWzXHDLdFNIhm6S00zPaQF1TBBWm+9t0RZ6LRR7iwH57DPjaOeW20vMqI4Yw==", 601 | "dev": true, 602 | "optional": true 603 | }, 604 | "esbuild-android-arm64": { 605 | "version": "0.14.34", 606 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.34.tgz", 607 | "integrity": "sha512-T02+NXTmSRL1Mc6puz+R9CB54rSPICkXKq6+tw8B6vxZFnCPzbJxgwIX4kcluz9p8nYBjF3+lSilTGWb7+Xgew==", 608 | "dev": true, 609 | "optional": true 610 | }, 611 | "esbuild-darwin-64": { 612 | "version": "0.14.34", 613 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.34.tgz", 614 | "integrity": "sha512-pLRip2Bh4Ng7Bf6AMgCrSp3pPe/qZyf11h5Qo2mOfJqLWzSVjxrXW+CFRJfrOVP7TCnh/gmZSM2AFdCPB72vtw==", 615 | "dev": true, 616 | "optional": true 617 | }, 618 | "esbuild-darwin-arm64": { 619 | "version": "0.14.34", 620 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.34.tgz", 621 | "integrity": "sha512-vpidSJEBxx6lf1NWgXC+DCmGqesJuZ5Y8aQVVsaoO4i8tRXbXb0whChRvop/zd3nfNM4dIl5EXAky0knRX5I6w==", 622 | "dev": true, 623 | "optional": true 624 | }, 625 | "esbuild-freebsd-64": { 626 | "version": "0.14.34", 627 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.34.tgz", 628 | "integrity": "sha512-m0HBjePhe0hAQJgtMRMNV9kMgIyV4/qSnzPx42kRMQBcPhgjAq1JRu4Il26czC+9FgpMbFkUktb07f/Lwnc6CA==", 629 | "dev": true, 630 | "optional": true 631 | }, 632 | "esbuild-freebsd-arm64": { 633 | "version": "0.14.34", 634 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.34.tgz", 635 | "integrity": "sha512-cpRc2B94L1KvMPPYB4D6G39jLqpKlD3noAMY4/e86iXXXkhUYJJEtTuyNFTa9JRpWM0xCAp4mxjHjoIiLuoCLA==", 636 | "dev": true, 637 | "optional": true 638 | }, 639 | "esbuild-linux-32": { 640 | "version": "0.14.34", 641 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.34.tgz", 642 | "integrity": "sha512-8nQaEaoW7MH/K/RlozJa+lE1ejHIr8fuPIHhc513UebRav7HtXgQvxHQ6VZRUkWtep23M6dd7UqhwO1tMOfzQQ==", 643 | "dev": true, 644 | "optional": true 645 | }, 646 | "esbuild-linux-64": { 647 | "version": "0.14.34", 648 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.34.tgz", 649 | "integrity": "sha512-Y3of4qQoLLlAgf042MlrY1P+7PnN9zWj8nVtw9XQG5hcLOZLz7IKpU35oeu7n4wvyaZHwvQqDJ93gRLqdJekcQ==", 650 | "dev": true, 651 | "optional": true 652 | }, 653 | "esbuild-linux-arm": { 654 | "version": "0.14.34", 655 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.34.tgz", 656 | "integrity": "sha512-9lpq1NcJqssAF7alCO6zL3gvBVVt/lKw4oetUM7OgNnRX0OWpB+ZIO9FwCrSj/dMdmgDhPLf+119zB8QxSMmAg==", 657 | "dev": true, 658 | "optional": true 659 | }, 660 | "esbuild-linux-arm64": { 661 | "version": "0.14.34", 662 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.34.tgz", 663 | "integrity": "sha512-IlWaGtj9ir7+Nrume1DGcyzBDlK8GcnJq0ANKwcI9pVw8tqr+6GD0eqyF9SF1mR8UmAp+odrx1H5NdR2cHdFHA==", 664 | "dev": true, 665 | "optional": true 666 | }, 667 | "esbuild-linux-mips64le": { 668 | "version": "0.14.34", 669 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.34.tgz", 670 | "integrity": "sha512-k3or+01Rska1AjUyNjA4buEwB51eyN/xPQAoOx1CjzAQC3l8rpjUDw55kXyL63O/1MUi4ISvtNtl8gLwdyEcxw==", 671 | "dev": true, 672 | "optional": true 673 | }, 674 | "esbuild-linux-ppc64le": { 675 | "version": "0.14.34", 676 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.34.tgz", 677 | "integrity": "sha512-+qxb8M9FfM2CJaVU7GgYpJOHM1ngQOx+/VrtBjb4C8oVqaPcESCeg2anjl+HRZy8VpYc71q/iBYausPPbJ+Keg==", 678 | "dev": true, 679 | "optional": true 680 | }, 681 | "esbuild-linux-riscv64": { 682 | "version": "0.14.34", 683 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.34.tgz", 684 | "integrity": "sha512-Y717ltBdQ5j5sZIHdy1DV9kieo0wMip0dCmVSTceowCPYSn1Cg33Kd6981+F/3b9FDMzNWldZFOBRILViENZSA==", 685 | "dev": true, 686 | "optional": true 687 | }, 688 | "esbuild-linux-s390x": { 689 | "version": "0.14.34", 690 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.34.tgz", 691 | "integrity": "sha512-bDDgYO4LhL4+zPs+WcBkXph+AQoPcQRTv18FzZS0WhjfH8TZx2QqlVPGhmhZ6WidrY+jKthUqO6UhGyIb4MpmA==", 692 | "dev": true, 693 | "optional": true 694 | }, 695 | "esbuild-netbsd-64": { 696 | "version": "0.14.34", 697 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.34.tgz", 698 | "integrity": "sha512-cfaFGXdRt0+vHsjNPyF0POM4BVSHPSbhLPe8mppDc7GDDxjIl08mV1Zou14oDWMp/XZMjYN1kWYRSfftiD0vvQ==", 699 | "dev": true, 700 | "optional": true 701 | }, 702 | "esbuild-openbsd-64": { 703 | "version": "0.14.34", 704 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.34.tgz", 705 | "integrity": "sha512-vmy9DxXVnRiI14s8GKuYBtess+EVcDALkbpTqd5jw4XITutIzyB7n4x0Tj5utAkKsgZJB22lLWGekr0ABnSLow==", 706 | "dev": true, 707 | "optional": true 708 | }, 709 | "esbuild-sunos-64": { 710 | "version": "0.14.34", 711 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.34.tgz", 712 | "integrity": "sha512-eNPVatNET1F7tRMhii7goL/eptfxc0ALRjrj9SPFNqp0zmxrehBFD6BaP3R4LjMn6DbMO0jOAnTLFKr8NqcJAA==", 713 | "dev": true, 714 | "optional": true 715 | }, 716 | "esbuild-windows-32": { 717 | "version": "0.14.34", 718 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.34.tgz", 719 | "integrity": "sha512-EFhpXyHEcnqWYe2rAHFd8dRw8wkrd9U+9oqcyoEL84GbanAYjiiIjBZsnR8kl0sCQ5w6bLpk7vCEIA2VS32Vcg==", 720 | "dev": true, 721 | "optional": true 722 | }, 723 | "esbuild-windows-64": { 724 | "version": "0.14.34", 725 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.34.tgz", 726 | "integrity": "sha512-a8fbl8Ky7PxNEjf1aJmtxdDZj32/hC7S1OcA2ckEpCJRTjiKslI9vAdPpSjrKIWhws4Galpaawy0nB7fjHYf5Q==", 727 | "dev": true, 728 | "optional": true 729 | }, 730 | "esbuild-windows-arm64": { 731 | "version": "0.14.34", 732 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.34.tgz", 733 | "integrity": "sha512-EYvmKbSa2B3sPnpC28UEu9jBK5atGV4BaVRE7CYGUci2Hlz4AvtV/LML+TcDMT6gBgibnN2gcltWclab3UutMg==", 734 | "dev": true, 735 | "optional": true 736 | }, 737 | "escalade": { 738 | "version": "3.1.1", 739 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 740 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 741 | "dev": true 742 | }, 743 | "escape-string-regexp": { 744 | "version": "4.0.0", 745 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 746 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 747 | "dev": true 748 | }, 749 | "escodegen": { 750 | "version": "2.0.0", 751 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", 752 | "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", 753 | "dev": true, 754 | "requires": { 755 | "esprima": "^4.0.1", 756 | "estraverse": "^5.2.0", 757 | "esutils": "^2.0.2", 758 | "optionator": "^0.8.1", 759 | "source-map": "~0.6.1" 760 | }, 761 | "dependencies": { 762 | "levn": { 763 | "version": "0.3.0", 764 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 765 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 766 | "dev": true, 767 | "requires": { 768 | "prelude-ls": "~1.1.2", 769 | "type-check": "~0.3.2" 770 | } 771 | }, 772 | "optionator": { 773 | "version": "0.8.3", 774 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 775 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 776 | "dev": true, 777 | "requires": { 778 | "deep-is": "~0.1.3", 779 | "fast-levenshtein": "~2.0.6", 780 | "levn": "~0.3.0", 781 | "prelude-ls": "~1.1.2", 782 | "type-check": "~0.3.2", 783 | "word-wrap": "~1.2.3" 784 | } 785 | }, 786 | "prelude-ls": { 787 | "version": "1.1.2", 788 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 789 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 790 | "dev": true 791 | }, 792 | "type-check": { 793 | "version": "0.3.2", 794 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 795 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 796 | "dev": true, 797 | "requires": { 798 | "prelude-ls": "~1.1.2" 799 | } 800 | } 801 | } 802 | }, 803 | "eslint": { 804 | "version": "8.13.0", 805 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", 806 | "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", 807 | "dev": true, 808 | "requires": { 809 | "@eslint/eslintrc": "^1.2.1", 810 | "@humanwhocodes/config-array": "^0.9.2", 811 | "ajv": "^6.10.0", 812 | "chalk": "^4.0.0", 813 | "cross-spawn": "^7.0.2", 814 | "debug": "^4.3.2", 815 | "doctrine": "^3.0.0", 816 | "escape-string-regexp": "^4.0.0", 817 | "eslint-scope": "^7.1.1", 818 | "eslint-utils": "^3.0.0", 819 | "eslint-visitor-keys": "^3.3.0", 820 | "espree": "^9.3.1", 821 | "esquery": "^1.4.0", 822 | "esutils": "^2.0.2", 823 | "fast-deep-equal": "^3.1.3", 824 | "file-entry-cache": "^6.0.1", 825 | "functional-red-black-tree": "^1.0.1", 826 | "glob-parent": "^6.0.1", 827 | "globals": "^13.6.0", 828 | "ignore": "^5.2.0", 829 | "import-fresh": "^3.0.0", 830 | "imurmurhash": "^0.1.4", 831 | "is-glob": "^4.0.0", 832 | "js-yaml": "^4.1.0", 833 | "json-stable-stringify-without-jsonify": "^1.0.1", 834 | "levn": "^0.4.1", 835 | "lodash.merge": "^4.6.2", 836 | "minimatch": "^3.0.4", 837 | "natural-compare": "^1.4.0", 838 | "optionator": "^0.9.1", 839 | "regexpp": "^3.2.0", 840 | "strip-ansi": "^6.0.1", 841 | "strip-json-comments": "^3.1.0", 842 | "text-table": "^0.2.0", 843 | "v8-compile-cache": "^2.0.3" 844 | } 845 | }, 846 | "eslint-config-prettier": { 847 | "version": "8.5.0", 848 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", 849 | "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", 850 | "dev": true 851 | }, 852 | "eslint-plugin-prettier": { 853 | "version": "4.0.0", 854 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", 855 | "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", 856 | "dev": true, 857 | "requires": { 858 | "prettier-linter-helpers": "^1.0.0" 859 | } 860 | }, 861 | "eslint-plugin-vue": { 862 | "version": "8.6.0", 863 | "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.6.0.tgz", 864 | "integrity": "sha512-abXiF2J18n/7ZPy9foSlJyouKf54IqpKlNvNmzhM93N0zs3QUxZG/oBd3tVPOJTKg7SlhBUtPxugpqzNbgGpQQ==", 865 | "dev": true, 866 | "requires": { 867 | "eslint-utils": "^3.0.0", 868 | "natural-compare": "^1.4.0", 869 | "semver": "^7.3.5", 870 | "vue-eslint-parser": "^8.0.1" 871 | } 872 | }, 873 | "eslint-scope": { 874 | "version": "7.1.1", 875 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 876 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 877 | "dev": true, 878 | "requires": { 879 | "esrecurse": "^4.3.0", 880 | "estraverse": "^5.2.0" 881 | } 882 | }, 883 | "eslint-utils": { 884 | "version": "3.0.0", 885 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 886 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 887 | "dev": true, 888 | "requires": { 889 | "eslint-visitor-keys": "^2.0.0" 890 | }, 891 | "dependencies": { 892 | "eslint-visitor-keys": { 893 | "version": "2.1.0", 894 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 895 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 896 | "dev": true 897 | } 898 | } 899 | }, 900 | "eslint-visitor-keys": { 901 | "version": "3.3.0", 902 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 903 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 904 | "dev": true 905 | }, 906 | "espree": { 907 | "version": "9.3.1", 908 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", 909 | "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", 910 | "dev": true, 911 | "requires": { 912 | "acorn": "^8.7.0", 913 | "acorn-jsx": "^5.3.1", 914 | "eslint-visitor-keys": "^3.3.0" 915 | } 916 | }, 917 | "esprima": { 918 | "version": "4.0.1", 919 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 920 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 921 | "dev": true 922 | }, 923 | "esquery": { 924 | "version": "1.4.0", 925 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 926 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 927 | "dev": true, 928 | "requires": { 929 | "estraverse": "^5.1.0" 930 | } 931 | }, 932 | "esrecurse": { 933 | "version": "4.3.0", 934 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 935 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 936 | "dev": true, 937 | "requires": { 938 | "estraverse": "^5.2.0" 939 | } 940 | }, 941 | "estraverse": { 942 | "version": "5.3.0", 943 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 944 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 945 | "dev": true 946 | }, 947 | "estree-walker": { 948 | "version": "2.0.2", 949 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 950 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 951 | }, 952 | "esutils": { 953 | "version": "2.0.3", 954 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 955 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 956 | "dev": true 957 | }, 958 | "fast-deep-equal": { 959 | "version": "3.1.3", 960 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 961 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 962 | "dev": true 963 | }, 964 | "fast-diff": { 965 | "version": "1.2.0", 966 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", 967 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", 968 | "dev": true 969 | }, 970 | "fast-json-stable-stringify": { 971 | "version": "2.1.0", 972 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 973 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 974 | "dev": true 975 | }, 976 | "fast-levenshtein": { 977 | "version": "2.0.6", 978 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 979 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 980 | "dev": true 981 | }, 982 | "file-entry-cache": { 983 | "version": "6.0.1", 984 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 985 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 986 | "dev": true, 987 | "requires": { 988 | "flat-cache": "^3.0.4" 989 | } 990 | }, 991 | "find-up": { 992 | "version": "5.0.0", 993 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 994 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 995 | "dev": true, 996 | "requires": { 997 | "locate-path": "^6.0.0", 998 | "path-exists": "^4.0.0" 999 | } 1000 | }, 1001 | "flat-cache": { 1002 | "version": "3.0.4", 1003 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1004 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1005 | "dev": true, 1006 | "requires": { 1007 | "flatted": "^3.1.0", 1008 | "rimraf": "^3.0.2" 1009 | } 1010 | }, 1011 | "flatted": { 1012 | "version": "3.2.5", 1013 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", 1014 | "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", 1015 | "dev": true 1016 | }, 1017 | "foreground-child": { 1018 | "version": "2.0.0", 1019 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", 1020 | "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", 1021 | "dev": true, 1022 | "requires": { 1023 | "cross-spawn": "^7.0.0", 1024 | "signal-exit": "^3.0.2" 1025 | } 1026 | }, 1027 | "form-data": { 1028 | "version": "4.0.0", 1029 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1030 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1031 | "dev": true, 1032 | "requires": { 1033 | "asynckit": "^0.4.0", 1034 | "combined-stream": "^1.0.8", 1035 | "mime-types": "^2.1.12" 1036 | } 1037 | }, 1038 | "fs.realpath": { 1039 | "version": "1.0.0", 1040 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1041 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1042 | "dev": true 1043 | }, 1044 | "fsevents": { 1045 | "version": "2.3.2", 1046 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1047 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1048 | "dev": true, 1049 | "optional": true 1050 | }, 1051 | "function-bind": { 1052 | "version": "1.1.1", 1053 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1054 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1055 | "dev": true 1056 | }, 1057 | "functional-red-black-tree": { 1058 | "version": "1.0.1", 1059 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1060 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1061 | "dev": true 1062 | }, 1063 | "get-caller-file": { 1064 | "version": "2.0.5", 1065 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1066 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1067 | "dev": true 1068 | }, 1069 | "get-func-name": { 1070 | "version": "2.0.0", 1071 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 1072 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 1073 | "dev": true 1074 | }, 1075 | "glob": { 1076 | "version": "7.2.0", 1077 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 1078 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 1079 | "dev": true, 1080 | "requires": { 1081 | "fs.realpath": "^1.0.0", 1082 | "inflight": "^1.0.4", 1083 | "inherits": "2", 1084 | "minimatch": "^3.0.4", 1085 | "once": "^1.3.0", 1086 | "path-is-absolute": "^1.0.0" 1087 | } 1088 | }, 1089 | "glob-parent": { 1090 | "version": "6.0.2", 1091 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1092 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1093 | "dev": true, 1094 | "requires": { 1095 | "is-glob": "^4.0.3" 1096 | } 1097 | }, 1098 | "globals": { 1099 | "version": "13.13.0", 1100 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", 1101 | "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", 1102 | "dev": true, 1103 | "requires": { 1104 | "type-fest": "^0.20.2" 1105 | } 1106 | }, 1107 | "has": { 1108 | "version": "1.0.3", 1109 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1110 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1111 | "dev": true, 1112 | "requires": { 1113 | "function-bind": "^1.1.1" 1114 | } 1115 | }, 1116 | "has-flag": { 1117 | "version": "4.0.0", 1118 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1119 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1120 | "dev": true 1121 | }, 1122 | "html-encoding-sniffer": { 1123 | "version": "3.0.0", 1124 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", 1125 | "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", 1126 | "dev": true, 1127 | "requires": { 1128 | "whatwg-encoding": "^2.0.0" 1129 | } 1130 | }, 1131 | "html-escaper": { 1132 | "version": "2.0.2", 1133 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1134 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1135 | "dev": true 1136 | }, 1137 | "http-proxy-agent": { 1138 | "version": "5.0.0", 1139 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", 1140 | "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", 1141 | "dev": true, 1142 | "requires": { 1143 | "@tootallnate/once": "2", 1144 | "agent-base": "6", 1145 | "debug": "4" 1146 | } 1147 | }, 1148 | "https-proxy-agent": { 1149 | "version": "5.0.0", 1150 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 1151 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 1152 | "dev": true, 1153 | "requires": { 1154 | "agent-base": "6", 1155 | "debug": "4" 1156 | } 1157 | }, 1158 | "iconv-lite": { 1159 | "version": "0.6.3", 1160 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1161 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1162 | "dev": true, 1163 | "requires": { 1164 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1165 | } 1166 | }, 1167 | "ignore": { 1168 | "version": "5.2.0", 1169 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", 1170 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", 1171 | "dev": true 1172 | }, 1173 | "import-fresh": { 1174 | "version": "3.3.0", 1175 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1176 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1177 | "dev": true, 1178 | "requires": { 1179 | "parent-module": "^1.0.0", 1180 | "resolve-from": "^4.0.0" 1181 | } 1182 | }, 1183 | "imurmurhash": { 1184 | "version": "0.1.4", 1185 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1186 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1187 | "dev": true 1188 | }, 1189 | "inflight": { 1190 | "version": "1.0.6", 1191 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1192 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1193 | "dev": true, 1194 | "requires": { 1195 | "once": "^1.3.0", 1196 | "wrappy": "1" 1197 | } 1198 | }, 1199 | "inherits": { 1200 | "version": "2.0.4", 1201 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1202 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1203 | "dev": true 1204 | }, 1205 | "is-core-module": { 1206 | "version": "2.8.1", 1207 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 1208 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 1209 | "dev": true, 1210 | "requires": { 1211 | "has": "^1.0.3" 1212 | } 1213 | }, 1214 | "is-extglob": { 1215 | "version": "2.1.1", 1216 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1217 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1218 | "dev": true 1219 | }, 1220 | "is-fullwidth-code-point": { 1221 | "version": "3.0.0", 1222 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1223 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1224 | "dev": true 1225 | }, 1226 | "is-glob": { 1227 | "version": "4.0.3", 1228 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1229 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1230 | "dev": true, 1231 | "requires": { 1232 | "is-extglob": "^2.1.1" 1233 | } 1234 | }, 1235 | "is-potential-custom-element-name": { 1236 | "version": "1.0.1", 1237 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", 1238 | "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", 1239 | "dev": true 1240 | }, 1241 | "isexe": { 1242 | "version": "2.0.0", 1243 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1244 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1245 | "dev": true 1246 | }, 1247 | "istanbul-lib-coverage": { 1248 | "version": "3.2.0", 1249 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", 1250 | "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", 1251 | "dev": true 1252 | }, 1253 | "istanbul-lib-report": { 1254 | "version": "3.0.0", 1255 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 1256 | "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", 1257 | "dev": true, 1258 | "requires": { 1259 | "istanbul-lib-coverage": "^3.0.0", 1260 | "make-dir": "^3.0.0", 1261 | "supports-color": "^7.1.0" 1262 | } 1263 | }, 1264 | "istanbul-reports": { 1265 | "version": "3.1.4", 1266 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", 1267 | "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", 1268 | "dev": true, 1269 | "requires": { 1270 | "html-escaper": "^2.0.0", 1271 | "istanbul-lib-report": "^3.0.0" 1272 | } 1273 | }, 1274 | "js-yaml": { 1275 | "version": "4.1.0", 1276 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1277 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1278 | "dev": true, 1279 | "requires": { 1280 | "argparse": "^2.0.1" 1281 | } 1282 | }, 1283 | "jsdom": { 1284 | "version": "19.0.0", 1285 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", 1286 | "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", 1287 | "dev": true, 1288 | "requires": { 1289 | "abab": "^2.0.5", 1290 | "acorn": "^8.5.0", 1291 | "acorn-globals": "^6.0.0", 1292 | "cssom": "^0.5.0", 1293 | "cssstyle": "^2.3.0", 1294 | "data-urls": "^3.0.1", 1295 | "decimal.js": "^10.3.1", 1296 | "domexception": "^4.0.0", 1297 | "escodegen": "^2.0.0", 1298 | "form-data": "^4.0.0", 1299 | "html-encoding-sniffer": "^3.0.0", 1300 | "http-proxy-agent": "^5.0.0", 1301 | "https-proxy-agent": "^5.0.0", 1302 | "is-potential-custom-element-name": "^1.0.1", 1303 | "nwsapi": "^2.2.0", 1304 | "parse5": "6.0.1", 1305 | "saxes": "^5.0.1", 1306 | "symbol-tree": "^3.2.4", 1307 | "tough-cookie": "^4.0.0", 1308 | "w3c-hr-time": "^1.0.2", 1309 | "w3c-xmlserializer": "^3.0.0", 1310 | "webidl-conversions": "^7.0.0", 1311 | "whatwg-encoding": "^2.0.0", 1312 | "whatwg-mimetype": "^3.0.0", 1313 | "whatwg-url": "^10.0.0", 1314 | "ws": "^8.2.3", 1315 | "xml-name-validator": "^4.0.0" 1316 | } 1317 | }, 1318 | "json-schema-traverse": { 1319 | "version": "0.4.1", 1320 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1321 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1322 | "dev": true 1323 | }, 1324 | "json-stable-stringify-without-jsonify": { 1325 | "version": "1.0.1", 1326 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1327 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1328 | "dev": true 1329 | }, 1330 | "levn": { 1331 | "version": "0.4.1", 1332 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1333 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1334 | "dev": true, 1335 | "requires": { 1336 | "prelude-ls": "^1.2.1", 1337 | "type-check": "~0.4.0" 1338 | } 1339 | }, 1340 | "local-pkg": { 1341 | "version": "0.4.1", 1342 | "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.1.tgz", 1343 | "integrity": "sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw==", 1344 | "dev": true 1345 | }, 1346 | "locate-path": { 1347 | "version": "6.0.0", 1348 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1349 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1350 | "dev": true, 1351 | "requires": { 1352 | "p-locate": "^5.0.0" 1353 | } 1354 | }, 1355 | "lodash": { 1356 | "version": "4.17.21", 1357 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1358 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1359 | "dev": true 1360 | }, 1361 | "lodash.merge": { 1362 | "version": "4.6.2", 1363 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1364 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1365 | "dev": true 1366 | }, 1367 | "loupe": { 1368 | "version": "2.3.4", 1369 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", 1370 | "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", 1371 | "dev": true, 1372 | "requires": { 1373 | "get-func-name": "^2.0.0" 1374 | } 1375 | }, 1376 | "lru-cache": { 1377 | "version": "7.8.1", 1378 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.1.tgz", 1379 | "integrity": "sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==", 1380 | "dev": true 1381 | }, 1382 | "magic-string": { 1383 | "version": "0.25.9", 1384 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", 1385 | "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", 1386 | "requires": { 1387 | "sourcemap-codec": "^1.4.8" 1388 | } 1389 | }, 1390 | "make-dir": { 1391 | "version": "3.1.0", 1392 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1393 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1394 | "dev": true, 1395 | "requires": { 1396 | "semver": "^6.0.0" 1397 | }, 1398 | "dependencies": { 1399 | "semver": { 1400 | "version": "6.3.0", 1401 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1402 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1403 | "dev": true 1404 | } 1405 | } 1406 | }, 1407 | "mime-db": { 1408 | "version": "1.52.0", 1409 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1410 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1411 | "dev": true 1412 | }, 1413 | "mime-types": { 1414 | "version": "2.1.35", 1415 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1416 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1417 | "dev": true, 1418 | "requires": { 1419 | "mime-db": "1.52.0" 1420 | } 1421 | }, 1422 | "minimatch": { 1423 | "version": "3.1.2", 1424 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1425 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1426 | "dev": true, 1427 | "requires": { 1428 | "brace-expansion": "^1.1.7" 1429 | } 1430 | }, 1431 | "ms": { 1432 | "version": "2.1.2", 1433 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1434 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1435 | "dev": true 1436 | }, 1437 | "nanoid": { 1438 | "version": "3.3.2", 1439 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", 1440 | "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==" 1441 | }, 1442 | "natural-compare": { 1443 | "version": "1.4.0", 1444 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1445 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1446 | "dev": true 1447 | }, 1448 | "nwsapi": { 1449 | "version": "2.2.0", 1450 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", 1451 | "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", 1452 | "dev": true 1453 | }, 1454 | "once": { 1455 | "version": "1.4.0", 1456 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1457 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1458 | "dev": true, 1459 | "requires": { 1460 | "wrappy": "1" 1461 | } 1462 | }, 1463 | "optionator": { 1464 | "version": "0.9.1", 1465 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1466 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1467 | "dev": true, 1468 | "requires": { 1469 | "deep-is": "^0.1.3", 1470 | "fast-levenshtein": "^2.0.6", 1471 | "levn": "^0.4.1", 1472 | "prelude-ls": "^1.2.1", 1473 | "type-check": "^0.4.0", 1474 | "word-wrap": "^1.2.3" 1475 | } 1476 | }, 1477 | "p-limit": { 1478 | "version": "3.1.0", 1479 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1480 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1481 | "dev": true, 1482 | "requires": { 1483 | "yocto-queue": "^0.1.0" 1484 | } 1485 | }, 1486 | "p-locate": { 1487 | "version": "5.0.0", 1488 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1489 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1490 | "dev": true, 1491 | "requires": { 1492 | "p-limit": "^3.0.2" 1493 | } 1494 | }, 1495 | "parent-module": { 1496 | "version": "1.0.1", 1497 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1498 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1499 | "dev": true, 1500 | "requires": { 1501 | "callsites": "^3.0.0" 1502 | } 1503 | }, 1504 | "parse5": { 1505 | "version": "6.0.1", 1506 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", 1507 | "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", 1508 | "dev": true 1509 | }, 1510 | "path-exists": { 1511 | "version": "4.0.0", 1512 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1513 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1514 | "dev": true 1515 | }, 1516 | "path-is-absolute": { 1517 | "version": "1.0.1", 1518 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1519 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1520 | "dev": true 1521 | }, 1522 | "path-key": { 1523 | "version": "3.1.1", 1524 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1525 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1526 | "dev": true 1527 | }, 1528 | "path-parse": { 1529 | "version": "1.0.7", 1530 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1531 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1532 | "dev": true 1533 | }, 1534 | "pathval": { 1535 | "version": "1.1.1", 1536 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 1537 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 1538 | "dev": true 1539 | }, 1540 | "picocolors": { 1541 | "version": "1.0.0", 1542 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1543 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1544 | }, 1545 | "postcss": { 1546 | "version": "8.4.12", 1547 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", 1548 | "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", 1549 | "requires": { 1550 | "nanoid": "^3.3.1", 1551 | "picocolors": "^1.0.0", 1552 | "source-map-js": "^1.0.2" 1553 | } 1554 | }, 1555 | "prelude-ls": { 1556 | "version": "1.2.1", 1557 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1558 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1559 | "dev": true 1560 | }, 1561 | "prettier": { 1562 | "version": "2.6.2", 1563 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", 1564 | "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", 1565 | "dev": true 1566 | }, 1567 | "prettier-linter-helpers": { 1568 | "version": "1.0.0", 1569 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 1570 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 1571 | "dev": true, 1572 | "requires": { 1573 | "fast-diff": "^1.1.2" 1574 | } 1575 | }, 1576 | "psl": { 1577 | "version": "1.8.0", 1578 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1579 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", 1580 | "dev": true 1581 | }, 1582 | "punycode": { 1583 | "version": "2.1.1", 1584 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1585 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1586 | "dev": true 1587 | }, 1588 | "regexpp": { 1589 | "version": "3.2.0", 1590 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 1591 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 1592 | "dev": true 1593 | }, 1594 | "require-directory": { 1595 | "version": "2.1.1", 1596 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1597 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1598 | "dev": true 1599 | }, 1600 | "resolve": { 1601 | "version": "1.22.0", 1602 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 1603 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 1604 | "dev": true, 1605 | "requires": { 1606 | "is-core-module": "^2.8.1", 1607 | "path-parse": "^1.0.7", 1608 | "supports-preserve-symlinks-flag": "^1.0.0" 1609 | } 1610 | }, 1611 | "resolve-from": { 1612 | "version": "4.0.0", 1613 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1614 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1615 | "dev": true 1616 | }, 1617 | "rimraf": { 1618 | "version": "3.0.2", 1619 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1620 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1621 | "dev": true, 1622 | "requires": { 1623 | "glob": "^7.1.3" 1624 | } 1625 | }, 1626 | "rollup": { 1627 | "version": "2.70.1", 1628 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", 1629 | "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", 1630 | "dev": true, 1631 | "requires": { 1632 | "fsevents": "~2.3.2" 1633 | } 1634 | }, 1635 | "safe-buffer": { 1636 | "version": "5.1.2", 1637 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1638 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1639 | "dev": true 1640 | }, 1641 | "safer-buffer": { 1642 | "version": "2.1.2", 1643 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1644 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1645 | "dev": true 1646 | }, 1647 | "saxes": { 1648 | "version": "5.0.1", 1649 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", 1650 | "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", 1651 | "dev": true, 1652 | "requires": { 1653 | "xmlchars": "^2.2.0" 1654 | } 1655 | }, 1656 | "semver": { 1657 | "version": "7.3.6", 1658 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", 1659 | "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", 1660 | "dev": true, 1661 | "requires": { 1662 | "lru-cache": "^7.4.0" 1663 | } 1664 | }, 1665 | "shebang-command": { 1666 | "version": "2.0.0", 1667 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1668 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1669 | "dev": true, 1670 | "requires": { 1671 | "shebang-regex": "^3.0.0" 1672 | } 1673 | }, 1674 | "shebang-regex": { 1675 | "version": "3.0.0", 1676 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1677 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1678 | "dev": true 1679 | }, 1680 | "signal-exit": { 1681 | "version": "3.0.7", 1682 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1683 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1684 | "dev": true 1685 | }, 1686 | "source-map": { 1687 | "version": "0.6.1", 1688 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1689 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1690 | }, 1691 | "source-map-js": { 1692 | "version": "1.0.2", 1693 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1694 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 1695 | }, 1696 | "sourcemap-codec": { 1697 | "version": "1.4.8", 1698 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1699 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" 1700 | }, 1701 | "string-width": { 1702 | "version": "4.2.3", 1703 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1704 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1705 | "dev": true, 1706 | "requires": { 1707 | "emoji-regex": "^8.0.0", 1708 | "is-fullwidth-code-point": "^3.0.0", 1709 | "strip-ansi": "^6.0.1" 1710 | } 1711 | }, 1712 | "strip-ansi": { 1713 | "version": "6.0.1", 1714 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1715 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1716 | "dev": true, 1717 | "requires": { 1718 | "ansi-regex": "^5.0.1" 1719 | } 1720 | }, 1721 | "strip-json-comments": { 1722 | "version": "3.1.1", 1723 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1724 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1725 | "dev": true 1726 | }, 1727 | "supports-color": { 1728 | "version": "7.2.0", 1729 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1730 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1731 | "dev": true, 1732 | "requires": { 1733 | "has-flag": "^4.0.0" 1734 | } 1735 | }, 1736 | "supports-preserve-symlinks-flag": { 1737 | "version": "1.0.0", 1738 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1739 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1740 | "dev": true 1741 | }, 1742 | "symbol-tree": { 1743 | "version": "3.2.4", 1744 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", 1745 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", 1746 | "dev": true 1747 | }, 1748 | "test-exclude": { 1749 | "version": "6.0.0", 1750 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 1751 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 1752 | "dev": true, 1753 | "requires": { 1754 | "@istanbuljs/schema": "^0.1.2", 1755 | "glob": "^7.1.4", 1756 | "minimatch": "^3.0.4" 1757 | } 1758 | }, 1759 | "text-table": { 1760 | "version": "0.2.0", 1761 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1762 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1763 | "dev": true 1764 | }, 1765 | "tinypool": { 1766 | "version": "0.1.2", 1767 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.1.2.tgz", 1768 | "integrity": "sha512-fvtYGXoui2RpeMILfkvGIgOVkzJEGediv8UJt7TxdAOY8pnvUkFg/fkvqTfXG9Acc9S17Cnn1S4osDc2164guA==", 1769 | "dev": true 1770 | }, 1771 | "tinyspy": { 1772 | "version": "0.3.2", 1773 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-0.3.2.tgz", 1774 | "integrity": "sha512-2+40EP4D3sFYy42UkgkFFB+kiX2Tg3URG/lVvAZFfLxgGpnWl5qQJuBw1gaLttq8UOS+2p3C0WrhJnQigLTT2Q==", 1775 | "dev": true 1776 | }, 1777 | "tough-cookie": { 1778 | "version": "4.0.0", 1779 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", 1780 | "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", 1781 | "dev": true, 1782 | "requires": { 1783 | "psl": "^1.1.33", 1784 | "punycode": "^2.1.1", 1785 | "universalify": "^0.1.2" 1786 | } 1787 | }, 1788 | "tr46": { 1789 | "version": "3.0.0", 1790 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", 1791 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", 1792 | "dev": true, 1793 | "requires": { 1794 | "punycode": "^2.1.1" 1795 | } 1796 | }, 1797 | "type-check": { 1798 | "version": "0.4.0", 1799 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1800 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1801 | "dev": true, 1802 | "requires": { 1803 | "prelude-ls": "^1.2.1" 1804 | } 1805 | }, 1806 | "type-detect": { 1807 | "version": "4.0.8", 1808 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1809 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1810 | "dev": true 1811 | }, 1812 | "type-fest": { 1813 | "version": "0.20.2", 1814 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1815 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1816 | "dev": true 1817 | }, 1818 | "universalify": { 1819 | "version": "0.1.2", 1820 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1821 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1822 | "dev": true 1823 | }, 1824 | "uri-js": { 1825 | "version": "4.4.1", 1826 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1827 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1828 | "dev": true, 1829 | "requires": { 1830 | "punycode": "^2.1.0" 1831 | } 1832 | }, 1833 | "v8-compile-cache": { 1834 | "version": "2.3.0", 1835 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 1836 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 1837 | "dev": true 1838 | }, 1839 | "v8-to-istanbul": { 1840 | "version": "9.0.0", 1841 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", 1842 | "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==", 1843 | "dev": true, 1844 | "requires": { 1845 | "@jridgewell/trace-mapping": "^0.3.7", 1846 | "@types/istanbul-lib-coverage": "^2.0.1", 1847 | "convert-source-map": "^1.6.0" 1848 | } 1849 | }, 1850 | "vite": { 1851 | "version": "2.9.1", 1852 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.1.tgz", 1853 | "integrity": "sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==", 1854 | "dev": true, 1855 | "requires": { 1856 | "esbuild": "^0.14.27", 1857 | "fsevents": "~2.3.2", 1858 | "postcss": "^8.4.12", 1859 | "resolve": "^1.22.0", 1860 | "rollup": "^2.59.0" 1861 | } 1862 | }, 1863 | "vitest": { 1864 | "version": "0.8.5", 1865 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.8.5.tgz", 1866 | "integrity": "sha512-UOBAfyLUn9++isUDC5vk8joLcaBZj7esLS2Yx3GZSRMWzayOfEEzU1Iv4SBb4HkJun9e1D5ifZoSclhNHKn7IA==", 1867 | "dev": true, 1868 | "requires": { 1869 | "@types/chai": "^4.3.0", 1870 | "@types/chai-subset": "^1.3.3", 1871 | "chai": "^4.3.6", 1872 | "local-pkg": "^0.4.1", 1873 | "tinypool": "^0.1.2", 1874 | "tinyspy": "^0.3.0", 1875 | "vite": "^2.9.1" 1876 | } 1877 | }, 1878 | "vue": { 1879 | "version": "3.2.33", 1880 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.33.tgz", 1881 | "integrity": "sha512-si1ExAlDUrLSIg/V7D/GgA4twJwfsfgG+t9w10z38HhL/HA07132pUQ2KuwAo8qbCyMJ9e6OqrmWrOCr+jW7ZQ==", 1882 | "requires": { 1883 | "@vue/compiler-dom": "3.2.33", 1884 | "@vue/compiler-sfc": "3.2.33", 1885 | "@vue/runtime-dom": "3.2.33", 1886 | "@vue/server-renderer": "3.2.33", 1887 | "@vue/shared": "3.2.33" 1888 | } 1889 | }, 1890 | "vue-eslint-parser": { 1891 | "version": "8.3.0", 1892 | "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", 1893 | "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", 1894 | "dev": true, 1895 | "requires": { 1896 | "debug": "^4.3.2", 1897 | "eslint-scope": "^7.0.0", 1898 | "eslint-visitor-keys": "^3.1.0", 1899 | "espree": "^9.0.0", 1900 | "esquery": "^1.4.0", 1901 | "lodash": "^4.17.21", 1902 | "semver": "^7.3.5" 1903 | } 1904 | }, 1905 | "w3c-hr-time": { 1906 | "version": "1.0.2", 1907 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", 1908 | "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", 1909 | "dev": true, 1910 | "requires": { 1911 | "browser-process-hrtime": "^1.0.0" 1912 | } 1913 | }, 1914 | "w3c-xmlserializer": { 1915 | "version": "3.0.0", 1916 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", 1917 | "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", 1918 | "dev": true, 1919 | "requires": { 1920 | "xml-name-validator": "^4.0.0" 1921 | } 1922 | }, 1923 | "webidl-conversions": { 1924 | "version": "7.0.0", 1925 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 1926 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 1927 | "dev": true 1928 | }, 1929 | "whatwg-encoding": { 1930 | "version": "2.0.0", 1931 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", 1932 | "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", 1933 | "dev": true, 1934 | "requires": { 1935 | "iconv-lite": "0.6.3" 1936 | } 1937 | }, 1938 | "whatwg-mimetype": { 1939 | "version": "3.0.0", 1940 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", 1941 | "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", 1942 | "dev": true 1943 | }, 1944 | "whatwg-url": { 1945 | "version": "10.0.0", 1946 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", 1947 | "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", 1948 | "dev": true, 1949 | "requires": { 1950 | "tr46": "^3.0.0", 1951 | "webidl-conversions": "^7.0.0" 1952 | } 1953 | }, 1954 | "which": { 1955 | "version": "2.0.2", 1956 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1957 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1958 | "dev": true, 1959 | "requires": { 1960 | "isexe": "^2.0.0" 1961 | } 1962 | }, 1963 | "word-wrap": { 1964 | "version": "1.2.3", 1965 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1966 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1967 | "dev": true 1968 | }, 1969 | "wrap-ansi": { 1970 | "version": "7.0.0", 1971 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1972 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1973 | "dev": true, 1974 | "requires": { 1975 | "ansi-styles": "^4.0.0", 1976 | "string-width": "^4.1.0", 1977 | "strip-ansi": "^6.0.0" 1978 | } 1979 | }, 1980 | "wrappy": { 1981 | "version": "1.0.2", 1982 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1983 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1984 | "dev": true 1985 | }, 1986 | "ws": { 1987 | "version": "8.5.0", 1988 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", 1989 | "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", 1990 | "dev": true 1991 | }, 1992 | "xml-name-validator": { 1993 | "version": "4.0.0", 1994 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", 1995 | "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", 1996 | "dev": true 1997 | }, 1998 | "xmlchars": { 1999 | "version": "2.2.0", 2000 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", 2001 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", 2002 | "dev": true 2003 | }, 2004 | "y18n": { 2005 | "version": "5.0.8", 2006 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2007 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2008 | "dev": true 2009 | }, 2010 | "yargs": { 2011 | "version": "16.2.0", 2012 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 2013 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 2014 | "dev": true, 2015 | "requires": { 2016 | "cliui": "^7.0.2", 2017 | "escalade": "^3.1.1", 2018 | "get-caller-file": "^2.0.5", 2019 | "require-directory": "^2.1.1", 2020 | "string-width": "^4.2.0", 2021 | "y18n": "^5.0.5", 2022 | "yargs-parser": "^20.2.2" 2023 | } 2024 | }, 2025 | "yargs-parser": { 2026 | "version": "20.2.9", 2027 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 2028 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 2029 | "dev": true 2030 | }, 2031 | "yocto-queue": { 2032 | "version": "0.1.0", 2033 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2034 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2035 | "dev": true 2036 | } 2037 | } 2038 | } 2039 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@tawk.to/tawk-messenger-vue-3", 3 | "version": "1.0.3", 4 | "description": "Official Vue 3 plugin for Tawk messenger", 5 | "keywords": [ 6 | "vuejs", 7 | "vue", 8 | "vue3", 9 | "nuxt", 10 | "vue-plugin", 11 | "tawk", 12 | "nuxt-plugin", 13 | "tawkto", 14 | "vue-tawk", 15 | "vue3-tawk", 16 | "nuxt-tawk" 17 | ], 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/tawk/tawk-messenger-vue-3.git", 21 | "repository": "tawk/tawk-messenger-vue-2" 22 | }, 23 | "homepage": "https://github.com/tawk/tawk-messenger-vue-3#readme", 24 | "bugs": { 25 | "url": "https://github.com/tawk/tawk-messenger-vue-3/issues", 26 | "email": "support@tawk.to" 27 | }, 28 | "license": "Apache-2.0", 29 | "author": "Jerald Austero (https://www.tawk.to)", 30 | "files": [ 31 | "dist" 32 | ], 33 | "main": "./dist/tawk-messenger-vue-3.umd.js", 34 | "module": "./dist/tawk-messenger-vue-3.es.js", 35 | "exports": { 36 | ".": { 37 | "import": "./dist/tawk-messenger-vue-3.es.js", 38 | "require": "./dist/tawk-messenger-vue-3.umd.js" 39 | } 40 | }, 41 | "scripts": { 42 | "build": "vite build", 43 | "test:unit": "vitest", 44 | "test:coverage": "vitest run --coverage", 45 | "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore" 46 | }, 47 | "dependencies": { 48 | "vue": "^3.2.31" 49 | }, 50 | "devDependencies": { 51 | "@rushstack/eslint-patch": "^1.1.0", 52 | "@vitejs/plugin-vue": "^2.3.1", 53 | "@vue/eslint-config-prettier": "^7.0.0", 54 | "@vue/test-utils": "^2.0.0-rc.18", 55 | "c8": "^7.11.2", 56 | "eslint": "^8.5.0", 57 | "eslint-plugin-vue": "^8.2.0", 58 | "jsdom": "^19.0.0", 59 | "prettier": "^2.5.1", 60 | "vite": "^2.9.1", 61 | "vitest": "^0.8.1" 62 | }, 63 | "directories": { 64 | "doc": "docs", 65 | "test": "tests" 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | // Library 2 | import TawkMessenger from './lib/index'; 3 | 4 | // Utilities 5 | import { isValidString } from './utils/helper'; 6 | 7 | export default { 8 | install: (app, options = {}) => { 9 | if (!isValidString(options.propertyId)) { 10 | console.error('[Tawk-messenger-vue warn]: You didn\'t specified \'propertyId\' property in the plugin.'); 11 | return; 12 | } 13 | 14 | if (!isValidString(options.widgetId)) { 15 | console.error('[Tawk-messenger-vue warn]: You didn\'t specified \'widgetId\' property in the plugin.'); 16 | return; 17 | } 18 | 19 | new TawkMessenger(app, options); 20 | } 21 | } -------------------------------------------------------------------------------- /src/lib/index.js: -------------------------------------------------------------------------------- 1 | // Utilities 2 | import { loadScript } from '../utils/widget'; 3 | import { isValidString } from '../utils/helper'; 4 | 5 | class TawkMessenger { 6 | constructor(app, options) { 7 | if (!isValidString(options.propertyId)) { 8 | return; 9 | } 10 | 11 | if (!isValidString(options.widgetId)) { 12 | return; 13 | } 14 | 15 | this.app = app; 16 | this.propertyId = options.propertyId; 17 | this.widgetId = options.widgetId; 18 | this.embedId = options.embedId; 19 | this.autoStart = options.autoStart; 20 | this.customStyle = options.customStyle; 21 | this.basePath = options.basePath; 22 | 23 | this.load(); 24 | } 25 | 26 | load() { 27 | if (!window || !document) { 28 | return; 29 | } 30 | 31 | /** 32 | * Set placeholder 33 | */ 34 | window.Tawk_API = window.Tawk_API || {}; 35 | window.Tawk_LoadStart = new Date(); 36 | 37 | /** 38 | * Inject the Tawk script 39 | */ 40 | loadScript({ 41 | propertyId : this.propertyId, 42 | widgetId : this.widgetId, 43 | embedId : this.embedId, 44 | basePath : this.basePath, 45 | autoStart : this.autoStart 46 | }); 47 | 48 | this.init(); 49 | } 50 | 51 | init() { 52 | if (this.customStyle && typeof this.customStyle === 'object') { 53 | window.Tawk_API.customStyle = this.customStyle; 54 | } 55 | 56 | if (typeof this.app !== 'object') { 57 | return; 58 | } 59 | 60 | /** 61 | * Provide the APIs 62 | */ 63 | this.provideActions(); 64 | this.provideGetters(); 65 | this.provideListeners(); 66 | this.provideSetters(); 67 | } 68 | 69 | /** 70 | * API for calling an action on the widget 71 | */ 72 | provideActions() { 73 | this.app.provide('start', () => { 74 | window.Tawk_API.start(); 75 | }); 76 | 77 | this.app.provide('shutdown', () => { 78 | window.Tawk_API.shutdown(); 79 | }); 80 | 81 | this.app.provide('maximize', () => { 82 | window.Tawk_API.maximize(); 83 | }); 84 | 85 | this.app.provide('minimize', () => { 86 | window.Tawk_API.minimize(); 87 | }); 88 | 89 | this.app.provide('toggle', () => { 90 | window.Tawk_API.toggle(); 91 | }); 92 | 93 | this.app.provide('popup', () => { 94 | window.Tawk_API.popup(); 95 | }); 96 | 97 | this.app.provide('showWidget', () => { 98 | window.Tawk_API.showWidget(); 99 | }); 100 | 101 | this.app.provide('hideWidget', () => { 102 | window.Tawk_API.hideWidget(); 103 | }); 104 | 105 | this.app.provide('toggleVisibility', () => { 106 | window.Tawk_API.toggleVisibility(); 107 | }); 108 | 109 | this.app.provide('endChat', () => { 110 | window.Tawk_API.endChat(); 111 | }); 112 | } 113 | 114 | /** 115 | * API for returning a data 116 | */ 117 | provideGetters() { 118 | this.app.provide('getWindowType', () => { 119 | return window.Tawk_API.getWindowType(); 120 | }); 121 | 122 | this.app.provide('getStatus', () => { 123 | return window.Tawk_API.getStatus(); 124 | }); 125 | 126 | this.app.provide('isChatMaximized', () => { 127 | return window.Tawk_API.isChatMaximized(); 128 | }); 129 | 130 | this.app.provide('isChatMinimized', () => { 131 | return window.Tawk_API.isChatMinimized(); 132 | }); 133 | 134 | this.app.provide('isChatHidden', () => { 135 | return window.Tawk_API.isChatHidden(); 136 | }); 137 | 138 | this.app.provide('isChatOngoing', () => { 139 | return window.Tawk_API.isChatOngoing(); 140 | }); 141 | 142 | this.app.provide('isVisitorEngaged', () => { 143 | return window.Tawk_API.isVisitorEngaged(); 144 | }); 145 | 146 | this.app.provide('onLoaded', () => { 147 | return window.Tawk_API.onLoaded; 148 | }); 149 | 150 | this.app.provide('onBeforeLoaded', () => { 151 | return window.Tawk_API.onBeforeLoaded; 152 | }); 153 | 154 | this.app.provide('widgetPosition', () => { 155 | return window.Tawk_API.widgetPosition(); 156 | }); 157 | } 158 | 159 | /** 160 | * API for listening an event emitting 161 | * inside of the widget 162 | */ 163 | provideListeners() { 164 | this.app.provide('onLoad', (callback) => { 165 | window.addEventListener('tawkLoad', () => { 166 | callback(); 167 | }); 168 | }); 169 | 170 | this.app.provide('onStatusChange', (callback) => { 171 | window.addEventListener('tawkStatusChange', (status) => { 172 | callback(status.detail); 173 | }); 174 | }); 175 | 176 | this.app.provide('onBeforeLoad', (callback) => { 177 | window.addEventListener('tawkBeforeLoad', () => { 178 | callback(); 179 | }); 180 | }); 181 | 182 | this.app.provide('onChatMaximized', (callback) => { 183 | window.addEventListener('tawkChatMaximized', () => { 184 | callback(); 185 | }); 186 | }); 187 | 188 | this.app.provide('onChatMinimized', (callback) => { 189 | window.addEventListener('tawkChatMinimized', () => { 190 | callback(); 191 | }); 192 | }); 193 | 194 | this.app.provide('onChatHidden', (callback) => { 195 | window.addEventListener('tawkChatHidden', () => { 196 | callback(); 197 | }); 198 | }); 199 | 200 | this.app.provide('onChatStarted', (callback) => { 201 | window.addEventListener('tawkChatStarted', () => { 202 | callback(); 203 | }); 204 | }); 205 | 206 | this.app.provide('onChatEnded', (callback) => { 207 | window.addEventListener('tawkChatEnded', () => { 208 | callback(); 209 | }); 210 | }); 211 | 212 | this.app.provide('onPrechatSubmit', (callback) => { 213 | window.addEventListener('tawkPrechatSubmit', (data) => { 214 | callback(data.detail); 215 | }); 216 | }); 217 | 218 | this.app.provide('onOfflineSubmit', (callback) => { 219 | window.addEventListener('tawkOfflineSubmit', (data) => { 220 | callback(data.detail); 221 | }); 222 | }); 223 | 224 | this.app.provide('onChatMessageVisitor', (callback) => { 225 | window.addEventListener('tawkChatMessageVisitor', (message) => { 226 | callback(message.detail); 227 | }); 228 | }); 229 | 230 | this.app.provide('onChatMessageAgent', (callback) => { 231 | window.addEventListener('tawkChatMessageAgent', (message) => { 232 | callback(message.detail); 233 | }); 234 | }); 235 | 236 | this.app.provide('onChatMessageSystem', (callback) => { 237 | window.addEventListener('tawkChatMessageSystem', (message) => { 238 | callback(message.detail); 239 | }); 240 | }); 241 | 242 | this.app.provide('onAgentJoinChat', (callback) => { 243 | window.addEventListener('tawkAgentJoinChat', (data) => { 244 | callback(data.detail); 245 | }); 246 | }); 247 | 248 | this.app.provide('onAgentLeaveChat', (callback) => { 249 | window.addEventListener('tawkAgentLeaveChat', (data) => { 250 | callback(data.detail); 251 | }); 252 | }); 253 | 254 | this.app.provide('onChatSatisfaction', (callback) => { 255 | window.addEventListener('tawkChatSatisfaction', (satisfaction) => { 256 | callback(satisfaction.detail); 257 | }); 258 | }); 259 | 260 | this.app.provide('onVisitorNameChanged', (callback) => { 261 | window.addEventListener('tawkVisitorNameChanged', (visitorName) => { 262 | callback(visitorName.detail); 263 | }); 264 | }); 265 | 266 | this.app.provide('onFileUpload', (callback) => { 267 | window.addEventListener('tawkFileUpload', (link) => { 268 | callback(link.detail); 269 | }); 270 | }); 271 | 272 | this.app.provide('onTagsUpdated', (callback) => { 273 | window.addEventListener('tawkTagsUpdated', (data) => { 274 | callback(data.detail); 275 | }); 276 | }); 277 | 278 | this.app.provide('onUnreadCountChanged', (callback) => { 279 | window.addEventListener('tawkUnreadCountChanged', (data) => { 280 | callback(data.detail); 281 | }); 282 | }); 283 | } 284 | 285 | /** 286 | * API for setting a data on the widget 287 | */ 288 | provideSetters() { 289 | this.app.provide('visitor', (data) => { 290 | window.Tawk_API.visitor = data; 291 | }); 292 | 293 | this.app.provide('setAttributes', (attribute, callback) => { 294 | window.Tawk_API.setAttributes(attribute, callback); 295 | }); 296 | 297 | this.app.provide('addEvent', (event, metadata, callback) => { 298 | window.Tawk_API.addEvent(event, metadata, callback); 299 | }); 300 | 301 | this.app.provide('addTags', (tags, callback) => { 302 | window.Tawk_API.addTags(tags, callback); 303 | }); 304 | 305 | this.app.provide('removeTags', (tags, callback) => { 306 | window.Tawk_API.removeTags(tags, callback); 307 | }); 308 | 309 | this.app.provide('switchWidget', (data, callback) => { 310 | window.Tawk_API.switchWidget(data, callback); 311 | }); 312 | } 313 | } 314 | 315 | export default TawkMessenger; 316 | -------------------------------------------------------------------------------- /src/utils/helper.js: -------------------------------------------------------------------------------- 1 | function isValidString(value) { 2 | if (!value || value.length === 0) { 3 | return false; 4 | } 5 | 6 | return value !== null && value !== undefined && typeof value === 'string'; 7 | } 8 | 9 | export { 10 | isValidString 11 | }; 12 | -------------------------------------------------------------------------------- /src/utils/widget.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-vars */ 2 | 3 | function loadScript({propertyId = '', widgetId = '', embedId = '', basePath = 'tawk.to', autoStart = true}) { 4 | if (embedId.length) { 5 | /** 6 | * If the element with embedId as id we will create a new clement 7 | */ 8 | if (!document.getElementById(embedId)) { 9 | const element = document.createElement('div'); 10 | element.id = embedId; 11 | 12 | document.body.appendChild(element); 13 | } 14 | 15 | window.Tawk_API.embedded = embedId; 16 | } 17 | 18 | if (!autoStart) { 19 | window.Tawk_API.autoStart = autoStart; 20 | } 21 | 22 | const script = document.createElement('script'); 23 | script.async = true; 24 | script.src = `https://embed.${basePath}/${propertyId}/${widgetId}`; 25 | script.charset = 'UTF-8'; 26 | script.setAttribute('crossorigin', '*'); 27 | 28 | const firstScript = document.getElementsByTagName('script')[0]; 29 | firstScript.parentNode.insertBefore(script, firstScript); 30 | } 31 | 32 | export { 33 | loadScript 34 | }; -------------------------------------------------------------------------------- /tests/setup.js: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { vi } from 'vitest'; 3 | 4 | // Utilities 5 | import * as loadScriptFn from '../src/utils/widget'; 6 | 7 | vi.spyOn(loadScriptFn, 'loadScript').mockImplementation(() => {}); 8 | vi.spyOn(console, 'error').mockReturnValue(true); 9 | vi.spyOn(window, 'addEventListener'); -------------------------------------------------------------------------------- /tests/units/features.spec.js: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { describe, it, expect } from 'vitest'; 3 | 4 | // Utilities 5 | import { setupApp } from '../utils/helper'; 6 | 7 | describe('Tawk-messenger features', () => { 8 | const app = setupApp({ 9 | propertyId : 'property_id', 10 | widgetId : 'widget_id' 11 | }); 12 | 13 | const provides = app._context.provides; 14 | 15 | describe('Set default global properties', () => { 16 | it('Should set Tawk_API', () => { 17 | expect(typeof window.Tawk_API === 'object').toBe(true); 18 | }); 19 | 20 | it('Should set Tawk_LoadStart', () => { 21 | expect(window.Tawk_LoadStart instanceof Date).toBe(true); 22 | }); 23 | }); 24 | 25 | describe('Plugin Provides', () => { 26 | it('Should provide action functions', () => { 27 | expect(typeof provides.maximize === 'function').toBe(true); 28 | expect(typeof provides.minimize === 'function').toBe(true); 29 | expect(typeof provides.toggle === 'function').toBe(true); 30 | expect(typeof provides.popup === 'function').toBe(true); 31 | expect(typeof provides.showWidget === 'function').toBe(true); 32 | expect(typeof provides.hideWidget === 'function').toBe(true); 33 | expect(typeof provides.toggleVisibility === 'function').toBe(true); 34 | expect(typeof provides.endChat === 'function').toBe(true); 35 | }); 36 | 37 | it('Should provide getters functions', () => { 38 | expect(typeof provides.getWindowType === 'function').toBe(true); 39 | expect(typeof provides.getStatus === 'function').toBe(true); 40 | expect(typeof provides.isChatMaximized === 'function').toBe(true); 41 | expect(typeof provides.isChatMinimized === 'function').toBe(true); 42 | expect(typeof provides.isChatHidden === 'function').toBe(true); 43 | expect(typeof provides.isChatOngoing === 'function').toBe(true); 44 | expect(typeof provides.isVisitorEngaged === 'function').toBe(true); 45 | expect(typeof provides.onLoaded === 'function').toBe(true); 46 | expect(typeof provides.onBeforeLoaded === 'function').toBe(true); 47 | expect(typeof provides.widgetPosition === 'function').toBe(true); 48 | }); 49 | 50 | it('Should provide listeners functions', () => { 51 | it('Should add tawkLoad event listener', () => { 52 | expect(typeof provides.onLoad === 'function').toBe(true); 53 | 54 | provides.onLoad(() => {}); 55 | expect(window.addEventListener).toHaveBeenCalledWith('tawkLoad', expect.any(Function)); 56 | }); 57 | 58 | it('Should add tawkStatusChange event listener', () => { 59 | expect(typeof provides.onStatusChange === 'function').toBe(true); 60 | 61 | provides.onStatusChange(() => {}); 62 | expect(window.addEventListener).toHaveBeenCalledWith('tawkStatusChange', expect.any(Function)); 63 | }); 64 | 65 | it('Should add tawkBeforeLoad event listener', () => { 66 | expect(typeof provides.onBeforeLoad === 'function').toBe(true); 67 | 68 | provides.onBeforeLoad(() => {}); 69 | expect(window.addEventListener).toHaveBeenCalledWith('tawkBeforeLoad', expect.any(Function)); 70 | }); 71 | 72 | it('Should add tawkChatMaximized event listener', () => { 73 | expect(typeof provides.onChatMaximized === 'function').toBe(true); 74 | 75 | provides.onChatMaximized(() => {}); 76 | expect(window.addEventListener).toHaveBeenCalledWith('tawkChatMaximized', expect.any(Function)); 77 | }); 78 | 79 | it('Should add tawkChatMinimized event listener', () => { 80 | expect(typeof provides.onChatMinimized === 'function').toBe(true); 81 | 82 | provides.onChatMinimized(() => {}); 83 | expect(window.addEventListener).toHaveBeenCalledWith('tawkChatMinimized', expect.any(Function)); 84 | }); 85 | 86 | it('Should add tawkChatHidden event listener', () => { 87 | expect(typeof provides.onChatHidden === 'function').toBe(true); 88 | 89 | provides.onChatHidden(() => {}); 90 | expect(window.addEventListener).toHaveBeenCalledWith('tawkChatHidden', expect.any(Function)); 91 | }); 92 | 93 | it('Should add tawkChatStarted event listener', () => { 94 | expect(typeof provides.onChatStarted === 'function').toBe(true); 95 | 96 | provides.onChatStarted(() => {}); 97 | expect(window.addEventListener).toHaveBeenCalledWith('tawkChatStarted', expect.any(Function)); 98 | }); 99 | 100 | it('Should add tawkChatEnded event listener', () => { 101 | expect(typeof provides.onChatEnded === 'function').toBe(true); 102 | 103 | provides.onChatEnded(() => {}); 104 | expect(window.addEventListener).toHaveBeenCalledWith('tawkChatEnded', expect.any(Function)); 105 | }); 106 | 107 | it('Should add tawkPrechatSubmit event listener', () => { 108 | expect(typeof provides.onPrechatSubmit === 'function').toBe(true); 109 | 110 | provides.onPrechatSubmit(() => {}); 111 | expect(window.addEventListener).toHaveBeenCalledWith('tawkPrechatSubmit', expect.any(Function)); 112 | }); 113 | 114 | it('Should add tawkOfflineSubmit event listener', () => { 115 | expect(typeof provides.onOfflineSubmit === 'function').toBe(true); 116 | 117 | provides.onOfflineSubmit(() => {}); 118 | expect(window.addEventListener).toHaveBeenCalledWith('tawkOfflineSubmit', expect.any(Function)); 119 | }); 120 | 121 | it('Should add tawkChatMessageVisitor event listener', () => { 122 | expect(typeof provides.onChatMessageVisitor === 'function').toBe(true); 123 | 124 | provides.onChatMessageVisitor(() => {}); 125 | expect(window.addEventListener).toHaveBeenCalledWith('tawkChatMessageVisitor', expect.any(Function)); 126 | }); 127 | 128 | it('Should add tawkChatMessageAgent event listener', () => { 129 | expect(typeof provides.onChatMessageAgent === 'function').toBe(true); 130 | 131 | provides.onChatMessageAgent(() => {}); 132 | expect(window.addEventListener).toHaveBeenCalledWith('tawkChatMessageAgent', expect.any(Function)); 133 | }); 134 | 135 | it('Should add tawkChatMessageSystem event listener', () => { 136 | expect(typeof provides.onChatMessageSystem === 'function').toBe(true); 137 | 138 | provides.onChatMessageSystem(() => {}); 139 | expect(window.addEventListener).toHaveBeenCalledWith('tawkChatMessageSystem', expect.any(Function)); 140 | }); 141 | 142 | it('Should add tawkAgentJoinChat event listener', () => { 143 | expect(typeof provides.onAgentJoinChat === 'function').toBe(true); 144 | 145 | provides.onAgentJoinChat(() => {}); 146 | expect(window.addEventListener).toHaveBeenCalledWith('tawkAgentJoinChat', expect.any(Function)); 147 | }); 148 | 149 | it('Should add tawkAgentLeaveChat event listener', () => { 150 | expect(typeof provides.onAgentJoinChat === 'function').toBe(true); 151 | 152 | provides.onAgentJoinChat(() => {}); 153 | expect(window.addEventListener).toHaveBeenCalledWith('tawkAgentLeaveChat', expect.any(Function)); 154 | }); 155 | 156 | it('Should add tawkChatSatisfaction event listener', () => { 157 | expect(typeof provides.onChatSatisfaction === 'function').toBe(true); 158 | 159 | provides.onChatSatisfaction(() => {}); 160 | expect(window.addEventListener).toHaveBeenCalledWith('tawkChatSatisfaction', expect.any(Function)); 161 | }); 162 | 163 | it('Should add tawkVisitorNameChanged event listener', () => { 164 | expect(typeof provides.onVisitorNameChanged === 'function').toBe(true); 165 | 166 | provides.onVisitorNameChanged(() => {}); 167 | expect(window.addEventListener).toHaveBeenCalledWith('tawkVisitorNameChanged', expect.any(Function)); 168 | }); 169 | 170 | it('Should add tawkFileUpload event listener', () => { 171 | expect(typeof provides.onFileUpload === 'function').toBe(true); 172 | 173 | provides.onFileUpload(() => {}); 174 | expect(window.addEventListener).toHaveBeenCalledWith('tawkFileUpload', expect.any(Function)); 175 | }); 176 | 177 | it('Should add tawkTagsUpdated event listener', () => { 178 | expect(typeof provides.onTagsUpdated === 'function').toBe(true); 179 | 180 | provides.onTagsUpdated(() => {}); 181 | expect(window.addEventListener).toHaveBeenCalledWith('tawkTagsUpdated', expect.any(Function)); 182 | }); 183 | 184 | it('Should add tawkUnreadCountChanged event listener', () => { 185 | expect(typeof provides.onUnreadCountChanged === 'function').toBe(true); 186 | 187 | provides.onUnreadCountChanged(() => {}); 188 | expect(window.addEventListener).toHaveBeenCalledWith('tawkUnreadCountChanged', expect.any(Function)); 189 | }); 190 | }); 191 | 192 | it('Should provide setter functions', () => { 193 | expect(typeof provides.visitor === 'function').toBe(true); 194 | expect(typeof provides.setAttributes === 'function').toBe(true); 195 | expect(typeof provides.addEvent === 'function').toBe(true); 196 | expect(typeof provides.addTags === 'function').toBe(true); 197 | expect(typeof provides.removeTags === 'function').toBe(true); 198 | }); 199 | }); 200 | 201 | app.unmount(); 202 | }); -------------------------------------------------------------------------------- /tests/units/install.spec.js: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { afterEach, afterAll, describe, it, expect } from 'vitest'; 3 | 4 | // Utilities 5 | import { setupApp } from '../utils/helper'; 6 | 7 | 8 | describe('Install tawk-messenger-vue-3 as plugin', () => { 9 | afterAll(() => { 10 | console.error.mockRestore(); 11 | }); 12 | 13 | afterEach(() => { 14 | console.error.mockClear(); 15 | }); 16 | 17 | it('Should throw an error for missing `propertyId` option', () => { 18 | const app = setupApp(); 19 | 20 | expect(console.error).toHaveBeenCalledOnce(); 21 | 22 | app.unmount(); 23 | }); 24 | 25 | it('Should throw an error for missing `widgetId` option', () => { 26 | const app = setupApp(); 27 | 28 | expect(console.error).toHaveBeenCalledOnce(); 29 | 30 | app.unmount(); 31 | }); 32 | 33 | it('Should not throw an error', () => { 34 | const app = setupApp({ 35 | propertyId : 'property_id', 36 | widgetId : 'widget_id' 37 | }); 38 | 39 | expect(console.error).toHaveBeenCalledTimes(0); 40 | 41 | app.unmount(); 42 | }); 43 | }); 44 | -------------------------------------------------------------------------------- /tests/units/lib.spec.js: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { describe, it, expect, vi } from 'vitest'; 3 | 4 | // Library 5 | import TawkMessenger from '../../src/lib'; 6 | 7 | // Utilities 8 | import { loadScript } from '../../src/utils/widget'; 9 | 10 | describe('Tawk-messenger Library', () => { 11 | describe('Set the properties value', () => { 12 | it('Should set empty properties', () => { 13 | const tawkMessenger = new TawkMessenger(TawkMessenger, {}); 14 | 15 | expect(tawkMessenger).toEqual( 16 | expect.not.objectContaining({ 17 | app : TawkMessenger, 18 | propertyId : undefined, 19 | widgetId : undefined, 20 | embedId : undefined, 21 | customStyle : undefined, 22 | basePath : undefined 23 | }) 24 | ); 25 | }); 26 | 27 | it('Should set empty properties', () => { 28 | const tawkMessenger = new TawkMessenger(TawkMessenger, { 29 | propertyId : 'property_id', 30 | widgetId : 'widget_id' 31 | }); 32 | 33 | expect(tawkMessenger).toEqual( 34 | expect.objectContaining({ 35 | app : TawkMessenger, 36 | propertyId : 'property_id', 37 | widgetId : 'widget_id', 38 | embedId : undefined, 39 | customStyle : undefined, 40 | basePath : undefined 41 | }) 42 | ); 43 | }); 44 | }); 45 | 46 | describe('Embed widget', () => { 47 | it('Should request TawkMessenger script', () => { 48 | const tawkMessenger = new TawkMessenger(TawkMessenger, 49 | { 50 | propertyId : 'property_id', 51 | widgetId : 'widget_id', 52 | embedId : 'embed_id' 53 | } 54 | ); 55 | 56 | vi.spyOn(tawkMessenger, 'init'); 57 | 58 | tawkMessenger.load(); 59 | 60 | expect(loadScript).toHaveBeenCalledWith({ 61 | propertyId : 'property_id', 62 | widgetId : 'widget_id', 63 | embedId : 'embed_id' 64 | }); 65 | }); 66 | }); 67 | }); -------------------------------------------------------------------------------- /tests/utils/helper.js: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { createApp } from 'vue'; 3 | 4 | // Library 5 | import TawkMessengerVue from '../../src/index'; 6 | 7 | function setupApp(options) { 8 | const app = createApp({ 9 | template: '
' 10 | }); 11 | 12 | /** 13 | * Mount vue 14 | */ 15 | app.mount(document.createElement('div')); 16 | 17 | /** 18 | * Set to use the TawkMessengerVue 19 | */ 20 | app.use(TawkMessengerVue, options); 21 | 22 | /** 23 | * Return the instance 24 | */ 25 | return app; 26 | }; 27 | 28 | export { 29 | setupApp 30 | }; -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import { defineConfig } from 'vite' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | build : { 7 | lib : { 8 | entry : path.resolve(__dirname, 'src/index.js'), 9 | name : 'tawk-messenger-vue-3', 10 | fileName : (format) => `tawk-messenger-vue-3.${format}.js` 11 | }, 12 | rollupOptions : { 13 | external : ['vue'], 14 | output : { 15 | globals : { 16 | vue: 'Vue' 17 | } 18 | } 19 | } 20 | } 21 | }) 22 | -------------------------------------------------------------------------------- /vitest.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config' 2 | 3 | export default defineConfig({ 4 | test: { 5 | environment : 'jsdom', 6 | setupFiles : './tests/setup.js', 7 | coverage : { 8 | reporter : ['text', 'json', 'html'] 9 | } 10 | } 11 | }) --------------------------------------------------------------------------------