├── .gitignore
├── .prettierignore
├── .prettierrc.json
├── LICENSE
├── README.md
├── demo
└── index.html
├── dist
├── PointerTracker-min.js
├── PointerTracker.js
├── PointerTracker.mjs
└── index.d.ts
├── lib
├── index.ts
└── missing-types.d.ts
├── package-lock.json
├── package.json
├── rollup.config.js
└── tsconfig.json
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .vscode
3 | .rpt2_cache
4 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | dist
2 |
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "all"
4 | }
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PointerTracker
2 |
3 | Track mouse/touch/pointer events for a given element.
4 |
5 | ## API
6 |
7 | ### PointerTracker
8 |
9 | ```js
10 | import PointerTracker from 'pointer-tracker';
11 |
12 | const pointerTracker = new PointerTracker(element, {
13 | start(pointer, event) {
14 | // Called when a pointer is pressed/touched within the element.
15 | //
16 | // pointer - The new pointer. This pointer isn't included in this.currentPointers or
17 | // this.startPointers yet.
18 | //
19 | // event - The event related to this pointer.
20 | //
21 | // Return true from this callback if you're interested in further events about this pointer,
22 | // such as 'move' and 'end'.
23 | },
24 | move(previousPointers, changedPointers, event) {
25 | // Called when pointers have moved.
26 | //
27 | // previousPointers - The state of the pointers before this event. This contains the same number
28 | // of pointers, in the same order, as this.currentPointers and this.startPointers.
29 | //
30 | // changedPointers - The pointers that have changed since the last move callback.
31 | //
32 | // event - The event related to the pointer changes.
33 | },
34 | end(pointer, event, cancelled) {
35 | // Called when a pointer is released.
36 | //
37 | // pointer - The final state of the pointer that ended. This pointer is now absent from
38 | // this.currentPointers and this.startPointers.
39 | //
40 | // event - The event related to this pointer.
41 | //
42 | // cancelled - True if the event was cancelled. Actions are cancelled when the OS takes over
43 | // pointer events, for actions such as scrolling.
44 | },
45 | // Avoid pointer events in favour of touch and mouse events?
46 | //
47 | // Even if the browser supports pointer events, you may want to force the browser to use
48 | // mouse/touch fallbacks, to work around bugs such as
49 | // https://bugs.webkit.org/show_bug.cgi?id=220196.
50 | //
51 | // The default is false.
52 | avoidPointerEvents: false,
53 | // Use raw pointer updates? Pointer events are usually synchronised to requestAnimationFrame.
54 | // However, if you're targeting a desynchronised canvas, then faster 'raw' updates are better.
55 | //
56 | // This feature only applies to pointer events. The default is false.
57 | rawUpdates: false,
58 | });
59 |
60 | // State of the tracked pointers when they were pressed/touched.
61 | pointerTracker.startPointers;
62 | // Latest state of the tracked pointers. Contains the same number of pointers, and in the same order
63 | // as this.startPointers.
64 | pointerTracker.currentPointers;
65 | // Remove all listeners. Call this when you're done tracking.
66 | pointerTracker.stop();
67 | ```
68 |
69 | ### Pointer
70 |
71 | ```js
72 | const pointer = pointerTracker.currentPointers[0];
73 |
74 | // x offset from the top of the document
75 | pointer.pageX;
76 | // y offset from the top of the document
77 | pointer.pageY;
78 | // x offset from the top of the viewport
79 | pointer.clientX;
80 | // y offset from the top of the viewport
81 | pointer.clientY;
82 | // Unique ID for this pointer
83 | pointer.id;
84 | // The platform object used to create this Pointer
85 | pointer.nativePointer;
86 | // Returns an expanded set of Pointers for high-resolution inputs.
87 | const pointers = pointer.getCoalesced();
88 | ```
89 |
90 | ## Demo
91 |
92 | [A simple painting app](https://pointer-tracker-demo.glitch.me/) ([code](https://glitch.com/edit/#!/pointer-tracker-demo?path=public/index.html)).
93 |
94 | ## Files
95 |
96 | - `lib/index.ts` - Original TypeScript.
97 | - `dist/PointerTracker.mjs` - JS module. Default exports PointerTracker.
98 | - `dist/PointerTracker.js` - UMD JS. Exposes PointerTracker on the global by default.
99 | - `dist/PointerTracker-min.js` - Minified UMD JS. ~900 bytes brotli'd.
100 |
--------------------------------------------------------------------------------
/demo/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Simple painting app
7 |
25 |
26 |
27 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/dist/PointerTracker-min.js:
--------------------------------------------------------------------------------
1 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).PointerTracker=t()}(this,(function(){"use strict";class e{constructor(e){this.id=-1,this.nativePointer=e,this.pageX=e.pageX,this.pageY=e.pageY,this.clientX=e.clientX,this.clientY=e.clientY,self.Touch&&e instanceof Touch?this.id=e.identifier:t(e)&&(this.id=e.pointerId)}getCoalesced(){if("getCoalescedEvents"in this.nativePointer){const t=this.nativePointer.getCoalescedEvents().map(t=>new e(t));if(t.length>0)return t}return[this]}}const t=e=>"pointerId"in e,n=e=>"changedTouches"in e,i=()=>{};return class{constructor(s,{start:r=(()=>!0),move:o=i,end:h=i,rawUpdates:d=!1,avoidPointerEvents:a=!1}={}){this._element=s,this.startPointers=[],this.currentPointers=[],this._excludeFromButtonsCheck=new Set,this._pointerStart=n=>{if(t(n)&&0===n.buttons)this._excludeFromButtonsCheck.add(n.pointerId);else if(!(1&n.buttons))return;const i=new e(n);if(!this.currentPointers.some(e=>e.id===i.id)&&this._triggerPointerStart(i,n))if(t(n)){(n.target&&"setPointerCapture"in n.target?n.target:this._element).setPointerCapture(n.pointerId),this._element.addEventListener(this._rawUpdates?"pointerrawupdate":"pointermove",this._move),this._element.addEventListener("pointerup",this._pointerEnd),this._element.addEventListener("pointercancel",this._pointerEnd)}else window.addEventListener("mousemove",this._move),window.addEventListener("mouseup",this._pointerEnd)},this._touchStart=t=>{for(const n of Array.from(t.changedTouches))this._triggerPointerStart(new e(n),t)},this._move=i=>{if(!(n(i)||t(i)&&this._excludeFromButtonsCheck.has(i.pointerId)||0!==i.buttons))return void this._pointerEnd(i);const s=this.currentPointers.slice(),r=n(i)?Array.from(i.changedTouches).map(t=>new e(t)):[new e(i)],o=[];for(const e of r){const t=this.currentPointers.findIndex(t=>t.id===e.id);-1!==t&&(o.push(e),this.currentPointers[t]=e)}0!==o.length&&this._moveCallback(s,o,i)},this._triggerPointerEnd=(e,t)=>{if(!n(t)&&1&t.buttons)return!1;const i=this.currentPointers.findIndex(t=>t.id===e.id);if(-1===i)return!1;this.currentPointers.splice(i,1),this.startPointers.splice(i,1),this._excludeFromButtonsCheck.delete(e.id);const s=!("mouseup"===t.type||"touchend"===t.type||"pointerup"===t.type);return this._endCallback(e,t,s),!0},this._pointerEnd=n=>{if(this._triggerPointerEnd(new e(n),n))if(t(n)){if(this.currentPointers.length)return;this._element.removeEventListener(this._rawUpdates?"pointerrawupdate":"pointermove",this._move),this._element.removeEventListener("pointerup",this._pointerEnd),this._element.removeEventListener("pointercancel",this._pointerEnd)}else window.removeEventListener("mousemove",this._move),window.removeEventListener("mouseup",this._pointerEnd)},this._touchEnd=t=>{for(const n of Array.from(t.changedTouches))this._triggerPointerEnd(new e(n),t)},this._startCallback=r,this._moveCallback=o,this._endCallback=h,this._rawUpdates=d&&"onpointerrawupdate"in window,self.PointerEvent&&!a?this._element.addEventListener("pointerdown",this._pointerStart):(this._element.addEventListener("mousedown",this._pointerStart),this._element.addEventListener("touchstart",this._touchStart),this._element.addEventListener("touchmove",this._move),this._element.addEventListener("touchend",this._touchEnd),this._element.addEventListener("touchcancel",this._touchEnd))}stop(){this._element.removeEventListener("pointerdown",this._pointerStart),this._element.removeEventListener("mousedown",this._pointerStart),this._element.removeEventListener("touchstart",this._touchStart),this._element.removeEventListener("touchmove",this._move),this._element.removeEventListener("touchend",this._touchEnd),this._element.removeEventListener("touchcancel",this._touchEnd),this._element.removeEventListener(this._rawUpdates?"pointerrawupdate":"pointermove",this._move),this._element.removeEventListener("pointerup",this._pointerEnd),this._element.removeEventListener("pointercancel",this._pointerEnd),window.removeEventListener("mousemove",this._move),window.removeEventListener("mouseup",this._pointerEnd)}_triggerPointerStart(e,t){return!!this._startCallback(e,t)&&(this.currentPointers.push(e),this.startPointers.push(e),!0)}}}));
2 |
--------------------------------------------------------------------------------
/dist/PointerTracker.js:
--------------------------------------------------------------------------------
1 | (function (global, factory) {
2 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3 | typeof define === 'function' && define.amd ? define(factory) :
4 | (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.PointerTracker = factory());
5 | }(this, (function () { 'use strict';
6 |
7 | class Pointer {
8 | constructor(nativePointer) {
9 | /** Unique ID for this pointer */
10 | this.id = -1;
11 | this.nativePointer = nativePointer;
12 | this.pageX = nativePointer.pageX;
13 | this.pageY = nativePointer.pageY;
14 | this.clientX = nativePointer.clientX;
15 | this.clientY = nativePointer.clientY;
16 | if (self.Touch && nativePointer instanceof Touch) {
17 | this.id = nativePointer.identifier;
18 | }
19 | else if (isPointerEvent(nativePointer)) {
20 | // is PointerEvent
21 | this.id = nativePointer.pointerId;
22 | }
23 | }
24 | /**
25 | * Returns an expanded set of Pointers for high-resolution inputs.
26 | */
27 | getCoalesced() {
28 | if ('getCoalescedEvents' in this.nativePointer) {
29 | const events = this.nativePointer
30 | .getCoalescedEvents()
31 | .map((p) => new Pointer(p));
32 | // Firefox sometimes returns an empty list here. I'm not sure it's doing the right thing.
33 | // https://github.com/w3c/pointerevents/issues/409
34 | if (events.length > 0)
35 | return events;
36 | }
37 | return [this];
38 | }
39 | }
40 | const isPointerEvent = (event) => 'pointerId' in event;
41 | const isTouchEvent = (event) => 'changedTouches' in event;
42 | const noop = () => { };
43 | /**
44 | * Track pointers across a particular element
45 | */
46 | class PointerTracker {
47 | /**
48 | * Track pointers across a particular element
49 | *
50 | * @param element Element to monitor.
51 | * @param options
52 | */
53 | constructor(_element, { start = () => true, move = noop, end = noop, rawUpdates = false, avoidPointerEvents = false, } = {}) {
54 | this._element = _element;
55 | /**
56 | * State of the tracked pointers when they were pressed/touched.
57 | */
58 | this.startPointers = [];
59 | /**
60 | * Latest state of the tracked pointers. Contains the same number of pointers, and in the same
61 | * order as this.startPointers.
62 | */
63 | this.currentPointers = [];
64 | /**
65 | * Firefox has a bug where touch-based pointer events have a `buttons` of 0, when this shouldn't
66 | * happen. https://bugzilla.mozilla.org/show_bug.cgi?id=1729440
67 | *
68 | * Usually we treat `buttons === 0` as no-longer-pressed. This set allows us to exclude these
69 | * buggy Firefox events.
70 | */
71 | this._excludeFromButtonsCheck = new Set();
72 | /**
73 | * Listener for mouse/pointer starts.
74 | *
75 | * @param event This will only be a MouseEvent if the browser doesn't support pointer events.
76 | */
77 | this._pointerStart = (event) => {
78 | if (isPointerEvent(event) && event.buttons === 0) {
79 | // This is the buggy Firefox case. See _excludeFromButtonsCheck.
80 | this._excludeFromButtonsCheck.add(event.pointerId);
81 | }
82 | else if (!(event.buttons & 1 /* LeftMouseOrTouchOrPenDown */)) {
83 | return;
84 | }
85 | const pointer = new Pointer(event);
86 | // If we're already tracking this pointer, ignore this event.
87 | // This happens with mouse events when multiple buttons are pressed.
88 | if (this.currentPointers.some((p) => p.id === pointer.id))
89 | return;
90 | if (!this._triggerPointerStart(pointer, event))
91 | return;
92 | // Add listeners for additional events.
93 | // The listeners may already exist, but no harm in adding them again.
94 | if (isPointerEvent(event)) {
95 | const capturingElement = event.target && 'setPointerCapture' in event.target
96 | ? event.target
97 | : this._element;
98 | capturingElement.setPointerCapture(event.pointerId);
99 | this._element.addEventListener(this._rawUpdates ? 'pointerrawupdate' : 'pointermove', this._move);
100 | this._element.addEventListener('pointerup', this._pointerEnd);
101 | this._element.addEventListener('pointercancel', this._pointerEnd);
102 | }
103 | else {
104 | // MouseEvent
105 | window.addEventListener('mousemove', this._move);
106 | window.addEventListener('mouseup', this._pointerEnd);
107 | }
108 | };
109 | /**
110 | * Listener for touchstart.
111 | * Only used if the browser doesn't support pointer events.
112 | */
113 | this._touchStart = (event) => {
114 | for (const touch of Array.from(event.changedTouches)) {
115 | this._triggerPointerStart(new Pointer(touch), event);
116 | }
117 | };
118 | /**
119 | * Listener for pointer/mouse/touch move events.
120 | */
121 | this._move = (event) => {
122 | if (!isTouchEvent(event) &&
123 | (!isPointerEvent(event) ||
124 | !this._excludeFromButtonsCheck.has(event.pointerId)) &&
125 | event.buttons === 0 /* None */) {
126 | // This happens in a number of buggy cases where the browser failed to deliver a pointerup
127 | // or pointercancel. If we see the pointer moving without any buttons down, synthesize an end.
128 | // https://github.com/w3c/pointerevents/issues/407
129 | // https://github.com/w3c/pointerevents/issues/408
130 | this._pointerEnd(event);
131 | return;
132 | }
133 | const previousPointers = this.currentPointers.slice();
134 | const changedPointers = isTouchEvent(event)
135 | ? Array.from(event.changedTouches).map((t) => new Pointer(t))
136 | : [new Pointer(event)];
137 | const trackedChangedPointers = [];
138 | for (const pointer of changedPointers) {
139 | const index = this.currentPointers.findIndex((p) => p.id === pointer.id);
140 | if (index === -1)
141 | continue; // Not a pointer we're tracking
142 | trackedChangedPointers.push(pointer);
143 | this.currentPointers[index] = pointer;
144 | }
145 | if (trackedChangedPointers.length === 0)
146 | return;
147 | this._moveCallback(previousPointers, trackedChangedPointers, event);
148 | };
149 | /**
150 | * Call the end callback for this pointer.
151 | *
152 | * @param pointer Pointer
153 | * @param event Related event
154 | */
155 | this._triggerPointerEnd = (pointer, event) => {
156 | // Main button still down?
157 | // With mouse events, you get a mouseup per mouse button, so the left button might still be down.
158 | if (!isTouchEvent(event) &&
159 | event.buttons & 1 /* LeftMouseOrTouchOrPenDown */) {
160 | return false;
161 | }
162 | const index = this.currentPointers.findIndex((p) => p.id === pointer.id);
163 | // Not a pointer we're interested in?
164 | if (index === -1)
165 | return false;
166 | this.currentPointers.splice(index, 1);
167 | this.startPointers.splice(index, 1);
168 | this._excludeFromButtonsCheck.delete(pointer.id);
169 | // The event.type might be a 'move' event due to workarounds for weird mouse behaviour.
170 | // See _move for details.
171 | const cancelled = !(event.type === 'mouseup' ||
172 | event.type === 'touchend' ||
173 | event.type === 'pointerup');
174 | this._endCallback(pointer, event, cancelled);
175 | return true;
176 | };
177 | /**
178 | * Listener for mouse/pointer ends.
179 | *
180 | * @param event This will only be a MouseEvent if the browser doesn't support pointer events.
181 | */
182 | this._pointerEnd = (event) => {
183 | if (!this._triggerPointerEnd(new Pointer(event), event))
184 | return;
185 | if (isPointerEvent(event)) {
186 | if (this.currentPointers.length)
187 | return;
188 | this._element.removeEventListener(this._rawUpdates ? 'pointerrawupdate' : 'pointermove', this._move);
189 | this._element.removeEventListener('pointerup', this._pointerEnd);
190 | this._element.removeEventListener('pointercancel', this._pointerEnd);
191 | }
192 | else {
193 | // MouseEvent
194 | window.removeEventListener('mousemove', this._move);
195 | window.removeEventListener('mouseup', this._pointerEnd);
196 | }
197 | };
198 | /**
199 | * Listener for touchend.
200 | * Only used if the browser doesn't support pointer events.
201 | */
202 | this._touchEnd = (event) => {
203 | for (const touch of Array.from(event.changedTouches)) {
204 | this._triggerPointerEnd(new Pointer(touch), event);
205 | }
206 | };
207 | this._startCallback = start;
208 | this._moveCallback = move;
209 | this._endCallback = end;
210 | this._rawUpdates = rawUpdates && 'onpointerrawupdate' in window;
211 | // Add listeners
212 | if (self.PointerEvent && !avoidPointerEvents) {
213 | this._element.addEventListener('pointerdown', this._pointerStart);
214 | }
215 | else {
216 | this._element.addEventListener('mousedown', this._pointerStart);
217 | this._element.addEventListener('touchstart', this._touchStart);
218 | this._element.addEventListener('touchmove', this._move);
219 | this._element.addEventListener('touchend', this._touchEnd);
220 | this._element.addEventListener('touchcancel', this._touchEnd);
221 | }
222 | }
223 | /**
224 | * Remove all listeners.
225 | */
226 | stop() {
227 | this._element.removeEventListener('pointerdown', this._pointerStart);
228 | this._element.removeEventListener('mousedown', this._pointerStart);
229 | this._element.removeEventListener('touchstart', this._touchStart);
230 | this._element.removeEventListener('touchmove', this._move);
231 | this._element.removeEventListener('touchend', this._touchEnd);
232 | this._element.removeEventListener('touchcancel', this._touchEnd);
233 | this._element.removeEventListener(this._rawUpdates ? 'pointerrawupdate' : 'pointermove', this._move);
234 | this._element.removeEventListener('pointerup', this._pointerEnd);
235 | this._element.removeEventListener('pointercancel', this._pointerEnd);
236 | window.removeEventListener('mousemove', this._move);
237 | window.removeEventListener('mouseup', this._pointerEnd);
238 | }
239 | /**
240 | * Call the start callback for this pointer, and track it if the user wants.
241 | *
242 | * @param pointer Pointer
243 | * @param event Related event
244 | * @returns Whether the pointer is being tracked.
245 | */
246 | _triggerPointerStart(pointer, event) {
247 | if (!this._startCallback(pointer, event))
248 | return false;
249 | this.currentPointers.push(pointer);
250 | this.startPointers.push(pointer);
251 | return true;
252 | }
253 | }
254 |
255 | return PointerTracker;
256 |
257 | })));
258 |
--------------------------------------------------------------------------------
/dist/PointerTracker.mjs:
--------------------------------------------------------------------------------
1 | class Pointer {
2 | constructor(nativePointer) {
3 | /** Unique ID for this pointer */
4 | this.id = -1;
5 | this.nativePointer = nativePointer;
6 | this.pageX = nativePointer.pageX;
7 | this.pageY = nativePointer.pageY;
8 | this.clientX = nativePointer.clientX;
9 | this.clientY = nativePointer.clientY;
10 | if (self.Touch && nativePointer instanceof Touch) {
11 | this.id = nativePointer.identifier;
12 | }
13 | else if (isPointerEvent(nativePointer)) {
14 | // is PointerEvent
15 | this.id = nativePointer.pointerId;
16 | }
17 | }
18 | /**
19 | * Returns an expanded set of Pointers for high-resolution inputs.
20 | */
21 | getCoalesced() {
22 | if ('getCoalescedEvents' in this.nativePointer) {
23 | const events = this.nativePointer
24 | .getCoalescedEvents()
25 | .map((p) => new Pointer(p));
26 | // Firefox sometimes returns an empty list here. I'm not sure it's doing the right thing.
27 | // https://github.com/w3c/pointerevents/issues/409
28 | if (events.length > 0)
29 | return events;
30 | }
31 | return [this];
32 | }
33 | }
34 | const isPointerEvent = (event) => 'pointerId' in event;
35 | const isTouchEvent = (event) => 'changedTouches' in event;
36 | const noop = () => { };
37 | /**
38 | * Track pointers across a particular element
39 | */
40 | class PointerTracker {
41 | /**
42 | * Track pointers across a particular element
43 | *
44 | * @param element Element to monitor.
45 | * @param options
46 | */
47 | constructor(_element, { start = () => true, move = noop, end = noop, rawUpdates = false, avoidPointerEvents = false, } = {}) {
48 | this._element = _element;
49 | /**
50 | * State of the tracked pointers when they were pressed/touched.
51 | */
52 | this.startPointers = [];
53 | /**
54 | * Latest state of the tracked pointers. Contains the same number of pointers, and in the same
55 | * order as this.startPointers.
56 | */
57 | this.currentPointers = [];
58 | /**
59 | * Firefox has a bug where touch-based pointer events have a `buttons` of 0, when this shouldn't
60 | * happen. https://bugzilla.mozilla.org/show_bug.cgi?id=1729440
61 | *
62 | * Usually we treat `buttons === 0` as no-longer-pressed. This set allows us to exclude these
63 | * buggy Firefox events.
64 | */
65 | this._excludeFromButtonsCheck = new Set();
66 | /**
67 | * Listener for mouse/pointer starts.
68 | *
69 | * @param event This will only be a MouseEvent if the browser doesn't support pointer events.
70 | */
71 | this._pointerStart = (event) => {
72 | if (isPointerEvent(event) && event.buttons === 0) {
73 | // This is the buggy Firefox case. See _excludeFromButtonsCheck.
74 | this._excludeFromButtonsCheck.add(event.pointerId);
75 | }
76 | else if (!(event.buttons & 1 /* LeftMouseOrTouchOrPenDown */)) {
77 | return;
78 | }
79 | const pointer = new Pointer(event);
80 | // If we're already tracking this pointer, ignore this event.
81 | // This happens with mouse events when multiple buttons are pressed.
82 | if (this.currentPointers.some((p) => p.id === pointer.id))
83 | return;
84 | if (!this._triggerPointerStart(pointer, event))
85 | return;
86 | // Add listeners for additional events.
87 | // The listeners may already exist, but no harm in adding them again.
88 | if (isPointerEvent(event)) {
89 | const capturingElement = event.target && 'setPointerCapture' in event.target
90 | ? event.target
91 | : this._element;
92 | capturingElement.setPointerCapture(event.pointerId);
93 | this._element.addEventListener(this._rawUpdates ? 'pointerrawupdate' : 'pointermove', this._move);
94 | this._element.addEventListener('pointerup', this._pointerEnd);
95 | this._element.addEventListener('pointercancel', this._pointerEnd);
96 | }
97 | else {
98 | // MouseEvent
99 | window.addEventListener('mousemove', this._move);
100 | window.addEventListener('mouseup', this._pointerEnd);
101 | }
102 | };
103 | /**
104 | * Listener for touchstart.
105 | * Only used if the browser doesn't support pointer events.
106 | */
107 | this._touchStart = (event) => {
108 | for (const touch of Array.from(event.changedTouches)) {
109 | this._triggerPointerStart(new Pointer(touch), event);
110 | }
111 | };
112 | /**
113 | * Listener for pointer/mouse/touch move events.
114 | */
115 | this._move = (event) => {
116 | if (!isTouchEvent(event) &&
117 | (!isPointerEvent(event) ||
118 | !this._excludeFromButtonsCheck.has(event.pointerId)) &&
119 | event.buttons === 0 /* None */) {
120 | // This happens in a number of buggy cases where the browser failed to deliver a pointerup
121 | // or pointercancel. If we see the pointer moving without any buttons down, synthesize an end.
122 | // https://github.com/w3c/pointerevents/issues/407
123 | // https://github.com/w3c/pointerevents/issues/408
124 | this._pointerEnd(event);
125 | return;
126 | }
127 | const previousPointers = this.currentPointers.slice();
128 | const changedPointers = isTouchEvent(event)
129 | ? Array.from(event.changedTouches).map((t) => new Pointer(t))
130 | : [new Pointer(event)];
131 | const trackedChangedPointers = [];
132 | for (const pointer of changedPointers) {
133 | const index = this.currentPointers.findIndex((p) => p.id === pointer.id);
134 | if (index === -1)
135 | continue; // Not a pointer we're tracking
136 | trackedChangedPointers.push(pointer);
137 | this.currentPointers[index] = pointer;
138 | }
139 | if (trackedChangedPointers.length === 0)
140 | return;
141 | this._moveCallback(previousPointers, trackedChangedPointers, event);
142 | };
143 | /**
144 | * Call the end callback for this pointer.
145 | *
146 | * @param pointer Pointer
147 | * @param event Related event
148 | */
149 | this._triggerPointerEnd = (pointer, event) => {
150 | // Main button still down?
151 | // With mouse events, you get a mouseup per mouse button, so the left button might still be down.
152 | if (!isTouchEvent(event) &&
153 | event.buttons & 1 /* LeftMouseOrTouchOrPenDown */) {
154 | return false;
155 | }
156 | const index = this.currentPointers.findIndex((p) => p.id === pointer.id);
157 | // Not a pointer we're interested in?
158 | if (index === -1)
159 | return false;
160 | this.currentPointers.splice(index, 1);
161 | this.startPointers.splice(index, 1);
162 | this._excludeFromButtonsCheck.delete(pointer.id);
163 | // The event.type might be a 'move' event due to workarounds for weird mouse behaviour.
164 | // See _move for details.
165 | const cancelled = !(event.type === 'mouseup' ||
166 | event.type === 'touchend' ||
167 | event.type === 'pointerup');
168 | this._endCallback(pointer, event, cancelled);
169 | return true;
170 | };
171 | /**
172 | * Listener for mouse/pointer ends.
173 | *
174 | * @param event This will only be a MouseEvent if the browser doesn't support pointer events.
175 | */
176 | this._pointerEnd = (event) => {
177 | if (!this._triggerPointerEnd(new Pointer(event), event))
178 | return;
179 | if (isPointerEvent(event)) {
180 | if (this.currentPointers.length)
181 | return;
182 | this._element.removeEventListener(this._rawUpdates ? 'pointerrawupdate' : 'pointermove', this._move);
183 | this._element.removeEventListener('pointerup', this._pointerEnd);
184 | this._element.removeEventListener('pointercancel', this._pointerEnd);
185 | }
186 | else {
187 | // MouseEvent
188 | window.removeEventListener('mousemove', this._move);
189 | window.removeEventListener('mouseup', this._pointerEnd);
190 | }
191 | };
192 | /**
193 | * Listener for touchend.
194 | * Only used if the browser doesn't support pointer events.
195 | */
196 | this._touchEnd = (event) => {
197 | for (const touch of Array.from(event.changedTouches)) {
198 | this._triggerPointerEnd(new Pointer(touch), event);
199 | }
200 | };
201 | this._startCallback = start;
202 | this._moveCallback = move;
203 | this._endCallback = end;
204 | this._rawUpdates = rawUpdates && 'onpointerrawupdate' in window;
205 | // Add listeners
206 | if (self.PointerEvent && !avoidPointerEvents) {
207 | this._element.addEventListener('pointerdown', this._pointerStart);
208 | }
209 | else {
210 | this._element.addEventListener('mousedown', this._pointerStart);
211 | this._element.addEventListener('touchstart', this._touchStart);
212 | this._element.addEventListener('touchmove', this._move);
213 | this._element.addEventListener('touchend', this._touchEnd);
214 | this._element.addEventListener('touchcancel', this._touchEnd);
215 | }
216 | }
217 | /**
218 | * Remove all listeners.
219 | */
220 | stop() {
221 | this._element.removeEventListener('pointerdown', this._pointerStart);
222 | this._element.removeEventListener('mousedown', this._pointerStart);
223 | this._element.removeEventListener('touchstart', this._touchStart);
224 | this._element.removeEventListener('touchmove', this._move);
225 | this._element.removeEventListener('touchend', this._touchEnd);
226 | this._element.removeEventListener('touchcancel', this._touchEnd);
227 | this._element.removeEventListener(this._rawUpdates ? 'pointerrawupdate' : 'pointermove', this._move);
228 | this._element.removeEventListener('pointerup', this._pointerEnd);
229 | this._element.removeEventListener('pointercancel', this._pointerEnd);
230 | window.removeEventListener('mousemove', this._move);
231 | window.removeEventListener('mouseup', this._pointerEnd);
232 | }
233 | /**
234 | * Call the start callback for this pointer, and track it if the user wants.
235 | *
236 | * @param pointer Pointer
237 | * @param event Related event
238 | * @returns Whether the pointer is being tracked.
239 | */
240 | _triggerPointerStart(pointer, event) {
241 | if (!this._startCallback(pointer, event))
242 | return false;
243 | this.currentPointers.push(pointer);
244 | this.startPointers.push(pointer);
245 | return true;
246 | }
247 | }
248 |
249 | export { PointerTracker as default };
250 |
--------------------------------------------------------------------------------
/dist/index.d.ts:
--------------------------------------------------------------------------------
1 | declare class Pointer {
2 | /** x offset from the top of the document */
3 | pageX: number;
4 | /** y offset from the top of the document */
5 | pageY: number;
6 | /** x offset from the top of the viewport */
7 | clientX: number;
8 | /** y offset from the top of the viewport */
9 | clientY: number;
10 | /** Unique ID for this pointer */
11 | id: number;
12 | /** The platform object used to create this Pointer */
13 | nativePointer: Touch | PointerEvent | MouseEvent;
14 | constructor(nativePointer: Touch | PointerEvent | MouseEvent);
15 | /**
16 | * Returns an expanded set of Pointers for high-resolution inputs.
17 | */
18 | getCoalesced(): Pointer[];
19 | }
20 | declare type PointerType = Pointer;
21 | export { PointerType as Pointer };
22 | export declare type InputEvent = TouchEvent | PointerEvent | MouseEvent;
23 | declare type StartCallback = (pointer: Pointer, event: InputEvent) => boolean;
24 | declare type MoveCallback = (previousPointers: Pointer[], changedPointers: Pointer[], event: InputEvent) => void;
25 | declare type EndCallback = (pointer: Pointer, event: InputEvent, cancelled: boolean) => void;
26 | interface PointerTrackerOptions {
27 | /**
28 | * Called when a pointer is pressed/touched within the element.
29 | *
30 | * @param pointer The new pointer. This pointer isn't included in this.currentPointers or
31 | * this.startPointers yet.
32 | * @param event The event related to this pointer.
33 | *
34 | * @returns Whether you want to track this pointer as it moves.
35 | */
36 | start?: StartCallback;
37 | /**
38 | * Called when pointers have moved.
39 | *
40 | * @param previousPointers The state of the pointers before this event. This contains the same
41 | * number of pointers, in the same order, as this.currentPointers and this.startPointers.
42 | * @param changedPointers The pointers that have changed since the last move callback.
43 | * @param event The event related to the pointer changes.
44 | */
45 | move?: MoveCallback;
46 | /**
47 | * Called when a pointer is released.
48 | *
49 | * @param pointer The final state of the pointer that ended. This pointer is now absent from
50 | * this.currentPointers and this.startPointers.
51 | * @param event The event related to this pointer.
52 | * @param cancelled Was the action cancelled? Actions are cancelled when the OS takes over pointer
53 | * events, for actions such as scrolling.
54 | */
55 | end?: EndCallback;
56 | /**
57 | * Avoid pointer events in favour of touch and mouse events?
58 | *
59 | * Even if the browser supports pointer events, you may want to force the browser to use
60 | * mouse/touch fallbacks, to work around bugs such as
61 | * https://bugs.webkit.org/show_bug.cgi?id=220196.
62 | */
63 | avoidPointerEvents?: boolean;
64 | /**
65 | * Use raw pointer updates? Pointer events are usually synchronised to requestAnimationFrame.
66 | * However, if you're targeting a desynchronised canvas, then faster 'raw' updates are better.
67 | *
68 | * This feature only applies to pointer events.
69 | */
70 | rawUpdates?: boolean;
71 | }
72 | /**
73 | * Track pointers across a particular element
74 | */
75 | export default class PointerTracker {
76 | private _element;
77 | /**
78 | * State of the tracked pointers when they were pressed/touched.
79 | */
80 | readonly startPointers: Pointer[];
81 | /**
82 | * Latest state of the tracked pointers. Contains the same number of pointers, and in the same
83 | * order as this.startPointers.
84 | */
85 | readonly currentPointers: Pointer[];
86 | private _startCallback;
87 | private _moveCallback;
88 | private _endCallback;
89 | private _rawUpdates;
90 | /**
91 | * Firefox has a bug where touch-based pointer events have a `buttons` of 0, when this shouldn't
92 | * happen. https://bugzilla.mozilla.org/show_bug.cgi?id=1729440
93 | *
94 | * Usually we treat `buttons === 0` as no-longer-pressed. This set allows us to exclude these
95 | * buggy Firefox events.
96 | */
97 | private _excludeFromButtonsCheck;
98 | /**
99 | * Track pointers across a particular element
100 | *
101 | * @param element Element to monitor.
102 | * @param options
103 | */
104 | constructor(_element: HTMLElement, { start, move, end, rawUpdates, avoidPointerEvents, }?: PointerTrackerOptions);
105 | /**
106 | * Remove all listeners.
107 | */
108 | stop(): void;
109 | /**
110 | * Call the start callback for this pointer, and track it if the user wants.
111 | *
112 | * @param pointer Pointer
113 | * @param event Related event
114 | * @returns Whether the pointer is being tracked.
115 | */
116 | private _triggerPointerStart;
117 | /**
118 | * Listener for mouse/pointer starts.
119 | *
120 | * @param event This will only be a MouseEvent if the browser doesn't support pointer events.
121 | */
122 | private _pointerStart;
123 | /**
124 | * Listener for touchstart.
125 | * Only used if the browser doesn't support pointer events.
126 | */
127 | private _touchStart;
128 | /**
129 | * Listener for pointer/mouse/touch move events.
130 | */
131 | private _move;
132 | /**
133 | * Call the end callback for this pointer.
134 | *
135 | * @param pointer Pointer
136 | * @param event Related event
137 | */
138 | private _triggerPointerEnd;
139 | /**
140 | * Listener for mouse/pointer ends.
141 | *
142 | * @param event This will only be a MouseEvent if the browser doesn't support pointer events.
143 | */
144 | private _pointerEnd;
145 | /**
146 | * Listener for touchend.
147 | * Only used if the browser doesn't support pointer events.
148 | */
149 | private _touchEnd;
150 | }
151 |
--------------------------------------------------------------------------------
/lib/index.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2020 Google Inc. All Rights Reserved.
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 | * http://www.apache.org/licenses/LICENSE-2.0
7 | * Unless required by applicable law or agreed to in writing, software
8 | * distributed under the License is distributed on an "AS IS" BASIS,
9 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 | * See the License for the specific language governing permissions and
11 | * limitations under the License.
12 | */
13 | const enum Buttons {
14 | None,
15 | LeftMouseOrTouchOrPenDown,
16 | }
17 |
18 | class Pointer {
19 | /** x offset from the top of the document */
20 | pageX: number;
21 | /** y offset from the top of the document */
22 | pageY: number;
23 | /** x offset from the top of the viewport */
24 | clientX: number;
25 | /** y offset from the top of the viewport */
26 | clientY: number;
27 | /** Unique ID for this pointer */
28 | id: number = -1;
29 | /** The platform object used to create this Pointer */
30 | nativePointer: Touch | PointerEvent | MouseEvent;
31 |
32 | constructor(nativePointer: Touch | PointerEvent | MouseEvent) {
33 | this.nativePointer = nativePointer;
34 | this.pageX = nativePointer.pageX;
35 | this.pageY = nativePointer.pageY;
36 | this.clientX = nativePointer.clientX;
37 | this.clientY = nativePointer.clientY;
38 |
39 | if (self.Touch && nativePointer instanceof Touch) {
40 | this.id = nativePointer.identifier;
41 | } else if (isPointerEvent(nativePointer)) {
42 | // is PointerEvent
43 | this.id = nativePointer.pointerId;
44 | }
45 | }
46 |
47 | /**
48 | * Returns an expanded set of Pointers for high-resolution inputs.
49 | */
50 | getCoalesced(): Pointer[] {
51 | if ('getCoalescedEvents' in this.nativePointer) {
52 | const events = this.nativePointer
53 | .getCoalescedEvents()
54 | .map((p) => new Pointer(p));
55 | // Firefox sometimes returns an empty list here. I'm not sure it's doing the right thing.
56 | // https://github.com/w3c/pointerevents/issues/409
57 | if (events.length > 0) return events;
58 | // Otherwise, Firefox falls through…
59 | }
60 | return [this];
61 | }
62 | }
63 |
64 | // Export the typing, but keep the class private.
65 | type PointerType = Pointer;
66 | export { PointerType as Pointer };
67 |
68 | const isPointerEvent = (event: any): event is PointerEvent =>
69 | 'pointerId' in event;
70 |
71 | const isTouchEvent = (event: any): event is TouchEvent =>
72 | 'changedTouches' in event;
73 |
74 | const noop = () => {};
75 |
76 | export type InputEvent = TouchEvent | PointerEvent | MouseEvent;
77 | type StartCallback = (pointer: Pointer, event: InputEvent) => boolean;
78 | type MoveCallback = (
79 | previousPointers: Pointer[],
80 | changedPointers: Pointer[],
81 | event: InputEvent,
82 | ) => void;
83 | type EndCallback = (
84 | pointer: Pointer,
85 | event: InputEvent,
86 | cancelled: boolean,
87 | ) => void;
88 |
89 | interface PointerTrackerOptions {
90 | /**
91 | * Called when a pointer is pressed/touched within the element.
92 | *
93 | * @param pointer The new pointer. This pointer isn't included in this.currentPointers or
94 | * this.startPointers yet.
95 | * @param event The event related to this pointer.
96 | *
97 | * @returns Whether you want to track this pointer as it moves.
98 | */
99 | start?: StartCallback;
100 | /**
101 | * Called when pointers have moved.
102 | *
103 | * @param previousPointers The state of the pointers before this event. This contains the same
104 | * number of pointers, in the same order, as this.currentPointers and this.startPointers.
105 | * @param changedPointers The pointers that have changed since the last move callback.
106 | * @param event The event related to the pointer changes.
107 | */
108 | move?: MoveCallback;
109 | /**
110 | * Called when a pointer is released.
111 | *
112 | * @param pointer The final state of the pointer that ended. This pointer is now absent from
113 | * this.currentPointers and this.startPointers.
114 | * @param event The event related to this pointer.
115 | * @param cancelled Was the action cancelled? Actions are cancelled when the OS takes over pointer
116 | * events, for actions such as scrolling.
117 | */
118 | end?: EndCallback;
119 | /**
120 | * Avoid pointer events in favour of touch and mouse events?
121 | *
122 | * Even if the browser supports pointer events, you may want to force the browser to use
123 | * mouse/touch fallbacks, to work around bugs such as
124 | * https://bugs.webkit.org/show_bug.cgi?id=220196.
125 | */
126 | avoidPointerEvents?: boolean;
127 | /**
128 | * Use raw pointer updates? Pointer events are usually synchronised to requestAnimationFrame.
129 | * However, if you're targeting a desynchronised canvas, then faster 'raw' updates are better.
130 | *
131 | * This feature only applies to pointer events.
132 | */
133 | rawUpdates?: boolean;
134 | }
135 |
136 | /**
137 | * Track pointers across a particular element
138 | */
139 | export default class PointerTracker {
140 | /**
141 | * State of the tracked pointers when they were pressed/touched.
142 | */
143 | readonly startPointers: Pointer[] = [];
144 | /**
145 | * Latest state of the tracked pointers. Contains the same number of pointers, and in the same
146 | * order as this.startPointers.
147 | */
148 | readonly currentPointers: Pointer[] = [];
149 |
150 | private _startCallback: StartCallback;
151 | private _moveCallback: MoveCallback;
152 | private _endCallback: EndCallback;
153 | private _rawUpdates: boolean;
154 |
155 | /**
156 | * Firefox has a bug where touch-based pointer events have a `buttons` of 0, when this shouldn't
157 | * happen. https://bugzilla.mozilla.org/show_bug.cgi?id=1729440
158 | *
159 | * Usually we treat `buttons === 0` as no-longer-pressed. This set allows us to exclude these
160 | * buggy Firefox events.
161 | */
162 | private _excludeFromButtonsCheck = new Set();
163 |
164 | /**
165 | * Track pointers across a particular element
166 | *
167 | * @param element Element to monitor.
168 | * @param options
169 | */
170 | constructor(
171 | private _element: HTMLElement,
172 | {
173 | start = () => true,
174 | move = noop,
175 | end = noop,
176 | rawUpdates = false,
177 | avoidPointerEvents = false,
178 | }: PointerTrackerOptions = {},
179 | ) {
180 | this._startCallback = start;
181 | this._moveCallback = move;
182 | this._endCallback = end;
183 | this._rawUpdates = rawUpdates && 'onpointerrawupdate' in window;
184 |
185 | // Add listeners
186 | if (self.PointerEvent && !avoidPointerEvents) {
187 | this._element.addEventListener('pointerdown', this._pointerStart);
188 | } else {
189 | this._element.addEventListener('mousedown', this._pointerStart);
190 | this._element.addEventListener('touchstart', this._touchStart);
191 | this._element.addEventListener('touchmove', this._move);
192 | this._element.addEventListener('touchend', this._touchEnd);
193 | this._element.addEventListener('touchcancel', this._touchEnd);
194 | }
195 | }
196 |
197 | /**
198 | * Remove all listeners.
199 | */
200 | stop() {
201 | this._element.removeEventListener('pointerdown', this._pointerStart);
202 | this._element.removeEventListener('mousedown', this._pointerStart);
203 | this._element.removeEventListener('touchstart', this._touchStart);
204 | this._element.removeEventListener('touchmove', this._move);
205 | this._element.removeEventListener('touchend', this._touchEnd);
206 | this._element.removeEventListener('touchcancel', this._touchEnd);
207 | this._element.removeEventListener(
208 | this._rawUpdates ? 'pointerrawupdate' : 'pointermove',
209 | this._move,
210 | );
211 | this._element.removeEventListener('pointerup', this._pointerEnd);
212 | this._element.removeEventListener('pointercancel', this._pointerEnd);
213 | window.removeEventListener('mousemove', this._move);
214 | window.removeEventListener('mouseup', this._pointerEnd);
215 | }
216 |
217 | /**
218 | * Call the start callback for this pointer, and track it if the user wants.
219 | *
220 | * @param pointer Pointer
221 | * @param event Related event
222 | * @returns Whether the pointer is being tracked.
223 | */
224 | private _triggerPointerStart(pointer: Pointer, event: InputEvent): boolean {
225 | if (!this._startCallback(pointer, event)) return false;
226 | this.currentPointers.push(pointer);
227 | this.startPointers.push(pointer);
228 | return true;
229 | }
230 |
231 | /**
232 | * Listener for mouse/pointer starts.
233 | *
234 | * @param event This will only be a MouseEvent if the browser doesn't support pointer events.
235 | */
236 | private _pointerStart = (event: PointerEvent | MouseEvent) => {
237 | if (isPointerEvent(event) && event.buttons === 0) {
238 | // This is the buggy Firefox case. See _excludeFromButtonsCheck.
239 | this._excludeFromButtonsCheck.add(event.pointerId);
240 | } else if (!(event.buttons & Buttons.LeftMouseOrTouchOrPenDown)) {
241 | return;
242 | }
243 | const pointer = new Pointer(event);
244 | // If we're already tracking this pointer, ignore this event.
245 | // This happens with mouse events when multiple buttons are pressed.
246 | if (this.currentPointers.some((p) => p.id === pointer.id)) return;
247 |
248 | if (!this._triggerPointerStart(pointer, event)) return;
249 |
250 | // Add listeners for additional events.
251 | // The listeners may already exist, but no harm in adding them again.
252 | if (isPointerEvent(event)) {
253 | const capturingElement =
254 | event.target && 'setPointerCapture' in event.target
255 | ? event.target
256 | : this._element;
257 |
258 | capturingElement.setPointerCapture(event.pointerId);
259 | this._element.addEventListener(
260 | this._rawUpdates ? 'pointerrawupdate' : 'pointermove',
261 | this._move,
262 | );
263 | this._element.addEventListener('pointerup', this._pointerEnd);
264 | this._element.addEventListener('pointercancel', this._pointerEnd);
265 | } else {
266 | // MouseEvent
267 | window.addEventListener('mousemove', this._move);
268 | window.addEventListener('mouseup', this._pointerEnd);
269 | }
270 | };
271 |
272 | /**
273 | * Listener for touchstart.
274 | * Only used if the browser doesn't support pointer events.
275 | */
276 | private _touchStart = (event: TouchEvent) => {
277 | for (const touch of Array.from(event.changedTouches)) {
278 | this._triggerPointerStart(new Pointer(touch), event);
279 | }
280 | };
281 |
282 | /**
283 | * Listener for pointer/mouse/touch move events.
284 | */
285 | private _move = (event: PointerEvent | MouseEvent | TouchEvent) => {
286 | if (
287 | !isTouchEvent(event) &&
288 | (!isPointerEvent(event) ||
289 | !this._excludeFromButtonsCheck.has(event.pointerId)) &&
290 | event.buttons === Buttons.None
291 | ) {
292 | // This happens in a number of buggy cases where the browser failed to deliver a pointerup
293 | // or pointercancel. If we see the pointer moving without any buttons down, synthesize an end.
294 | // https://github.com/w3c/pointerevents/issues/407
295 | // https://github.com/w3c/pointerevents/issues/408
296 | this._pointerEnd(event);
297 | return;
298 | }
299 | const previousPointers = this.currentPointers.slice();
300 | const changedPointers = isTouchEvent(event)
301 | ? Array.from(event.changedTouches).map((t) => new Pointer(t))
302 | : [new Pointer(event)];
303 | const trackedChangedPointers = [];
304 |
305 | for (const pointer of changedPointers) {
306 | const index = this.currentPointers.findIndex((p) => p.id === pointer.id);
307 | if (index === -1) continue; // Not a pointer we're tracking
308 | trackedChangedPointers.push(pointer);
309 | this.currentPointers[index] = pointer;
310 | }
311 |
312 | if (trackedChangedPointers.length === 0) return;
313 |
314 | this._moveCallback(previousPointers, trackedChangedPointers, event);
315 | };
316 |
317 | /**
318 | * Call the end callback for this pointer.
319 | *
320 | * @param pointer Pointer
321 | * @param event Related event
322 | */
323 | private _triggerPointerEnd = (
324 | pointer: Pointer,
325 | event: InputEvent,
326 | ): boolean => {
327 | // Main button still down?
328 | // With mouse events, you get a mouseup per mouse button, so the left button might still be down.
329 | if (
330 | !isTouchEvent(event) &&
331 | event.buttons & Buttons.LeftMouseOrTouchOrPenDown
332 | ) {
333 | return false;
334 | }
335 | const index = this.currentPointers.findIndex((p) => p.id === pointer.id);
336 | // Not a pointer we're interested in?
337 | if (index === -1) return false;
338 |
339 | this.currentPointers.splice(index, 1);
340 | this.startPointers.splice(index, 1);
341 | this._excludeFromButtonsCheck.delete(pointer.id);
342 |
343 | // The event.type might be a 'move' event due to workarounds for weird mouse behaviour.
344 | // See _move for details.
345 | const cancelled = !(
346 | event.type === 'mouseup' ||
347 | event.type === 'touchend' ||
348 | event.type === 'pointerup'
349 | );
350 |
351 | this._endCallback(pointer, event, cancelled);
352 | return true;
353 | };
354 |
355 | /**
356 | * Listener for mouse/pointer ends.
357 | *
358 | * @param event This will only be a MouseEvent if the browser doesn't support pointer events.
359 | */
360 | private _pointerEnd = (event: PointerEvent | MouseEvent) => {
361 | if (!this._triggerPointerEnd(new Pointer(event), event)) return;
362 |
363 | if (isPointerEvent(event)) {
364 | if (this.currentPointers.length) return;
365 | this._element.removeEventListener(
366 | this._rawUpdates ? 'pointerrawupdate' : 'pointermove',
367 | this._move,
368 | );
369 | this._element.removeEventListener('pointerup', this._pointerEnd);
370 | this._element.removeEventListener('pointercancel', this._pointerEnd);
371 | } else {
372 | // MouseEvent
373 | window.removeEventListener('mousemove', this._move);
374 | window.removeEventListener('mouseup', this._pointerEnd);
375 | }
376 | };
377 |
378 | /**
379 | * Listener for touchend.
380 | * Only used if the browser doesn't support pointer events.
381 | */
382 | private _touchEnd = (event: TouchEvent) => {
383 | for (const touch of Array.from(event.changedTouches)) {
384 | this._triggerPointerEnd(new Pointer(touch), event);
385 | }
386 | };
387 | }
388 |
--------------------------------------------------------------------------------
/lib/missing-types.d.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2020 Google Inc. All Rights Reserved.
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 | * http://www.apache.org/licenses/LICENSE-2.0
7 | * Unless required by applicable law or agreed to in writing, software
8 | * distributed under the License is distributed on an "AS IS" BASIS,
9 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 | * See the License for the specific language governing permissions and
11 | * limitations under the License.
12 | */
13 | // TypeScript, you make me sad.
14 | // https://github.com/Microsoft/TypeScript/issues/18756
15 | interface Window {
16 | PointerEvent: typeof PointerEvent;
17 | Touch: typeof Touch;
18 | }
19 |
20 | interface PointerEvent {
21 | getCoalescedEvents(): PointerEvent[];
22 | }
23 |
24 | interface HTMLElementEventMap {
25 | pointerrawupdate: PointerEvent;
26 | }
27 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "pointer-tracker",
3 | "version": "2.5.3",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "version": "2.5.3",
9 | "license": "Apache-2.0",
10 | "devDependencies": {
11 | "husky": "^7.0.2",
12 | "lint-staged": "^11.1.2",
13 | "prettier": "^2.3.2",
14 | "rollup": "^2.56.3",
15 | "rollup-plugin-terser": "^7.0.2",
16 | "rollup-plugin-typescript2": "^0.30.0",
17 | "typescript": "^4.3.5"
18 | }
19 | },
20 | "node_modules/@babel/code-frame": {
21 | "version": "7.10.4",
22 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
23 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
24 | "dev": true,
25 | "dependencies": {
26 | "@babel/highlight": "^7.10.4"
27 | }
28 | },
29 | "node_modules/@babel/helper-validator-identifier": {
30 | "version": "7.10.4",
31 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
32 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
33 | "dev": true
34 | },
35 | "node_modules/@babel/highlight": {
36 | "version": "7.10.4",
37 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
38 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
39 | "dev": true,
40 | "dependencies": {
41 | "@babel/helper-validator-identifier": "^7.10.4",
42 | "chalk": "^2.0.0",
43 | "js-tokens": "^4.0.0"
44 | }
45 | },
46 | "node_modules/@rollup/pluginutils": {
47 | "version": "4.1.1",
48 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz",
49 | "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==",
50 | "dev": true,
51 | "dependencies": {
52 | "estree-walker": "^2.0.1",
53 | "picomatch": "^2.2.2"
54 | },
55 | "engines": {
56 | "node": ">= 8.0.0"
57 | }
58 | },
59 | "node_modules/@types/node": {
60 | "version": "14.0.27",
61 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
62 | "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==",
63 | "dev": true
64 | },
65 | "node_modules/@types/parse-json": {
66 | "version": "4.0.0",
67 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
68 | "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
69 | "dev": true
70 | },
71 | "node_modules/aggregate-error": {
72 | "version": "3.1.0",
73 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
74 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
75 | "dev": true,
76 | "dependencies": {
77 | "clean-stack": "^2.0.0",
78 | "indent-string": "^4.0.0"
79 | },
80 | "engines": {
81 | "node": ">=8"
82 | }
83 | },
84 | "node_modules/ansi-colors": {
85 | "version": "4.1.1",
86 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
87 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
88 | "dev": true,
89 | "engines": {
90 | "node": ">=6"
91 | }
92 | },
93 | "node_modules/ansi-escapes": {
94 | "version": "4.3.2",
95 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
96 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
97 | "dev": true,
98 | "dependencies": {
99 | "type-fest": "^0.21.3"
100 | },
101 | "engines": {
102 | "node": ">=8"
103 | },
104 | "funding": {
105 | "url": "https://github.com/sponsors/sindresorhus"
106 | }
107 | },
108 | "node_modules/ansi-regex": {
109 | "version": "5.0.0",
110 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
111 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
112 | "dev": true,
113 | "engines": {
114 | "node": ">=8"
115 | }
116 | },
117 | "node_modules/ansi-styles": {
118 | "version": "4.3.0",
119 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
120 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
121 | "dev": true,
122 | "dependencies": {
123 | "color-convert": "^2.0.1"
124 | },
125 | "engines": {
126 | "node": ">=8"
127 | },
128 | "funding": {
129 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
130 | }
131 | },
132 | "node_modules/ansi-styles/node_modules/color-convert": {
133 | "version": "2.0.1",
134 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
135 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
136 | "dev": true,
137 | "dependencies": {
138 | "color-name": "~1.1.4"
139 | },
140 | "engines": {
141 | "node": ">=7.0.0"
142 | }
143 | },
144 | "node_modules/ansi-styles/node_modules/color-name": {
145 | "version": "1.1.4",
146 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
147 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
148 | "dev": true
149 | },
150 | "node_modules/astral-regex": {
151 | "version": "2.0.0",
152 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
153 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
154 | "dev": true,
155 | "engines": {
156 | "node": ">=8"
157 | }
158 | },
159 | "node_modules/braces": {
160 | "version": "3.0.2",
161 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
162 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
163 | "dev": true,
164 | "dependencies": {
165 | "fill-range": "^7.0.1"
166 | },
167 | "engines": {
168 | "node": ">=8"
169 | }
170 | },
171 | "node_modules/buffer-from": {
172 | "version": "1.1.1",
173 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
174 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
175 | "dev": true
176 | },
177 | "node_modules/callsites": {
178 | "version": "3.1.0",
179 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
180 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
181 | "dev": true,
182 | "engines": {
183 | "node": ">=6"
184 | }
185 | },
186 | "node_modules/chalk": {
187 | "version": "2.4.1",
188 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
189 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
190 | "dev": true,
191 | "dependencies": {
192 | "ansi-styles": "^3.2.1",
193 | "escape-string-regexp": "^1.0.5",
194 | "supports-color": "^5.3.0"
195 | },
196 | "engines": {
197 | "node": ">=4"
198 | }
199 | },
200 | "node_modules/chalk/node_modules/ansi-styles": {
201 | "version": "3.2.1",
202 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
203 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
204 | "dev": true,
205 | "dependencies": {
206 | "color-convert": "^1.9.0"
207 | },
208 | "engines": {
209 | "node": ">=4"
210 | }
211 | },
212 | "node_modules/chalk/node_modules/supports-color": {
213 | "version": "5.5.0",
214 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
215 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
216 | "dev": true,
217 | "dependencies": {
218 | "has-flag": "^3.0.0"
219 | },
220 | "engines": {
221 | "node": ">=4"
222 | }
223 | },
224 | "node_modules/clean-stack": {
225 | "version": "2.2.0",
226 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
227 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
228 | "dev": true,
229 | "engines": {
230 | "node": ">=6"
231 | }
232 | },
233 | "node_modules/cli-cursor": {
234 | "version": "3.1.0",
235 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
236 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
237 | "dev": true,
238 | "dependencies": {
239 | "restore-cursor": "^3.1.0"
240 | },
241 | "engines": {
242 | "node": ">=8"
243 | }
244 | },
245 | "node_modules/cli-truncate": {
246 | "version": "2.1.0",
247 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
248 | "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
249 | "dev": true,
250 | "dependencies": {
251 | "slice-ansi": "^3.0.0",
252 | "string-width": "^4.2.0"
253 | },
254 | "engines": {
255 | "node": ">=8"
256 | },
257 | "funding": {
258 | "url": "https://github.com/sponsors/sindresorhus"
259 | }
260 | },
261 | "node_modules/color-convert": {
262 | "version": "1.9.3",
263 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
264 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
265 | "dev": true,
266 | "dependencies": {
267 | "color-name": "1.1.3"
268 | }
269 | },
270 | "node_modules/color-name": {
271 | "version": "1.1.3",
272 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
273 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
274 | "dev": true
275 | },
276 | "node_modules/colorette": {
277 | "version": "1.3.0",
278 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz",
279 | "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==",
280 | "dev": true
281 | },
282 | "node_modules/commander": {
283 | "version": "7.2.0",
284 | "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
285 | "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
286 | "dev": true,
287 | "engines": {
288 | "node": ">= 10"
289 | }
290 | },
291 | "node_modules/commondir": {
292 | "version": "1.0.1",
293 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
294 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
295 | "dev": true
296 | },
297 | "node_modules/cosmiconfig": {
298 | "version": "7.0.1",
299 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
300 | "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
301 | "dev": true,
302 | "dependencies": {
303 | "@types/parse-json": "^4.0.0",
304 | "import-fresh": "^3.2.1",
305 | "parse-json": "^5.0.0",
306 | "path-type": "^4.0.0",
307 | "yaml": "^1.10.0"
308 | },
309 | "engines": {
310 | "node": ">=10"
311 | }
312 | },
313 | "node_modules/cross-spawn": {
314 | "version": "7.0.3",
315 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
316 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
317 | "dev": true,
318 | "dependencies": {
319 | "path-key": "^3.1.0",
320 | "shebang-command": "^2.0.0",
321 | "which": "^2.0.1"
322 | },
323 | "engines": {
324 | "node": ">= 8"
325 | }
326 | },
327 | "node_modules/debug": {
328 | "version": "4.3.2",
329 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
330 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
331 | "dev": true,
332 | "dependencies": {
333 | "ms": "2.1.2"
334 | },
335 | "engines": {
336 | "node": ">=6.0"
337 | },
338 | "peerDependenciesMeta": {
339 | "supports-color": {
340 | "optional": true
341 | }
342 | }
343 | },
344 | "node_modules/emoji-regex": {
345 | "version": "8.0.0",
346 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
347 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
348 | "dev": true
349 | },
350 | "node_modules/enquirer": {
351 | "version": "2.3.6",
352 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
353 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
354 | "dev": true,
355 | "dependencies": {
356 | "ansi-colors": "^4.1.1"
357 | },
358 | "engines": {
359 | "node": ">=8.6"
360 | }
361 | },
362 | "node_modules/error-ex": {
363 | "version": "1.3.2",
364 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
365 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
366 | "dev": true,
367 | "dependencies": {
368 | "is-arrayish": "^0.2.1"
369 | }
370 | },
371 | "node_modules/escape-string-regexp": {
372 | "version": "1.0.5",
373 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
374 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
375 | "dev": true,
376 | "engines": {
377 | "node": ">=0.8.0"
378 | }
379 | },
380 | "node_modules/estree-walker": {
381 | "version": "2.0.2",
382 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
383 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
384 | "dev": true
385 | },
386 | "node_modules/execa": {
387 | "version": "5.1.1",
388 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
389 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
390 | "dev": true,
391 | "dependencies": {
392 | "cross-spawn": "^7.0.3",
393 | "get-stream": "^6.0.0",
394 | "human-signals": "^2.1.0",
395 | "is-stream": "^2.0.0",
396 | "merge-stream": "^2.0.0",
397 | "npm-run-path": "^4.0.1",
398 | "onetime": "^5.1.2",
399 | "signal-exit": "^3.0.3",
400 | "strip-final-newline": "^2.0.0"
401 | },
402 | "engines": {
403 | "node": ">=10"
404 | },
405 | "funding": {
406 | "url": "https://github.com/sindresorhus/execa?sponsor=1"
407 | }
408 | },
409 | "node_modules/fill-range": {
410 | "version": "7.0.1",
411 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
412 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
413 | "dev": true,
414 | "dependencies": {
415 | "to-regex-range": "^5.0.1"
416 | },
417 | "engines": {
418 | "node": ">=8"
419 | }
420 | },
421 | "node_modules/find-cache-dir": {
422 | "version": "3.3.1",
423 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
424 | "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
425 | "dev": true,
426 | "dependencies": {
427 | "commondir": "^1.0.1",
428 | "make-dir": "^3.0.2",
429 | "pkg-dir": "^4.1.0"
430 | },
431 | "engines": {
432 | "node": ">=8"
433 | },
434 | "funding": {
435 | "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
436 | }
437 | },
438 | "node_modules/find-up": {
439 | "version": "4.1.0",
440 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
441 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
442 | "dev": true,
443 | "dependencies": {
444 | "locate-path": "^5.0.0",
445 | "path-exists": "^4.0.0"
446 | },
447 | "engines": {
448 | "node": ">=8"
449 | }
450 | },
451 | "node_modules/fs-extra": {
452 | "version": "8.1.0",
453 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
454 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
455 | "dev": true,
456 | "dependencies": {
457 | "graceful-fs": "^4.2.0",
458 | "jsonfile": "^4.0.0",
459 | "universalify": "^0.1.0"
460 | },
461 | "engines": {
462 | "node": ">=6 <7 || >=8"
463 | }
464 | },
465 | "node_modules/fsevents": {
466 | "version": "2.3.2",
467 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
468 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
469 | "dev": true,
470 | "hasInstallScript": true,
471 | "optional": true,
472 | "os": [
473 | "darwin"
474 | ],
475 | "engines": {
476 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
477 | }
478 | },
479 | "node_modules/function-bind": {
480 | "version": "1.1.1",
481 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
482 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
483 | "dev": true
484 | },
485 | "node_modules/get-own-enumerable-property-symbols": {
486 | "version": "3.0.2",
487 | "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
488 | "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
489 | "dev": true
490 | },
491 | "node_modules/get-stream": {
492 | "version": "6.0.1",
493 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
494 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
495 | "dev": true,
496 | "engines": {
497 | "node": ">=10"
498 | },
499 | "funding": {
500 | "url": "https://github.com/sponsors/sindresorhus"
501 | }
502 | },
503 | "node_modules/graceful-fs": {
504 | "version": "4.2.4",
505 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
506 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
507 | "dev": true
508 | },
509 | "node_modules/has": {
510 | "version": "1.0.3",
511 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
512 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
513 | "dev": true,
514 | "dependencies": {
515 | "function-bind": "^1.1.1"
516 | },
517 | "engines": {
518 | "node": ">= 0.4.0"
519 | }
520 | },
521 | "node_modules/has-flag": {
522 | "version": "3.0.0",
523 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
524 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
525 | "dev": true,
526 | "engines": {
527 | "node": ">=4"
528 | }
529 | },
530 | "node_modules/human-signals": {
531 | "version": "2.1.0",
532 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
533 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
534 | "dev": true,
535 | "engines": {
536 | "node": ">=10.17.0"
537 | }
538 | },
539 | "node_modules/husky": {
540 | "version": "7.0.2",
541 | "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.2.tgz",
542 | "integrity": "sha512-8yKEWNX4z2YsofXAMT7KvA1g8p+GxtB1ffV8XtpAEGuXNAbCV5wdNKH+qTpw8SM9fh4aMPDR+yQuKfgnreyZlg==",
543 | "dev": true,
544 | "bin": {
545 | "husky": "lib/bin.js"
546 | },
547 | "engines": {
548 | "node": ">=12"
549 | },
550 | "funding": {
551 | "url": "https://github.com/sponsors/typicode"
552 | }
553 | },
554 | "node_modules/import-fresh": {
555 | "version": "3.3.0",
556 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
557 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
558 | "dev": true,
559 | "dependencies": {
560 | "parent-module": "^1.0.0",
561 | "resolve-from": "^4.0.0"
562 | },
563 | "engines": {
564 | "node": ">=6"
565 | },
566 | "funding": {
567 | "url": "https://github.com/sponsors/sindresorhus"
568 | }
569 | },
570 | "node_modules/indent-string": {
571 | "version": "4.0.0",
572 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
573 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
574 | "dev": true,
575 | "engines": {
576 | "node": ">=8"
577 | }
578 | },
579 | "node_modules/is-arrayish": {
580 | "version": "0.2.1",
581 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
582 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
583 | "dev": true
584 | },
585 | "node_modules/is-core-module": {
586 | "version": "2.6.0",
587 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz",
588 | "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==",
589 | "dev": true,
590 | "dependencies": {
591 | "has": "^1.0.3"
592 | },
593 | "funding": {
594 | "url": "https://github.com/sponsors/ljharb"
595 | }
596 | },
597 | "node_modules/is-fullwidth-code-point": {
598 | "version": "3.0.0",
599 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
600 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
601 | "dev": true,
602 | "engines": {
603 | "node": ">=8"
604 | }
605 | },
606 | "node_modules/is-number": {
607 | "version": "7.0.0",
608 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
609 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
610 | "dev": true,
611 | "engines": {
612 | "node": ">=0.12.0"
613 | }
614 | },
615 | "node_modules/is-obj": {
616 | "version": "1.0.1",
617 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
618 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
619 | "dev": true,
620 | "engines": {
621 | "node": ">=0.10.0"
622 | }
623 | },
624 | "node_modules/is-regexp": {
625 | "version": "1.0.0",
626 | "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
627 | "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
628 | "dev": true,
629 | "engines": {
630 | "node": ">=0.10.0"
631 | }
632 | },
633 | "node_modules/is-stream": {
634 | "version": "2.0.1",
635 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
636 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
637 | "dev": true,
638 | "engines": {
639 | "node": ">=8"
640 | },
641 | "funding": {
642 | "url": "https://github.com/sponsors/sindresorhus"
643 | }
644 | },
645 | "node_modules/is-unicode-supported": {
646 | "version": "0.1.0",
647 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
648 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
649 | "dev": true,
650 | "engines": {
651 | "node": ">=10"
652 | },
653 | "funding": {
654 | "url": "https://github.com/sponsors/sindresorhus"
655 | }
656 | },
657 | "node_modules/isexe": {
658 | "version": "2.0.0",
659 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
660 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
661 | "dev": true
662 | },
663 | "node_modules/jest-worker": {
664 | "version": "26.3.0",
665 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz",
666 | "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==",
667 | "dev": true,
668 | "dependencies": {
669 | "@types/node": "*",
670 | "merge-stream": "^2.0.0",
671 | "supports-color": "^7.0.0"
672 | },
673 | "engines": {
674 | "node": ">= 10.13.0"
675 | }
676 | },
677 | "node_modules/js-tokens": {
678 | "version": "4.0.0",
679 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
680 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
681 | "dev": true
682 | },
683 | "node_modules/json-parse-even-better-errors": {
684 | "version": "2.3.1",
685 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
686 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
687 | "dev": true
688 | },
689 | "node_modules/jsonfile": {
690 | "version": "4.0.0",
691 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
692 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
693 | "dev": true,
694 | "optionalDependencies": {
695 | "graceful-fs": "^4.1.6"
696 | }
697 | },
698 | "node_modules/lines-and-columns": {
699 | "version": "1.1.6",
700 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
701 | "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
702 | "dev": true
703 | },
704 | "node_modules/lint-staged": {
705 | "version": "11.1.2",
706 | "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.1.2.tgz",
707 | "integrity": "sha512-6lYpNoA9wGqkL6Hew/4n1H6lRqF3qCsujVT0Oq5Z4hiSAM7S6NksPJ3gnr7A7R52xCtiZMcEUNNQ6d6X5Bvh9w==",
708 | "dev": true,
709 | "dependencies": {
710 | "chalk": "^4.1.1",
711 | "cli-truncate": "^2.1.0",
712 | "commander": "^7.2.0",
713 | "cosmiconfig": "^7.0.0",
714 | "debug": "^4.3.1",
715 | "enquirer": "^2.3.6",
716 | "execa": "^5.0.0",
717 | "listr2": "^3.8.2",
718 | "log-symbols": "^4.1.0",
719 | "micromatch": "^4.0.4",
720 | "normalize-path": "^3.0.0",
721 | "please-upgrade-node": "^3.2.0",
722 | "string-argv": "0.3.1",
723 | "stringify-object": "^3.3.0"
724 | },
725 | "bin": {
726 | "lint-staged": "bin/lint-staged.js"
727 | },
728 | "funding": {
729 | "url": "https://opencollective.com/lint-staged"
730 | }
731 | },
732 | "node_modules/lint-staged/node_modules/chalk": {
733 | "version": "4.1.2",
734 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
735 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
736 | "dev": true,
737 | "dependencies": {
738 | "ansi-styles": "^4.1.0",
739 | "supports-color": "^7.1.0"
740 | },
741 | "engines": {
742 | "node": ">=10"
743 | },
744 | "funding": {
745 | "url": "https://github.com/chalk/chalk?sponsor=1"
746 | }
747 | },
748 | "node_modules/listr2": {
749 | "version": "3.11.0",
750 | "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.11.0.tgz",
751 | "integrity": "sha512-XLJVe2JgXCyQTa3FbSv11lkKExYmEyA4jltVo8z4FX10Vt1Yj8IMekBfwim0BSOM9uj1QMTJvDQQpHyuPbB/dQ==",
752 | "dev": true,
753 | "dependencies": {
754 | "cli-truncate": "^2.1.0",
755 | "colorette": "^1.2.2",
756 | "log-update": "^4.0.0",
757 | "p-map": "^4.0.0",
758 | "rxjs": "^6.6.7",
759 | "through": "^2.3.8",
760 | "wrap-ansi": "^7.0.0"
761 | },
762 | "engines": {
763 | "node": ">=10.0.0"
764 | },
765 | "peerDependencies": {
766 | "enquirer": ">= 2.3.0 < 3"
767 | }
768 | },
769 | "node_modules/locate-path": {
770 | "version": "5.0.0",
771 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
772 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
773 | "dev": true,
774 | "dependencies": {
775 | "p-locate": "^4.1.0"
776 | },
777 | "engines": {
778 | "node": ">=8"
779 | }
780 | },
781 | "node_modules/log-symbols": {
782 | "version": "4.1.0",
783 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
784 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
785 | "dev": true,
786 | "dependencies": {
787 | "chalk": "^4.1.0",
788 | "is-unicode-supported": "^0.1.0"
789 | },
790 | "engines": {
791 | "node": ">=10"
792 | },
793 | "funding": {
794 | "url": "https://github.com/sponsors/sindresorhus"
795 | }
796 | },
797 | "node_modules/log-symbols/node_modules/chalk": {
798 | "version": "4.1.2",
799 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
800 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
801 | "dev": true,
802 | "dependencies": {
803 | "ansi-styles": "^4.1.0",
804 | "supports-color": "^7.1.0"
805 | },
806 | "engines": {
807 | "node": ">=10"
808 | },
809 | "funding": {
810 | "url": "https://github.com/chalk/chalk?sponsor=1"
811 | }
812 | },
813 | "node_modules/log-update": {
814 | "version": "4.0.0",
815 | "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
816 | "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
817 | "dev": true,
818 | "dependencies": {
819 | "ansi-escapes": "^4.3.0",
820 | "cli-cursor": "^3.1.0",
821 | "slice-ansi": "^4.0.0",
822 | "wrap-ansi": "^6.2.0"
823 | },
824 | "engines": {
825 | "node": ">=10"
826 | },
827 | "funding": {
828 | "url": "https://github.com/sponsors/sindresorhus"
829 | }
830 | },
831 | "node_modules/log-update/node_modules/slice-ansi": {
832 | "version": "4.0.0",
833 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
834 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
835 | "dev": true,
836 | "dependencies": {
837 | "ansi-styles": "^4.0.0",
838 | "astral-regex": "^2.0.0",
839 | "is-fullwidth-code-point": "^3.0.0"
840 | },
841 | "engines": {
842 | "node": ">=10"
843 | },
844 | "funding": {
845 | "url": "https://github.com/chalk/slice-ansi?sponsor=1"
846 | }
847 | },
848 | "node_modules/log-update/node_modules/wrap-ansi": {
849 | "version": "6.2.0",
850 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
851 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
852 | "dev": true,
853 | "dependencies": {
854 | "ansi-styles": "^4.0.0",
855 | "string-width": "^4.1.0",
856 | "strip-ansi": "^6.0.0"
857 | },
858 | "engines": {
859 | "node": ">=8"
860 | }
861 | },
862 | "node_modules/make-dir": {
863 | "version": "3.1.0",
864 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
865 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
866 | "dev": true,
867 | "dependencies": {
868 | "semver": "^6.0.0"
869 | },
870 | "engines": {
871 | "node": ">=8"
872 | },
873 | "funding": {
874 | "url": "https://github.com/sponsors/sindresorhus"
875 | }
876 | },
877 | "node_modules/merge-stream": {
878 | "version": "2.0.0",
879 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
880 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
881 | "dev": true
882 | },
883 | "node_modules/micromatch": {
884 | "version": "4.0.4",
885 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
886 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
887 | "dev": true,
888 | "dependencies": {
889 | "braces": "^3.0.1",
890 | "picomatch": "^2.2.3"
891 | },
892 | "engines": {
893 | "node": ">=8.6"
894 | }
895 | },
896 | "node_modules/mimic-fn": {
897 | "version": "2.1.0",
898 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
899 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
900 | "dev": true,
901 | "engines": {
902 | "node": ">=6"
903 | }
904 | },
905 | "node_modules/ms": {
906 | "version": "2.1.2",
907 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
908 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
909 | "dev": true
910 | },
911 | "node_modules/normalize-path": {
912 | "version": "3.0.0",
913 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
914 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
915 | "dev": true,
916 | "engines": {
917 | "node": ">=0.10.0"
918 | }
919 | },
920 | "node_modules/npm-run-path": {
921 | "version": "4.0.1",
922 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
923 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
924 | "dev": true,
925 | "dependencies": {
926 | "path-key": "^3.0.0"
927 | },
928 | "engines": {
929 | "node": ">=8"
930 | }
931 | },
932 | "node_modules/onetime": {
933 | "version": "5.1.2",
934 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
935 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
936 | "dev": true,
937 | "dependencies": {
938 | "mimic-fn": "^2.1.0"
939 | },
940 | "engines": {
941 | "node": ">=6"
942 | },
943 | "funding": {
944 | "url": "https://github.com/sponsors/sindresorhus"
945 | }
946 | },
947 | "node_modules/p-limit": {
948 | "version": "2.3.0",
949 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
950 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
951 | "dev": true,
952 | "dependencies": {
953 | "p-try": "^2.0.0"
954 | },
955 | "engines": {
956 | "node": ">=6"
957 | },
958 | "funding": {
959 | "url": "https://github.com/sponsors/sindresorhus"
960 | }
961 | },
962 | "node_modules/p-locate": {
963 | "version": "4.1.0",
964 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
965 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
966 | "dev": true,
967 | "dependencies": {
968 | "p-limit": "^2.2.0"
969 | },
970 | "engines": {
971 | "node": ">=8"
972 | }
973 | },
974 | "node_modules/p-map": {
975 | "version": "4.0.0",
976 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
977 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
978 | "dev": true,
979 | "dependencies": {
980 | "aggregate-error": "^3.0.0"
981 | },
982 | "engines": {
983 | "node": ">=10"
984 | },
985 | "funding": {
986 | "url": "https://github.com/sponsors/sindresorhus"
987 | }
988 | },
989 | "node_modules/p-try": {
990 | "version": "2.2.0",
991 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
992 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
993 | "dev": true,
994 | "engines": {
995 | "node": ">=6"
996 | }
997 | },
998 | "node_modules/parent-module": {
999 | "version": "1.0.1",
1000 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1001 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1002 | "dev": true,
1003 | "dependencies": {
1004 | "callsites": "^3.0.0"
1005 | },
1006 | "engines": {
1007 | "node": ">=6"
1008 | }
1009 | },
1010 | "node_modules/parse-json": {
1011 | "version": "5.2.0",
1012 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
1013 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
1014 | "dev": true,
1015 | "dependencies": {
1016 | "@babel/code-frame": "^7.0.0",
1017 | "error-ex": "^1.3.1",
1018 | "json-parse-even-better-errors": "^2.3.0",
1019 | "lines-and-columns": "^1.1.6"
1020 | },
1021 | "engines": {
1022 | "node": ">=8"
1023 | },
1024 | "funding": {
1025 | "url": "https://github.com/sponsors/sindresorhus"
1026 | }
1027 | },
1028 | "node_modules/path-exists": {
1029 | "version": "4.0.0",
1030 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1031 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
1032 | "dev": true,
1033 | "engines": {
1034 | "node": ">=8"
1035 | }
1036 | },
1037 | "node_modules/path-key": {
1038 | "version": "3.1.1",
1039 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1040 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1041 | "dev": true,
1042 | "engines": {
1043 | "node": ">=8"
1044 | }
1045 | },
1046 | "node_modules/path-parse": {
1047 | "version": "1.0.7",
1048 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1049 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1050 | "dev": true
1051 | },
1052 | "node_modules/path-type": {
1053 | "version": "4.0.0",
1054 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
1055 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
1056 | "dev": true,
1057 | "engines": {
1058 | "node": ">=8"
1059 | }
1060 | },
1061 | "node_modules/picomatch": {
1062 | "version": "2.3.0",
1063 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
1064 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
1065 | "dev": true,
1066 | "engines": {
1067 | "node": ">=8.6"
1068 | },
1069 | "funding": {
1070 | "url": "https://github.com/sponsors/jonschlinkert"
1071 | }
1072 | },
1073 | "node_modules/pkg-dir": {
1074 | "version": "4.2.0",
1075 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
1076 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
1077 | "dev": true,
1078 | "dependencies": {
1079 | "find-up": "^4.0.0"
1080 | },
1081 | "engines": {
1082 | "node": ">=8"
1083 | }
1084 | },
1085 | "node_modules/please-upgrade-node": {
1086 | "version": "3.2.0",
1087 | "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
1088 | "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
1089 | "dev": true,
1090 | "dependencies": {
1091 | "semver-compare": "^1.0.0"
1092 | }
1093 | },
1094 | "node_modules/prettier": {
1095 | "version": "2.3.2",
1096 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz",
1097 | "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==",
1098 | "dev": true,
1099 | "bin": {
1100 | "prettier": "bin-prettier.js"
1101 | },
1102 | "engines": {
1103 | "node": ">=10.13.0"
1104 | }
1105 | },
1106 | "node_modules/randombytes": {
1107 | "version": "2.1.0",
1108 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
1109 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
1110 | "dev": true,
1111 | "dependencies": {
1112 | "safe-buffer": "^5.1.0"
1113 | }
1114 | },
1115 | "node_modules/resolve": {
1116 | "version": "1.20.0",
1117 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
1118 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
1119 | "dev": true,
1120 | "dependencies": {
1121 | "is-core-module": "^2.2.0",
1122 | "path-parse": "^1.0.6"
1123 | },
1124 | "funding": {
1125 | "url": "https://github.com/sponsors/ljharb"
1126 | }
1127 | },
1128 | "node_modules/resolve-from": {
1129 | "version": "4.0.0",
1130 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1131 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
1132 | "dev": true,
1133 | "engines": {
1134 | "node": ">=4"
1135 | }
1136 | },
1137 | "node_modules/restore-cursor": {
1138 | "version": "3.1.0",
1139 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
1140 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
1141 | "dev": true,
1142 | "dependencies": {
1143 | "onetime": "^5.1.0",
1144 | "signal-exit": "^3.0.2"
1145 | },
1146 | "engines": {
1147 | "node": ">=8"
1148 | }
1149 | },
1150 | "node_modules/rollup": {
1151 | "version": "2.56.3",
1152 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.56.3.tgz",
1153 | "integrity": "sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg==",
1154 | "dev": true,
1155 | "bin": {
1156 | "rollup": "dist/bin/rollup"
1157 | },
1158 | "engines": {
1159 | "node": ">=10.0.0"
1160 | },
1161 | "optionalDependencies": {
1162 | "fsevents": "~2.3.2"
1163 | }
1164 | },
1165 | "node_modules/rollup-plugin-terser": {
1166 | "version": "7.0.2",
1167 | "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
1168 | "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
1169 | "dev": true,
1170 | "dependencies": {
1171 | "@babel/code-frame": "^7.10.4",
1172 | "jest-worker": "^26.2.1",
1173 | "serialize-javascript": "^4.0.0",
1174 | "terser": "^5.0.0"
1175 | },
1176 | "peerDependencies": {
1177 | "rollup": "^2.0.0"
1178 | }
1179 | },
1180 | "node_modules/rollup-plugin-typescript2": {
1181 | "version": "0.30.0",
1182 | "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz",
1183 | "integrity": "sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==",
1184 | "dev": true,
1185 | "dependencies": {
1186 | "@rollup/pluginutils": "^4.1.0",
1187 | "find-cache-dir": "^3.3.1",
1188 | "fs-extra": "8.1.0",
1189 | "resolve": "1.20.0",
1190 | "tslib": "2.1.0"
1191 | },
1192 | "peerDependencies": {
1193 | "rollup": ">=1.26.3",
1194 | "typescript": ">=2.4.0"
1195 | }
1196 | },
1197 | "node_modules/rxjs": {
1198 | "version": "6.6.7",
1199 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
1200 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
1201 | "dev": true,
1202 | "dependencies": {
1203 | "tslib": "^1.9.0"
1204 | },
1205 | "engines": {
1206 | "npm": ">=2.0.0"
1207 | }
1208 | },
1209 | "node_modules/rxjs/node_modules/tslib": {
1210 | "version": "1.14.1",
1211 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
1212 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
1213 | "dev": true
1214 | },
1215 | "node_modules/safe-buffer": {
1216 | "version": "5.2.1",
1217 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1218 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1219 | "dev": true,
1220 | "funding": [
1221 | {
1222 | "type": "github",
1223 | "url": "https://github.com/sponsors/feross"
1224 | },
1225 | {
1226 | "type": "patreon",
1227 | "url": "https://www.patreon.com/feross"
1228 | },
1229 | {
1230 | "type": "consulting",
1231 | "url": "https://feross.org/support"
1232 | }
1233 | ]
1234 | },
1235 | "node_modules/semver": {
1236 | "version": "6.3.0",
1237 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1238 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1239 | "dev": true,
1240 | "bin": {
1241 | "semver": "bin/semver.js"
1242 | }
1243 | },
1244 | "node_modules/semver-compare": {
1245 | "version": "1.0.0",
1246 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
1247 | "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
1248 | "dev": true
1249 | },
1250 | "node_modules/serialize-javascript": {
1251 | "version": "4.0.0",
1252 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
1253 | "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
1254 | "dev": true,
1255 | "dependencies": {
1256 | "randombytes": "^2.1.0"
1257 | }
1258 | },
1259 | "node_modules/shebang-command": {
1260 | "version": "2.0.0",
1261 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1262 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1263 | "dev": true,
1264 | "dependencies": {
1265 | "shebang-regex": "^3.0.0"
1266 | },
1267 | "engines": {
1268 | "node": ">=8"
1269 | }
1270 | },
1271 | "node_modules/shebang-regex": {
1272 | "version": "3.0.0",
1273 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1274 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1275 | "dev": true,
1276 | "engines": {
1277 | "node": ">=8"
1278 | }
1279 | },
1280 | "node_modules/signal-exit": {
1281 | "version": "3.0.3",
1282 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
1283 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
1284 | "dev": true
1285 | },
1286 | "node_modules/slice-ansi": {
1287 | "version": "3.0.0",
1288 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
1289 | "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
1290 | "dev": true,
1291 | "dependencies": {
1292 | "ansi-styles": "^4.0.0",
1293 | "astral-regex": "^2.0.0",
1294 | "is-fullwidth-code-point": "^3.0.0"
1295 | },
1296 | "engines": {
1297 | "node": ">=8"
1298 | }
1299 | },
1300 | "node_modules/source-map": {
1301 | "version": "0.6.1",
1302 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1303 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1304 | "dev": true,
1305 | "engines": {
1306 | "node": ">=0.10.0"
1307 | }
1308 | },
1309 | "node_modules/source-map-support": {
1310 | "version": "0.5.19",
1311 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
1312 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
1313 | "dev": true,
1314 | "dependencies": {
1315 | "buffer-from": "^1.0.0",
1316 | "source-map": "^0.6.0"
1317 | }
1318 | },
1319 | "node_modules/string-argv": {
1320 | "version": "0.3.1",
1321 | "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
1322 | "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
1323 | "dev": true,
1324 | "engines": {
1325 | "node": ">=0.6.19"
1326 | }
1327 | },
1328 | "node_modules/string-width": {
1329 | "version": "4.2.2",
1330 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
1331 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
1332 | "dev": true,
1333 | "dependencies": {
1334 | "emoji-regex": "^8.0.0",
1335 | "is-fullwidth-code-point": "^3.0.0",
1336 | "strip-ansi": "^6.0.0"
1337 | },
1338 | "engines": {
1339 | "node": ">=8"
1340 | }
1341 | },
1342 | "node_modules/stringify-object": {
1343 | "version": "3.3.0",
1344 | "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
1345 | "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
1346 | "dev": true,
1347 | "dependencies": {
1348 | "get-own-enumerable-property-symbols": "^3.0.0",
1349 | "is-obj": "^1.0.1",
1350 | "is-regexp": "^1.0.0"
1351 | },
1352 | "engines": {
1353 | "node": ">=4"
1354 | }
1355 | },
1356 | "node_modules/strip-ansi": {
1357 | "version": "6.0.0",
1358 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
1359 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
1360 | "dev": true,
1361 | "dependencies": {
1362 | "ansi-regex": "^5.0.0"
1363 | },
1364 | "engines": {
1365 | "node": ">=8"
1366 | }
1367 | },
1368 | "node_modules/strip-final-newline": {
1369 | "version": "2.0.0",
1370 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
1371 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
1372 | "dev": true,
1373 | "engines": {
1374 | "node": ">=6"
1375 | }
1376 | },
1377 | "node_modules/supports-color": {
1378 | "version": "7.1.0",
1379 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
1380 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
1381 | "dev": true,
1382 | "dependencies": {
1383 | "has-flag": "^4.0.0"
1384 | },
1385 | "engines": {
1386 | "node": ">=8"
1387 | }
1388 | },
1389 | "node_modules/supports-color/node_modules/has-flag": {
1390 | "version": "4.0.0",
1391 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1392 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1393 | "dev": true,
1394 | "engines": {
1395 | "node": ">=8"
1396 | }
1397 | },
1398 | "node_modules/terser": {
1399 | "version": "5.0.0",
1400 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.0.0.tgz",
1401 | "integrity": "sha512-olH2DwGINoSuEpSGd+BsPuAQaA3OrHnHnFL/rDB2TVNc3srUbz/rq/j2BlF4zDXI+JqAvGr86bIm1R2cJgZ3FA==",
1402 | "dev": true,
1403 | "dependencies": {
1404 | "commander": "^2.20.0",
1405 | "source-map": "~0.6.1",
1406 | "source-map-support": "~0.5.12"
1407 | },
1408 | "bin": {
1409 | "terser": "bin/terser"
1410 | },
1411 | "engines": {
1412 | "node": ">=6.0.0"
1413 | }
1414 | },
1415 | "node_modules/terser/node_modules/commander": {
1416 | "version": "2.20.3",
1417 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
1418 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
1419 | "dev": true
1420 | },
1421 | "node_modules/through": {
1422 | "version": "2.3.8",
1423 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1424 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
1425 | "dev": true
1426 | },
1427 | "node_modules/to-regex-range": {
1428 | "version": "5.0.1",
1429 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1430 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1431 | "dev": true,
1432 | "dependencies": {
1433 | "is-number": "^7.0.0"
1434 | },
1435 | "engines": {
1436 | "node": ">=8.0"
1437 | }
1438 | },
1439 | "node_modules/tslib": {
1440 | "version": "2.1.0",
1441 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
1442 | "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
1443 | "dev": true
1444 | },
1445 | "node_modules/type-fest": {
1446 | "version": "0.21.3",
1447 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
1448 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
1449 | "dev": true,
1450 | "engines": {
1451 | "node": ">=10"
1452 | },
1453 | "funding": {
1454 | "url": "https://github.com/sponsors/sindresorhus"
1455 | }
1456 | },
1457 | "node_modules/typescript": {
1458 | "version": "4.3.5",
1459 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz",
1460 | "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==",
1461 | "dev": true,
1462 | "bin": {
1463 | "tsc": "bin/tsc",
1464 | "tsserver": "bin/tsserver"
1465 | },
1466 | "engines": {
1467 | "node": ">=4.2.0"
1468 | }
1469 | },
1470 | "node_modules/universalify": {
1471 | "version": "0.1.2",
1472 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
1473 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
1474 | "dev": true,
1475 | "engines": {
1476 | "node": ">= 4.0.0"
1477 | }
1478 | },
1479 | "node_modules/which": {
1480 | "version": "2.0.2",
1481 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1482 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1483 | "dev": true,
1484 | "dependencies": {
1485 | "isexe": "^2.0.0"
1486 | },
1487 | "bin": {
1488 | "node-which": "bin/node-which"
1489 | },
1490 | "engines": {
1491 | "node": ">= 8"
1492 | }
1493 | },
1494 | "node_modules/wrap-ansi": {
1495 | "version": "7.0.0",
1496 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1497 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1498 | "dev": true,
1499 | "dependencies": {
1500 | "ansi-styles": "^4.0.0",
1501 | "string-width": "^4.1.0",
1502 | "strip-ansi": "^6.0.0"
1503 | },
1504 | "engines": {
1505 | "node": ">=10"
1506 | },
1507 | "funding": {
1508 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1509 | }
1510 | },
1511 | "node_modules/yaml": {
1512 | "version": "1.10.2",
1513 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
1514 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
1515 | "dev": true,
1516 | "engines": {
1517 | "node": ">= 6"
1518 | }
1519 | }
1520 | },
1521 | "dependencies": {
1522 | "@babel/code-frame": {
1523 | "version": "7.10.4",
1524 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
1525 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
1526 | "dev": true,
1527 | "requires": {
1528 | "@babel/highlight": "^7.10.4"
1529 | }
1530 | },
1531 | "@babel/helper-validator-identifier": {
1532 | "version": "7.10.4",
1533 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
1534 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
1535 | "dev": true
1536 | },
1537 | "@babel/highlight": {
1538 | "version": "7.10.4",
1539 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
1540 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
1541 | "dev": true,
1542 | "requires": {
1543 | "@babel/helper-validator-identifier": "^7.10.4",
1544 | "chalk": "^2.0.0",
1545 | "js-tokens": "^4.0.0"
1546 | }
1547 | },
1548 | "@rollup/pluginutils": {
1549 | "version": "4.1.1",
1550 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz",
1551 | "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==",
1552 | "dev": true,
1553 | "requires": {
1554 | "estree-walker": "^2.0.1",
1555 | "picomatch": "^2.2.2"
1556 | }
1557 | },
1558 | "@types/node": {
1559 | "version": "14.0.27",
1560 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
1561 | "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==",
1562 | "dev": true
1563 | },
1564 | "@types/parse-json": {
1565 | "version": "4.0.0",
1566 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
1567 | "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
1568 | "dev": true
1569 | },
1570 | "aggregate-error": {
1571 | "version": "3.1.0",
1572 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
1573 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
1574 | "dev": true,
1575 | "requires": {
1576 | "clean-stack": "^2.0.0",
1577 | "indent-string": "^4.0.0"
1578 | }
1579 | },
1580 | "ansi-colors": {
1581 | "version": "4.1.1",
1582 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
1583 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
1584 | "dev": true
1585 | },
1586 | "ansi-escapes": {
1587 | "version": "4.3.2",
1588 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
1589 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
1590 | "dev": true,
1591 | "requires": {
1592 | "type-fest": "^0.21.3"
1593 | }
1594 | },
1595 | "ansi-regex": {
1596 | "version": "5.0.0",
1597 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
1598 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
1599 | "dev": true
1600 | },
1601 | "ansi-styles": {
1602 | "version": "4.3.0",
1603 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1604 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1605 | "dev": true,
1606 | "requires": {
1607 | "color-convert": "^2.0.1"
1608 | },
1609 | "dependencies": {
1610 | "color-convert": {
1611 | "version": "2.0.1",
1612 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1613 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1614 | "dev": true,
1615 | "requires": {
1616 | "color-name": "~1.1.4"
1617 | }
1618 | },
1619 | "color-name": {
1620 | "version": "1.1.4",
1621 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1622 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1623 | "dev": true
1624 | }
1625 | }
1626 | },
1627 | "astral-regex": {
1628 | "version": "2.0.0",
1629 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
1630 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
1631 | "dev": true
1632 | },
1633 | "braces": {
1634 | "version": "3.0.2",
1635 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
1636 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
1637 | "dev": true,
1638 | "requires": {
1639 | "fill-range": "^7.0.1"
1640 | }
1641 | },
1642 | "buffer-from": {
1643 | "version": "1.1.1",
1644 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
1645 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
1646 | "dev": true
1647 | },
1648 | "callsites": {
1649 | "version": "3.1.0",
1650 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
1651 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
1652 | "dev": true
1653 | },
1654 | "chalk": {
1655 | "version": "2.4.1",
1656 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
1657 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
1658 | "dev": true,
1659 | "requires": {
1660 | "ansi-styles": "^3.2.1",
1661 | "escape-string-regexp": "^1.0.5",
1662 | "supports-color": "^5.3.0"
1663 | },
1664 | "dependencies": {
1665 | "ansi-styles": {
1666 | "version": "3.2.1",
1667 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
1668 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
1669 | "dev": true,
1670 | "requires": {
1671 | "color-convert": "^1.9.0"
1672 | }
1673 | },
1674 | "supports-color": {
1675 | "version": "5.5.0",
1676 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1677 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1678 | "dev": true,
1679 | "requires": {
1680 | "has-flag": "^3.0.0"
1681 | }
1682 | }
1683 | }
1684 | },
1685 | "clean-stack": {
1686 | "version": "2.2.0",
1687 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
1688 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
1689 | "dev": true
1690 | },
1691 | "cli-cursor": {
1692 | "version": "3.1.0",
1693 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
1694 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
1695 | "dev": true,
1696 | "requires": {
1697 | "restore-cursor": "^3.1.0"
1698 | }
1699 | },
1700 | "cli-truncate": {
1701 | "version": "2.1.0",
1702 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
1703 | "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
1704 | "dev": true,
1705 | "requires": {
1706 | "slice-ansi": "^3.0.0",
1707 | "string-width": "^4.2.0"
1708 | }
1709 | },
1710 | "color-convert": {
1711 | "version": "1.9.3",
1712 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
1713 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
1714 | "dev": true,
1715 | "requires": {
1716 | "color-name": "1.1.3"
1717 | }
1718 | },
1719 | "color-name": {
1720 | "version": "1.1.3",
1721 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
1722 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
1723 | "dev": true
1724 | },
1725 | "colorette": {
1726 | "version": "1.3.0",
1727 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz",
1728 | "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==",
1729 | "dev": true
1730 | },
1731 | "commander": {
1732 | "version": "7.2.0",
1733 | "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
1734 | "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
1735 | "dev": true
1736 | },
1737 | "commondir": {
1738 | "version": "1.0.1",
1739 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
1740 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
1741 | "dev": true
1742 | },
1743 | "cosmiconfig": {
1744 | "version": "7.0.1",
1745 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
1746 | "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
1747 | "dev": true,
1748 | "requires": {
1749 | "@types/parse-json": "^4.0.0",
1750 | "import-fresh": "^3.2.1",
1751 | "parse-json": "^5.0.0",
1752 | "path-type": "^4.0.0",
1753 | "yaml": "^1.10.0"
1754 | }
1755 | },
1756 | "cross-spawn": {
1757 | "version": "7.0.3",
1758 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
1759 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
1760 | "dev": true,
1761 | "requires": {
1762 | "path-key": "^3.1.0",
1763 | "shebang-command": "^2.0.0",
1764 | "which": "^2.0.1"
1765 | }
1766 | },
1767 | "debug": {
1768 | "version": "4.3.2",
1769 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
1770 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
1771 | "dev": true,
1772 | "requires": {
1773 | "ms": "2.1.2"
1774 | }
1775 | },
1776 | "emoji-regex": {
1777 | "version": "8.0.0",
1778 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1779 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1780 | "dev": true
1781 | },
1782 | "enquirer": {
1783 | "version": "2.3.6",
1784 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
1785 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
1786 | "dev": true,
1787 | "requires": {
1788 | "ansi-colors": "^4.1.1"
1789 | }
1790 | },
1791 | "error-ex": {
1792 | "version": "1.3.2",
1793 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
1794 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
1795 | "dev": true,
1796 | "requires": {
1797 | "is-arrayish": "^0.2.1"
1798 | }
1799 | },
1800 | "escape-string-regexp": {
1801 | "version": "1.0.5",
1802 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1803 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
1804 | "dev": true
1805 | },
1806 | "estree-walker": {
1807 | "version": "2.0.2",
1808 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
1809 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
1810 | "dev": true
1811 | },
1812 | "execa": {
1813 | "version": "5.1.1",
1814 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
1815 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
1816 | "dev": true,
1817 | "requires": {
1818 | "cross-spawn": "^7.0.3",
1819 | "get-stream": "^6.0.0",
1820 | "human-signals": "^2.1.0",
1821 | "is-stream": "^2.0.0",
1822 | "merge-stream": "^2.0.0",
1823 | "npm-run-path": "^4.0.1",
1824 | "onetime": "^5.1.2",
1825 | "signal-exit": "^3.0.3",
1826 | "strip-final-newline": "^2.0.0"
1827 | }
1828 | },
1829 | "fill-range": {
1830 | "version": "7.0.1",
1831 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1832 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1833 | "dev": true,
1834 | "requires": {
1835 | "to-regex-range": "^5.0.1"
1836 | }
1837 | },
1838 | "find-cache-dir": {
1839 | "version": "3.3.1",
1840 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
1841 | "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
1842 | "dev": true,
1843 | "requires": {
1844 | "commondir": "^1.0.1",
1845 | "make-dir": "^3.0.2",
1846 | "pkg-dir": "^4.1.0"
1847 | }
1848 | },
1849 | "find-up": {
1850 | "version": "4.1.0",
1851 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
1852 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
1853 | "dev": true,
1854 | "requires": {
1855 | "locate-path": "^5.0.0",
1856 | "path-exists": "^4.0.0"
1857 | }
1858 | },
1859 | "fs-extra": {
1860 | "version": "8.1.0",
1861 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
1862 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
1863 | "dev": true,
1864 | "requires": {
1865 | "graceful-fs": "^4.2.0",
1866 | "jsonfile": "^4.0.0",
1867 | "universalify": "^0.1.0"
1868 | }
1869 | },
1870 | "fsevents": {
1871 | "version": "2.3.2",
1872 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1873 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1874 | "dev": true,
1875 | "optional": true
1876 | },
1877 | "function-bind": {
1878 | "version": "1.1.1",
1879 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1880 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1881 | "dev": true
1882 | },
1883 | "get-own-enumerable-property-symbols": {
1884 | "version": "3.0.2",
1885 | "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
1886 | "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
1887 | "dev": true
1888 | },
1889 | "get-stream": {
1890 | "version": "6.0.1",
1891 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
1892 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
1893 | "dev": true
1894 | },
1895 | "graceful-fs": {
1896 | "version": "4.2.4",
1897 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
1898 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
1899 | "dev": true
1900 | },
1901 | "has": {
1902 | "version": "1.0.3",
1903 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1904 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1905 | "dev": true,
1906 | "requires": {
1907 | "function-bind": "^1.1.1"
1908 | }
1909 | },
1910 | "has-flag": {
1911 | "version": "3.0.0",
1912 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1913 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1914 | "dev": true
1915 | },
1916 | "human-signals": {
1917 | "version": "2.1.0",
1918 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
1919 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
1920 | "dev": true
1921 | },
1922 | "husky": {
1923 | "version": "7.0.2",
1924 | "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.2.tgz",
1925 | "integrity": "sha512-8yKEWNX4z2YsofXAMT7KvA1g8p+GxtB1ffV8XtpAEGuXNAbCV5wdNKH+qTpw8SM9fh4aMPDR+yQuKfgnreyZlg==",
1926 | "dev": true
1927 | },
1928 | "import-fresh": {
1929 | "version": "3.3.0",
1930 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
1931 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
1932 | "dev": true,
1933 | "requires": {
1934 | "parent-module": "^1.0.0",
1935 | "resolve-from": "^4.0.0"
1936 | }
1937 | },
1938 | "indent-string": {
1939 | "version": "4.0.0",
1940 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
1941 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
1942 | "dev": true
1943 | },
1944 | "is-arrayish": {
1945 | "version": "0.2.1",
1946 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1947 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
1948 | "dev": true
1949 | },
1950 | "is-core-module": {
1951 | "version": "2.6.0",
1952 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz",
1953 | "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==",
1954 | "dev": true,
1955 | "requires": {
1956 | "has": "^1.0.3"
1957 | }
1958 | },
1959 | "is-fullwidth-code-point": {
1960 | "version": "3.0.0",
1961 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1962 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1963 | "dev": true
1964 | },
1965 | "is-number": {
1966 | "version": "7.0.0",
1967 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1968 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1969 | "dev": true
1970 | },
1971 | "is-obj": {
1972 | "version": "1.0.1",
1973 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
1974 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
1975 | "dev": true
1976 | },
1977 | "is-regexp": {
1978 | "version": "1.0.0",
1979 | "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
1980 | "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
1981 | "dev": true
1982 | },
1983 | "is-stream": {
1984 | "version": "2.0.1",
1985 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
1986 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
1987 | "dev": true
1988 | },
1989 | "is-unicode-supported": {
1990 | "version": "0.1.0",
1991 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
1992 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
1993 | "dev": true
1994 | },
1995 | "isexe": {
1996 | "version": "2.0.0",
1997 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1998 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1999 | "dev": true
2000 | },
2001 | "jest-worker": {
2002 | "version": "26.3.0",
2003 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz",
2004 | "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==",
2005 | "dev": true,
2006 | "requires": {
2007 | "@types/node": "*",
2008 | "merge-stream": "^2.0.0",
2009 | "supports-color": "^7.0.0"
2010 | }
2011 | },
2012 | "js-tokens": {
2013 | "version": "4.0.0",
2014 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
2015 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
2016 | "dev": true
2017 | },
2018 | "json-parse-even-better-errors": {
2019 | "version": "2.3.1",
2020 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
2021 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
2022 | "dev": true
2023 | },
2024 | "jsonfile": {
2025 | "version": "4.0.0",
2026 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
2027 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
2028 | "dev": true,
2029 | "requires": {
2030 | "graceful-fs": "^4.1.6"
2031 | }
2032 | },
2033 | "lines-and-columns": {
2034 | "version": "1.1.6",
2035 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
2036 | "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
2037 | "dev": true
2038 | },
2039 | "lint-staged": {
2040 | "version": "11.1.2",
2041 | "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.1.2.tgz",
2042 | "integrity": "sha512-6lYpNoA9wGqkL6Hew/4n1H6lRqF3qCsujVT0Oq5Z4hiSAM7S6NksPJ3gnr7A7R52xCtiZMcEUNNQ6d6X5Bvh9w==",
2043 | "dev": true,
2044 | "requires": {
2045 | "chalk": "^4.1.1",
2046 | "cli-truncate": "^2.1.0",
2047 | "commander": "^7.2.0",
2048 | "cosmiconfig": "^7.0.0",
2049 | "debug": "^4.3.1",
2050 | "enquirer": "^2.3.6",
2051 | "execa": "^5.0.0",
2052 | "listr2": "^3.8.2",
2053 | "log-symbols": "^4.1.0",
2054 | "micromatch": "^4.0.4",
2055 | "normalize-path": "^3.0.0",
2056 | "please-upgrade-node": "^3.2.0",
2057 | "string-argv": "0.3.1",
2058 | "stringify-object": "^3.3.0"
2059 | },
2060 | "dependencies": {
2061 | "chalk": {
2062 | "version": "4.1.2",
2063 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2064 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2065 | "dev": true,
2066 | "requires": {
2067 | "ansi-styles": "^4.1.0",
2068 | "supports-color": "^7.1.0"
2069 | }
2070 | }
2071 | }
2072 | },
2073 | "listr2": {
2074 | "version": "3.11.0",
2075 | "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.11.0.tgz",
2076 | "integrity": "sha512-XLJVe2JgXCyQTa3FbSv11lkKExYmEyA4jltVo8z4FX10Vt1Yj8IMekBfwim0BSOM9uj1QMTJvDQQpHyuPbB/dQ==",
2077 | "dev": true,
2078 | "requires": {
2079 | "cli-truncate": "^2.1.0",
2080 | "colorette": "^1.2.2",
2081 | "log-update": "^4.0.0",
2082 | "p-map": "^4.0.0",
2083 | "rxjs": "^6.6.7",
2084 | "through": "^2.3.8",
2085 | "wrap-ansi": "^7.0.0"
2086 | }
2087 | },
2088 | "locate-path": {
2089 | "version": "5.0.0",
2090 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
2091 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
2092 | "dev": true,
2093 | "requires": {
2094 | "p-locate": "^4.1.0"
2095 | }
2096 | },
2097 | "log-symbols": {
2098 | "version": "4.1.0",
2099 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
2100 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
2101 | "dev": true,
2102 | "requires": {
2103 | "chalk": "^4.1.0",
2104 | "is-unicode-supported": "^0.1.0"
2105 | },
2106 | "dependencies": {
2107 | "chalk": {
2108 | "version": "4.1.2",
2109 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2110 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2111 | "dev": true,
2112 | "requires": {
2113 | "ansi-styles": "^4.1.0",
2114 | "supports-color": "^7.1.0"
2115 | }
2116 | }
2117 | }
2118 | },
2119 | "log-update": {
2120 | "version": "4.0.0",
2121 | "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
2122 | "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
2123 | "dev": true,
2124 | "requires": {
2125 | "ansi-escapes": "^4.3.0",
2126 | "cli-cursor": "^3.1.0",
2127 | "slice-ansi": "^4.0.0",
2128 | "wrap-ansi": "^6.2.0"
2129 | },
2130 | "dependencies": {
2131 | "slice-ansi": {
2132 | "version": "4.0.0",
2133 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
2134 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
2135 | "dev": true,
2136 | "requires": {
2137 | "ansi-styles": "^4.0.0",
2138 | "astral-regex": "^2.0.0",
2139 | "is-fullwidth-code-point": "^3.0.0"
2140 | }
2141 | },
2142 | "wrap-ansi": {
2143 | "version": "6.2.0",
2144 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
2145 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
2146 | "dev": true,
2147 | "requires": {
2148 | "ansi-styles": "^4.0.0",
2149 | "string-width": "^4.1.0",
2150 | "strip-ansi": "^6.0.0"
2151 | }
2152 | }
2153 | }
2154 | },
2155 | "make-dir": {
2156 | "version": "3.1.0",
2157 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
2158 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
2159 | "dev": true,
2160 | "requires": {
2161 | "semver": "^6.0.0"
2162 | }
2163 | },
2164 | "merge-stream": {
2165 | "version": "2.0.0",
2166 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
2167 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
2168 | "dev": true
2169 | },
2170 | "micromatch": {
2171 | "version": "4.0.4",
2172 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
2173 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
2174 | "dev": true,
2175 | "requires": {
2176 | "braces": "^3.0.1",
2177 | "picomatch": "^2.2.3"
2178 | }
2179 | },
2180 | "mimic-fn": {
2181 | "version": "2.1.0",
2182 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
2183 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
2184 | "dev": true
2185 | },
2186 | "ms": {
2187 | "version": "2.1.2",
2188 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
2189 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
2190 | "dev": true
2191 | },
2192 | "normalize-path": {
2193 | "version": "3.0.0",
2194 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2195 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
2196 | "dev": true
2197 | },
2198 | "npm-run-path": {
2199 | "version": "4.0.1",
2200 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
2201 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
2202 | "dev": true,
2203 | "requires": {
2204 | "path-key": "^3.0.0"
2205 | }
2206 | },
2207 | "onetime": {
2208 | "version": "5.1.2",
2209 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
2210 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
2211 | "dev": true,
2212 | "requires": {
2213 | "mimic-fn": "^2.1.0"
2214 | }
2215 | },
2216 | "p-limit": {
2217 | "version": "2.3.0",
2218 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
2219 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
2220 | "dev": true,
2221 | "requires": {
2222 | "p-try": "^2.0.0"
2223 | }
2224 | },
2225 | "p-locate": {
2226 | "version": "4.1.0",
2227 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
2228 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
2229 | "dev": true,
2230 | "requires": {
2231 | "p-limit": "^2.2.0"
2232 | }
2233 | },
2234 | "p-map": {
2235 | "version": "4.0.0",
2236 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
2237 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
2238 | "dev": true,
2239 | "requires": {
2240 | "aggregate-error": "^3.0.0"
2241 | }
2242 | },
2243 | "p-try": {
2244 | "version": "2.2.0",
2245 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
2246 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
2247 | "dev": true
2248 | },
2249 | "parent-module": {
2250 | "version": "1.0.1",
2251 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2252 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2253 | "dev": true,
2254 | "requires": {
2255 | "callsites": "^3.0.0"
2256 | }
2257 | },
2258 | "parse-json": {
2259 | "version": "5.2.0",
2260 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
2261 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
2262 | "dev": true,
2263 | "requires": {
2264 | "@babel/code-frame": "^7.0.0",
2265 | "error-ex": "^1.3.1",
2266 | "json-parse-even-better-errors": "^2.3.0",
2267 | "lines-and-columns": "^1.1.6"
2268 | }
2269 | },
2270 | "path-exists": {
2271 | "version": "4.0.0",
2272 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2273 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
2274 | "dev": true
2275 | },
2276 | "path-key": {
2277 | "version": "3.1.1",
2278 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2279 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2280 | "dev": true
2281 | },
2282 | "path-parse": {
2283 | "version": "1.0.7",
2284 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
2285 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
2286 | "dev": true
2287 | },
2288 | "path-type": {
2289 | "version": "4.0.0",
2290 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
2291 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
2292 | "dev": true
2293 | },
2294 | "picomatch": {
2295 | "version": "2.3.0",
2296 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
2297 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
2298 | "dev": true
2299 | },
2300 | "pkg-dir": {
2301 | "version": "4.2.0",
2302 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
2303 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
2304 | "dev": true,
2305 | "requires": {
2306 | "find-up": "^4.0.0"
2307 | }
2308 | },
2309 | "please-upgrade-node": {
2310 | "version": "3.2.0",
2311 | "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
2312 | "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
2313 | "dev": true,
2314 | "requires": {
2315 | "semver-compare": "^1.0.0"
2316 | }
2317 | },
2318 | "prettier": {
2319 | "version": "2.3.2",
2320 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz",
2321 | "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==",
2322 | "dev": true
2323 | },
2324 | "randombytes": {
2325 | "version": "2.1.0",
2326 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
2327 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
2328 | "dev": true,
2329 | "requires": {
2330 | "safe-buffer": "^5.1.0"
2331 | }
2332 | },
2333 | "resolve": {
2334 | "version": "1.20.0",
2335 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
2336 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
2337 | "dev": true,
2338 | "requires": {
2339 | "is-core-module": "^2.2.0",
2340 | "path-parse": "^1.0.6"
2341 | }
2342 | },
2343 | "resolve-from": {
2344 | "version": "4.0.0",
2345 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2346 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2347 | "dev": true
2348 | },
2349 | "restore-cursor": {
2350 | "version": "3.1.0",
2351 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
2352 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
2353 | "dev": true,
2354 | "requires": {
2355 | "onetime": "^5.1.0",
2356 | "signal-exit": "^3.0.2"
2357 | }
2358 | },
2359 | "rollup": {
2360 | "version": "2.56.3",
2361 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.56.3.tgz",
2362 | "integrity": "sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg==",
2363 | "dev": true,
2364 | "requires": {
2365 | "fsevents": "~2.3.2"
2366 | }
2367 | },
2368 | "rollup-plugin-terser": {
2369 | "version": "7.0.2",
2370 | "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
2371 | "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
2372 | "dev": true,
2373 | "requires": {
2374 | "@babel/code-frame": "^7.10.4",
2375 | "jest-worker": "^26.2.1",
2376 | "serialize-javascript": "^4.0.0",
2377 | "terser": "^5.0.0"
2378 | }
2379 | },
2380 | "rollup-plugin-typescript2": {
2381 | "version": "0.30.0",
2382 | "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz",
2383 | "integrity": "sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==",
2384 | "dev": true,
2385 | "requires": {
2386 | "@rollup/pluginutils": "^4.1.0",
2387 | "find-cache-dir": "^3.3.1",
2388 | "fs-extra": "8.1.0",
2389 | "resolve": "1.20.0",
2390 | "tslib": "2.1.0"
2391 | }
2392 | },
2393 | "rxjs": {
2394 | "version": "6.6.7",
2395 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
2396 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
2397 | "dev": true,
2398 | "requires": {
2399 | "tslib": "^1.9.0"
2400 | },
2401 | "dependencies": {
2402 | "tslib": {
2403 | "version": "1.14.1",
2404 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
2405 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
2406 | "dev": true
2407 | }
2408 | }
2409 | },
2410 | "safe-buffer": {
2411 | "version": "5.2.1",
2412 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
2413 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
2414 | "dev": true
2415 | },
2416 | "semver": {
2417 | "version": "6.3.0",
2418 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
2419 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
2420 | "dev": true
2421 | },
2422 | "semver-compare": {
2423 | "version": "1.0.0",
2424 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
2425 | "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
2426 | "dev": true
2427 | },
2428 | "serialize-javascript": {
2429 | "version": "4.0.0",
2430 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
2431 | "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
2432 | "dev": true,
2433 | "requires": {
2434 | "randombytes": "^2.1.0"
2435 | }
2436 | },
2437 | "shebang-command": {
2438 | "version": "2.0.0",
2439 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2440 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2441 | "dev": true,
2442 | "requires": {
2443 | "shebang-regex": "^3.0.0"
2444 | }
2445 | },
2446 | "shebang-regex": {
2447 | "version": "3.0.0",
2448 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2449 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2450 | "dev": true
2451 | },
2452 | "signal-exit": {
2453 | "version": "3.0.3",
2454 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
2455 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
2456 | "dev": true
2457 | },
2458 | "slice-ansi": {
2459 | "version": "3.0.0",
2460 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
2461 | "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
2462 | "dev": true,
2463 | "requires": {
2464 | "ansi-styles": "^4.0.0",
2465 | "astral-regex": "^2.0.0",
2466 | "is-fullwidth-code-point": "^3.0.0"
2467 | }
2468 | },
2469 | "source-map": {
2470 | "version": "0.6.1",
2471 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2472 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2473 | "dev": true
2474 | },
2475 | "source-map-support": {
2476 | "version": "0.5.19",
2477 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
2478 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
2479 | "dev": true,
2480 | "requires": {
2481 | "buffer-from": "^1.0.0",
2482 | "source-map": "^0.6.0"
2483 | }
2484 | },
2485 | "string-argv": {
2486 | "version": "0.3.1",
2487 | "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
2488 | "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
2489 | "dev": true
2490 | },
2491 | "string-width": {
2492 | "version": "4.2.2",
2493 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
2494 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
2495 | "dev": true,
2496 | "requires": {
2497 | "emoji-regex": "^8.0.0",
2498 | "is-fullwidth-code-point": "^3.0.0",
2499 | "strip-ansi": "^6.0.0"
2500 | }
2501 | },
2502 | "stringify-object": {
2503 | "version": "3.3.0",
2504 | "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
2505 | "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
2506 | "dev": true,
2507 | "requires": {
2508 | "get-own-enumerable-property-symbols": "^3.0.0",
2509 | "is-obj": "^1.0.1",
2510 | "is-regexp": "^1.0.0"
2511 | }
2512 | },
2513 | "strip-ansi": {
2514 | "version": "6.0.0",
2515 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
2516 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
2517 | "dev": true,
2518 | "requires": {
2519 | "ansi-regex": "^5.0.0"
2520 | }
2521 | },
2522 | "strip-final-newline": {
2523 | "version": "2.0.0",
2524 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
2525 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
2526 | "dev": true
2527 | },
2528 | "supports-color": {
2529 | "version": "7.1.0",
2530 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
2531 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
2532 | "dev": true,
2533 | "requires": {
2534 | "has-flag": "^4.0.0"
2535 | },
2536 | "dependencies": {
2537 | "has-flag": {
2538 | "version": "4.0.0",
2539 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2540 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2541 | "dev": true
2542 | }
2543 | }
2544 | },
2545 | "terser": {
2546 | "version": "5.0.0",
2547 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.0.0.tgz",
2548 | "integrity": "sha512-olH2DwGINoSuEpSGd+BsPuAQaA3OrHnHnFL/rDB2TVNc3srUbz/rq/j2BlF4zDXI+JqAvGr86bIm1R2cJgZ3FA==",
2549 | "dev": true,
2550 | "requires": {
2551 | "commander": "^2.20.0",
2552 | "source-map": "~0.6.1",
2553 | "source-map-support": "~0.5.12"
2554 | },
2555 | "dependencies": {
2556 | "commander": {
2557 | "version": "2.20.3",
2558 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
2559 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
2560 | "dev": true
2561 | }
2562 | }
2563 | },
2564 | "through": {
2565 | "version": "2.3.8",
2566 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
2567 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
2568 | "dev": true
2569 | },
2570 | "to-regex-range": {
2571 | "version": "5.0.1",
2572 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2573 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2574 | "dev": true,
2575 | "requires": {
2576 | "is-number": "^7.0.0"
2577 | }
2578 | },
2579 | "tslib": {
2580 | "version": "2.1.0",
2581 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
2582 | "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
2583 | "dev": true
2584 | },
2585 | "type-fest": {
2586 | "version": "0.21.3",
2587 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
2588 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
2589 | "dev": true
2590 | },
2591 | "typescript": {
2592 | "version": "4.3.5",
2593 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz",
2594 | "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==",
2595 | "dev": true
2596 | },
2597 | "universalify": {
2598 | "version": "0.1.2",
2599 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
2600 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
2601 | "dev": true
2602 | },
2603 | "which": {
2604 | "version": "2.0.2",
2605 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2606 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2607 | "dev": true,
2608 | "requires": {
2609 | "isexe": "^2.0.0"
2610 | }
2611 | },
2612 | "wrap-ansi": {
2613 | "version": "7.0.0",
2614 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
2615 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
2616 | "dev": true,
2617 | "requires": {
2618 | "ansi-styles": "^4.0.0",
2619 | "string-width": "^4.1.0",
2620 | "strip-ansi": "^6.0.0"
2621 | }
2622 | },
2623 | "yaml": {
2624 | "version": "1.10.2",
2625 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
2626 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
2627 | "dev": true
2628 | }
2629 | }
2630 | }
2631 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "pointer-tracker",
3 | "version": "2.5.3",
4 | "description": "Track mouse/touch/pointer events through one interface",
5 | "main": "dist/PointerTracker.js",
6 | "module": "dist/PointerTracker.mjs",
7 | "types": "dist/index.d.ts",
8 | "exports": {
9 | ".": {
10 | "require": "./dist/PointerTracker.js",
11 | "import": "./dist/PointerTracker.mjs"
12 | },
13 | "./dist/*": "./dist/*",
14 | "./package.json": "./package.json"
15 | },
16 | "scripts": {
17 | "build": "rm -rf dist && rollup -c"
18 | },
19 | "repository": {
20 | "type": "git",
21 | "url": "git+https://github.com/GoogleChromeLabs/pointer-tracker.git"
22 | },
23 | "keywords": [
24 | "pointer",
25 | "touch",
26 | "mouse",
27 | "event"
28 | ],
29 | "author": "Jake Archibald",
30 | "license": "Apache-2.0",
31 | "bugs": {
32 | "url": "https://github.com/GoogleChromeLabs/pointer-tracker/issues"
33 | },
34 | "homepage": "https://github.com/GoogleChromeLabs/pointer-tracker#readme",
35 | "devDependencies": {
36 | "husky": "^7.0.2",
37 | "lint-staged": "^11.1.2",
38 | "prettier": "^2.3.2",
39 | "rollup": "^2.56.3",
40 | "rollup-plugin-terser": "^7.0.2",
41 | "rollup-plugin-typescript2": "^0.30.0",
42 | "typescript": "^4.3.5"
43 | },
44 | "dependencies": {},
45 | "husky": {
46 | "hooks": {
47 | "pre-commit": "lint-staged"
48 | }
49 | },
50 | "lint-staged": {
51 | "*.{js,css,md,ts}": "prettier --write"
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2020 Google Inc. All Rights Reserved.
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 | * http://www.apache.org/licenses/LICENSE-2.0
7 | * Unless required by applicable law or agreed to in writing, software
8 | * distributed under the License is distributed on an "AS IS" BASIS,
9 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 | * See the License for the specific language governing permissions and
11 | * limitations under the License.
12 | */
13 | import typescript from 'rollup-plugin-typescript2';
14 | import { terser } from 'rollup-plugin-terser';
15 |
16 | const esm = {
17 | plugins: [typescript({ useTsconfigDeclarationDir: false })],
18 | input: 'lib/index.ts',
19 | output: {
20 | file: 'dist/PointerTracker.mjs',
21 | format: 'esm',
22 | },
23 | };
24 |
25 | const umd = {
26 | input: 'dist/PointerTracker.mjs',
27 | output: [
28 | {
29 | file: 'dist/PointerTracker.js',
30 | format: 'umd',
31 | name: 'PointerTracker',
32 | },
33 | {
34 | plugins: [
35 | terser({
36 | compress: { ecma: 6 },
37 | }),
38 | ],
39 | file: 'dist/PointerTracker-min.js',
40 | format: 'umd',
41 | name: 'PointerTracker',
42 | },
43 | ],
44 | };
45 |
46 | export default [esm, umd];
47 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compileOnSave": false,
3 | "compilerOptions": {
4 | "strict": true,
5 | "target": "es2017",
6 | "module": "esnext",
7 | "moduleResolution": "node",
8 | "noUnusedLocals": true,
9 | "sourceMap": true,
10 | "declaration": true,
11 | "allowJs": false,
12 | "baseUrl": "."
13 | },
14 | }
15 |
--------------------------------------------------------------------------------