├── .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 |
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 | })
--------------------------------------------------------------------------------